ETH Price: $2,959.87 (-1.02%)
Gas: 8 Gwei

Token

Ad Infinitum (a9i8)
 

Overview

Max Total Supply

1,000,000,000 a9i8

Holders

73

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
17,480,615.691464072210068284 a9i8

Value
$0.00
0x29B88eE1B8592E26B3876aA0546dfA6e7754DA30
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:
AdInfinitum

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.17;

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

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

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

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

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

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

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

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

interface IUniswapV2Router02 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract AdInfinitum is Context, ERC20, Ownable {
    using SafeMath for uint256;
    IUniswapV2Router02 private _uniswapV2Router;
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedMaxTransactionAmount;
    mapping (address => bool) private _isBlacklisted;
    bool public tradingOpen;
    bool private _swapping;
    bool public swapEnabled = false;
    uint256 private constant _tSupply = 1e9 ether;
    uint256 public maxBuyAmount = _tSupply;
    uint256 public maxSellAmount = _tSupply;
    uint256 public maxWalletAmount = _tSupply;
    uint256 public tradingOpenBlock = 0;
    uint256 private _blocksToBlacklist = 0;
    uint256 public constant FEE_DIVISOR = 1000;
    uint256 private _fees;
    uint256 public buyFee = 300;
    uint256 private _previousBuyFee = buyFee;
    uint256 public sellFee = 750;
    uint256 private _previousSellFee = sellFee;
    uint256 private _tokensForFees;
    uint256 private _swapTokensAtAmount = 0;
    address payable private _feeCollectorWallet;
    address private _uniswapV2Pair;
    address constant private DEAD = 0x000000000000000000000000000000000000dEaD;
    address constant private ZERO = 0x0000000000000000000000000000000000000000;
    
    constructor() ERC20("Ad Infinitum", "a9i8") {
        _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _approve(address(this), address(_uniswapV2Router), _tSupply);
        _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        IERC20(_uniswapV2Pair).approve(address(_uniswapV2Router), type(uint).max);
        _feeCollectorWallet = payable(owner());
        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[DEAD] = true;
        _isExcludedMaxTransactionAmount[owner()] = true;
        _isExcludedMaxTransactionAmount[address(this)] = true;
        _isExcludedMaxTransactionAmount[DEAD] = true;
        _mint(owner(), _tSupply);
    }

    function _transfer(address from, address to, uint256 amount) internal override {
        require(from != ZERO, "ERC20: transfer from the zero address");
        require(to != ZERO, "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        bool takeFee = true;
        bool shouldSwap = false;
        if (from != owner() && to != owner() && to != ZERO && to != DEAD && !_swapping) {
            require(!_isBlacklisted[from] && !_isBlacklisted[to], "Blacklisted.");
            if(!tradingOpen) {
                require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not allowed yet.");
            }
            if (from == _uniswapV2Pair && to != address(_uniswapV2Router) && !_isExcludedMaxTransactionAmount[to]) {
                require(amount <= maxBuyAmount, "Transfer amount exceeds the maxBuyAmount.");
                require(balanceOf(to) + amount <= maxWalletAmount, "Exceeds maximum wallet token amount.");
            }
            if (to == _uniswapV2Pair && from != address(_uniswapV2Router) && !_isExcludedMaxTransactionAmount[from]) {
                require(amount <= maxSellAmount, "Transfer amount exceeds the maxSellAmount.");
                shouldSwap = true;
            }
        }

        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 contractBalance = balanceOf(address(this));
        bool canSwap = (contractBalance > _swapTokensAtAmount) && shouldSwap;

        if (canSwap && swapEnabled && !_swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            _swapping = true;
            _swapBack(contractBalance);
            _swapping = false;
        }

        _tokenTransfer(from, to, amount, takeFee, shouldSwap);
    }

    function _swapBack(uint256 contractBalance) internal {
        bool success;
        
        if (contractBalance == 0 || _tokensForFees == 0) {
            return;
        }

        if (contractBalance > _swapTokensAtAmount.mul(5)) {
            contractBalance = _swapTokensAtAmount.mul(5);
        }

        swapTokensForETH(contractBalance);
        
        _tokensForFees = 0;

        (success,) = address(_feeCollectorWallet).call{value: address(this).balance}("");
    }

    function swapTokensForETH(uint256 tokenAmount) internal {
        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 sendETHToFee(uint256 amount) internal {
        _feeCollectorWallet.transfer(amount);
    }

    function openTrading(uint256 blocks) public onlyOwner {
        swapEnabled = true;
        maxBuyAmount = _tSupply.mul(1).div(100);
        maxWalletAmount = _tSupply.mul(2).div(100);
        _swapTokensAtAmount = _tSupply.mul(5).div(10000);
        tradingOpen = true;
        tradingOpenBlock = block.number;
        _blocksToBlacklist = blocks;
    }

    function setOpenTrading(bool onoff) public onlyOwner {
        tradingOpen = onoff;
    }

    function setSwapEnabled(bool onoff) public onlyOwner {
        swapEnabled = onoff;
    }

    function setBlocksToBlacklist(uint256 blocks) public onlyOwner {
        _blocksToBlacklist = blocks;
    }

    function setMaxBuyAmount(uint256 _maxBuyAmount) public onlyOwner {
        maxBuyAmount = _maxBuyAmount;
    }

    function setMaxSellAmount(uint256 _maxSellAmount) public onlyOwner {
        maxSellAmount = _maxSellAmount;
    }
    
    function setMaxWalletAmount(uint256 _maxWalletAmount) public onlyOwner {
        maxWalletAmount = _maxWalletAmount;
    }
    
    function setSwapTokensAtAmount(uint256 swapTokensAtAmount) public onlyOwner {
        _swapTokensAtAmount = swapTokensAtAmount;
    }

    function setFeeCollectorWallet(address feeCollectorWallet) public onlyOwner {
        _feeCollectorWallet = payable(feeCollectorWallet);
        _isExcludedFromFees[_feeCollectorWallet] = true;
        _isExcludedMaxTransactionAmount[_feeCollectorWallet] = true;
    }

    function excludeFromFees(address account, bool isEx) public onlyOwner {
        _isExcludedFromFees[account] = isEx;
    }

    function excludeFromMaxTransaction(address account, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[account] = isEx;
    }

    function blacklist(address account, bool isBL) public onlyOwner {
        _isBlacklisted[account] = isBL;
    }

    function excludeFromFeesMultiple(address[] memory accounts, bool isEx) public onlyOwner {
        for (uint i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = isEx;
        }
    }
    
    function excludeFromMaxTransactionMultiple(address[] memory accounts, bool isEx) public onlyOwner {
        for (uint i = 0; i < accounts.length; i++) {
            _isExcludedMaxTransactionAmount[accounts[i]] = isEx;
        }
    }
    
    function blacklistMultiple(address[] memory accounts, bool isBL) public onlyOwner {
        for (uint i = 0; i < accounts.length; i++) {
            _isBlacklisted[accounts[i]] = isBL;
        }
    }

    function setFees(uint256 _buyFee, uint256 _sellFee) public onlyOwner {
        buyFee = _buyFee;
        sellFee = _sellFee;
    }

    function setBuyFee(uint256 _buyFee) public onlyOwner {
        buyFee = _buyFee;
    }

    function setSellFee(uint256 _sellFee) public onlyOwner {
        sellFee = _sellFee;
    }

    function removeAllFee() internal {
        if (buyFee == 0 && sellFee == 0) {
            return;
        }

        _previousBuyFee = buyFee;
        _previousSellFee = sellFee;
        buyFee = 0;
        sellFee = 0;
    }
    
    function restoreAllFee() internal {
        buyFee = _previousBuyFee;
        sellFee = _previousSellFee;
    }
        
    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee, bool isSell) internal {
        if (!takeFee) {
            removeAllFee();
        } else {
            amount = _takeFees(sender, amount, isSell);
        }

        super._transfer(sender, recipient, amount);
        
        if (!takeFee) {
            restoreAllFee();
        }
    }

    function _takeFees(address sender, uint256 amount, bool isSell) internal returns (uint256) {
        if(tradingOpenBlock + _blocksToBlacklist >= block.number) {
            _fees = 899;
        } else if (isSell) {
            _fees = sellFee;
        } else {
            _fees = buyFee;
        }
        
        uint256 fees;
        if (_fees > 0) {
            fees = amount.mul(_fees).div(FEE_DIVISOR);
            _tokensForFees += fees * _fees / _fees;
        }

        if (fees > 0) {
            super._transfer(sender, address(this), fees);
        }

        return amount -= fees;
    }
    
    function unclog() public onlyOwner {
        uint256 contractBalance = balanceOf(address(this));
        swapTokensForETH(contractBalance);
    }
    
    function distributeFees() public onlyOwner {
        uint256 contractETHBalance = address(this).balance;
        sendETHToFee(contractETHBalance);
    }

    function withdrawStuckETH() public onlyOwner {
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

    function withdrawStuckTokens(address tkn) public onlyOwner {
        require(IERC20(tkn).balanceOf(address(this)) > 0, "No tokens");
        uint amount = IERC20(tkn).balanceOf(address(this));
        IERC20(tkn).transfer(msg.sender, amount);
    }

    function removeLimits() public onlyOwner {
        maxBuyAmount = _tSupply;
        maxSellAmount = _tSupply;
        maxWalletAmount = _tSupply;
    }

    receive() external payable {}
    fallback() 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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"FEE_DIVISOR","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":"account","type":"address"},{"internalType":"bool","name":"isBL","type":"bool"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"isBL","type":"bool"}],"name":"blacklistMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromFeesMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransactionMultiple","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":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","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":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"setBlocksToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"feeCollectorWallet","type":"address"}],"name":"setFeeCollectorWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"},{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBuyAmount","type":"uint256"}],"name":"setMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSellAmount","type":"uint256"}],"name":"setMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setOpenTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"swapTokensAtAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpenBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unclog","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tkn","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600a805462ff0000191690556b033b2e3c9fd0803ce8000000600b819055600c819055600d556000600e819055600f81905561012c60118190556012556102ee60138190556014556016553480156200005c57600080fd5b506040518060400160405280600c81526020016b416420496e66696e6974756d60a01b815250604051806040016040528060048152602001630c272d2760e31b8152508160039081620000b0919062000705565b506004620000bf828262000705565b505050620000dc620000d66200041760201b60201c565b6200041b565b600680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556200011f9030906b033b2e3c9fd0803ce80000006200046d565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000173573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001999190620007d1565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002229190620007d1565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002969190620007d1565b601880546001600160a01b0319166001600160a01b0392831690811790915560065460405163095ea7b360e01b81529216600483015260001960248301529063095ea7b3906044016020604051808303816000875af1158015620002fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000324919062000803565b5060058054601780546001600160a01b0319166001600160a01b039283169081179091556000908152600760209081526040808320805460ff1990811660019081179092553080865283862080548316841790557fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d805483168417905587548716865260089094528285208054821683179055928452908320805483168217905561dead9092527f046fee3d77c34a6c5e10c3be6dc4b132c30449dbf4f0bc07684896dd093342998054909116909117905590546200041191166b033b2e3c9fd0803ce800000062000599565b6200084f565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316620004d55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620005385760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620004cc565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038216620005f15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620004cc565b806002600082825462000605919062000827565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200068c57607f821691505b602082108103620006ad57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200065c57600081815260208120601f850160051c81016020861015620006dc5750805b601f850160051c820191505b81811015620006fd57828155600101620006e8565b505050505050565b81516001600160401b0381111562000721576200072162000661565b620007398162000732845462000677565b84620006b3565b602080601f831160018114620007715760008415620007585750858301515b600019600386901b1c1916600185901b178555620006fd565b600085815260208120601f198616915b82811015620007a25788860151825594840194600190910190840162000781565b5085821015620007c15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620007e457600080fd5b81516001600160a01b0381168114620007fc57600080fd5b9392505050565b6000602082840312156200081657600080fd5b81518015158114620007fc57600080fd5b808201808211156200084957634e487b7160e01b600052601160045260246000fd5b92915050565b61215e806200085f6000396000f3fe6080604052600436106102695760003560e01c80637ff5aa2b11610143578063c0246668116100bb578063e6f7ef4d11610077578063e6f7ef4d1461072d578063e99c9d091461074d578063f2fde38b1461076d578063f34eb0b81461078d578063f5648a4f146107ad578063ffb54a99146107c257005b8063c02466681461066d578063cb9637281461068d578063d1633649146106ad578063dd62ed3e146106cd578063ddee24a4146106ed578063e01af92c1461070d57005b80639e93ad8e1161010a5780639e93ad8e146105cc578063a457c2d7146105e2578063a9059cbb14610602578063aa4bde2814610622578063afa4f3b214610638578063bb57ad201461065857005b80637ff5aa2b1461053957806388e765ff146105595780638b4cee081461056f5780638da5cb5b1461058f57806395d89b41146105b757005b8063404e5129116101e15780636ddd17131161019d5780636ddd1713146104795780636e46fec41461049957806370a08231146104b9578063715018a6146104ef578063751039fc146105045780637571336a1461051957005b8063404e5129146103d8578063439f3d56146103f857806347062402146104185780634d1379a61461042e57806366d602ae1461044e57806367c453491461046457005b806318160ddd1161023057806318160ddd1461033157806323b872dd1461034657806327a14fc2146103665780632b14ca5614610386578063313ce5671461039c57806339509351146103b857005b806306fdde0314610272578063095ea7b31461029d5780630b78f9c0146102cd5780630cc835a3146102ed5780630e23500e1461030d57005b3661027057005b005b34801561027e57600080fd5b506102876107dc565b6040516102949190611c3c565b60405180910390f35b3480156102a957600080fd5b506102bd6102b8366004611caf565b61086e565b6040519015158152602001610294565b3480156102d957600080fd5b506102706102e8366004611cdb565b610888565b3480156102f957600080fd5b50610270610308366004611cfd565b61089b565b34801561031957600080fd5b50610323600e5481565b604051908152602001610294565b34801561033d57600080fd5b50600254610323565b34801561035257600080fd5b506102bd610361366004611d16565b6108a8565b34801561037257600080fd5b50610270610381366004611cfd565b6108cc565b34801561039257600080fd5b5061032360135481565b3480156103a857600080fd5b5060405160128152602001610294565b3480156103c457600080fd5b506102bd6103d3366004611caf565b6108d9565b3480156103e457600080fd5b506102706103f3366004611d70565b6108fb565b34801561040457600080fd5b50610270610413366004611dbf565b61092e565b34801561042457600080fd5b5061032360115481565b34801561043a57600080fd5b50610270610449366004611e96565b6109a2565b34801561045a57600080fd5b50610323600c5481565b34801561047057600080fd5b506102706109bd565b34801561048557600080fd5b50600a546102bd9062010000900460ff1681565b3480156104a557600080fd5b506102706104b4366004611dbf565b6109e1565b3480156104c557600080fd5b506103236104d4366004611eb3565b6001600160a01b031660009081526020819052604090205490565b3480156104fb57600080fd5b50610270610a50565b34801561051057600080fd5b50610270610a64565b34801561052557600080fd5b50610270610534366004611d70565b610a88565b34801561054557600080fd5b50610270610554366004611eb3565b610abb565b34801561056557600080fd5b50610323600b5481565b34801561057b57600080fd5b5061027061058a366004611cfd565b610b1c565b34801561059b57600080fd5b506005546040516001600160a01b039091168152602001610294565b3480156105c357600080fd5b50610287610b29565b3480156105d857600080fd5b506103236103e881565b3480156105ee57600080fd5b506102bd6105fd366004611caf565b610b38565b34801561060e57600080fd5b506102bd61061d366004611caf565b610bb8565b34801561062e57600080fd5b50610323600d5481565b34801561064457600080fd5b50610270610653366004611cfd565b610bc6565b34801561066457600080fd5b50610270610bd3565b34801561067957600080fd5b50610270610688366004611d70565b610be5565b34801561069957600080fd5b506102706106a8366004611eb3565b610c18565b3480156106b957600080fd5b506102706106c8366004611cfd565b610da3565b3480156106d957600080fd5b506103236106e8366004611ed0565b610e36565b3480156106f957600080fd5b50610270610708366004611dbf565b610e61565b34801561071957600080fd5b50610270610728366004611e96565b610ed0565b34801561073957600080fd5b50610270610748366004611cfd565b610ef4565b34801561075957600080fd5b50610270610768366004611cfd565b610f01565b34801561077957600080fd5b50610270610788366004611eb3565b610f0e565b34801561079957600080fd5b506102706107a8366004611cfd565b610f84565b3480156107b957600080fd5b50610270610f91565b3480156107ce57600080fd5b50600a546102bd9060ff1681565b6060600380546107eb90611efe565b80601f016020809104026020016040519081016040528092919081815260200182805461081790611efe565b80156108645780601f1061083957610100808354040283529160200191610864565b820191906000526020600020905b81548152906001019060200180831161084757829003601f168201915b5050505050905090565b60003361087c818585610fe6565b60019150505b92915050565b61089061110a565b601191909155601355565b6108a361110a565b601155565b6000336108b6858285611164565b6108c18585856111d8565b506001949350505050565b6108d461110a565b600d55565b60003361087c8185856108ec8383610e36565b6108f69190611f4e565b610fe6565b61090361110a565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b61093661110a565b60005b825181101561099d57816008600085848151811061095957610959611f61565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061099581611f77565b915050610939565b505050565b6109aa61110a565b600a805460ff1916911515919091179055565b6109c561110a565b306000908152602081905260409020546109de8161173e565b50565b6109e961110a565b60005b825181101561099d578160076000858481518110610a0c57610a0c611f61565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610a4881611f77565b9150506109ec565b610a5861110a565b610a626000611898565b565b610a6c61110a565b6b033b2e3c9fd0803ce8000000600b819055600c819055600d55565b610a9061110a565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b610ac361110a565b601780546001600160a01b0319166001600160a01b0392831690811782556000908152600760209081526040808320805460ff199081166001908117909255945490951683526008909152902080549091169091179055565b610b2461110a565b601355565b6060600480546107eb90611efe565b60003381610b468286610e36565b905083811015610bab5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6108c18286868403610fe6565b60003361087c8185856111d8565b610bce61110a565b601655565b610bdb61110a565b476109de816118ea565b610bed61110a565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b610c2061110a565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8b9190611f90565b11610cc45760405162461bcd60e51b81526020600482015260096024820152684e6f20746f6b656e7360b81b6044820152606401610ba2565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610d0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2f9190611f90565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015610d7f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099d9190611fa9565b610dab61110a565b600a805462ff0000191662010000179055610dde6064610dd86b033b2e3c9fd0803ce80000006001611928565b9061193b565b600b55610dfd6064610dd86b033b2e3c9fd0803ce80000006002611928565b600d55610e1d612710610dd86b033b2e3c9fd0803ce80000006005611928565b601655600a805460ff1916600117905543600e55600f55565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610e6961110a565b60005b825181101561099d578160096000858481518110610e8c57610e8c611f61565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610ec881611f77565b915050610e6c565b610ed861110a565b600a8054911515620100000262ff000019909216919091179055565b610efc61110a565b600f55565b610f0961110a565b600c55565b610f1661110a565b6001600160a01b038116610f7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba2565b6109de81611898565b610f8c61110a565b600b55565b610f9961110a565b604051600090339047908381818185875af1925050503d8060008114610fdb576040519150601f19603f3d011682016040523d82523d6000602084013e610fe0565b606091505b50505050565b6001600160a01b0383166110485760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ba2565b6001600160a01b0382166110a95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ba2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610a625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ba2565b60006111708484610e36565b90506000198114610fe057818110156111cb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610ba2565b610fe08484848403610fe6565b6001600160a01b0383166111fe5760405162461bcd60e51b8152600401610ba290611fc6565b6001600160a01b0382166112245760405162461bcd60e51b8152600401610ba29061200b565b600081116112865760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610ba2565b6001600061129c6005546001600160a01b031690565b6001600160a01b0316856001600160a01b0316141580156112cb57506005546001600160a01b03858116911614155b80156112df57506001600160a01b03841615155b80156112f657506001600160a01b03841661dead14155b801561130a5750600a54610100900460ff16155b1561161f576001600160a01b03851660009081526009602052604090205460ff1615801561135157506001600160a01b03841660009081526009602052604090205460ff16155b61138c5760405162461bcd60e51b815260206004820152600c60248201526b213630b1b5b634b9ba32b21760a11b6044820152606401610ba2565b600a5460ff16611421576001600160a01b03851660009081526007602052604090205460ff16806113d557506001600160a01b03841660009081526007602052604090205460ff165b6114215760405162461bcd60e51b815260206004820152601b60248201527f54726164696e67206973206e6f7420616c6c6f776564207965742e00000000006044820152606401610ba2565b6018546001600160a01b03868116911614801561144c57506006546001600160a01b03858116911614155b801561147157506001600160a01b03841660009081526008602052604090205460ff16155b1561156157600b548311156114da5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178426044820152683abca0b6b7bab73a1760b91b6064820152608401610ba2565b600d54836114fd866001600160a01b031660009081526020819052604090205490565b6115079190611f4e565b11156115615760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610ba2565b6018546001600160a01b03858116911614801561158c57506006546001600160a01b03868116911614155b80156115b157506001600160a01b03851660009081526008602052604090205460ff16155b1561161f57600c5483111561161b5760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785360448201526932b63620b6b7bab73a1760b11b6064820152608401610ba2565b5060015b6001600160a01b03851660009081526007602052604090205460ff168061165e57506001600160a01b03841660009081526007602052604090205460ff165b1561166857600091505b30600090815260208190526040812054905060006016548211801561168a5750825b90508080156116a15750600a5462010000900460ff165b80156116b55750600a54610100900460ff16155b80156116da57506001600160a01b03871660009081526007602052604090205460ff16155b80156116ff57506001600160a01b03861660009081526007602052604090205460ff16155b1561172857600a805461ff00191661010017905561171c82611947565b600a805461ff00191690555b61173587878787876119ed565b50505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061177357611773611f61565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f0919061204e565b8160018151811061180357611803611f61565b6001600160a01b0392831660209182029290920101526006546118299130911684610fe6565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061186290859060009086903090429060040161206b565b600060405180830381600087803b15801561187c57600080fd5b505af1158015611890573d6000803e3d6000fd5b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6017546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611924573d6000803e3d6000fd5b5050565b600061193482846120dc565b9392505050565b600061193482846120f3565b60008115806119565750601554155b1561195f575050565b60165461196d906005611928565b82111561198557601654611982906005611928565b91505b61198e8261173e565b600060158190556017546040516001600160a01b039091169147919081818185875af1925050503d80600081146119e1576040519150601f19603f3d011682016040523d82523d6000602084013e6119e6565b606091505b5050505050565b816119ff576119fa611a2e565b611a0d565b611a0a858483611a5c565b92505b611a18858585611b12565b816119e6576119e6601254601155601454601355565b601154158015611a3e5750601354155b15611a4557565b601180546012556013805460145560009182905555565b600043600f54600e54611a6f9190611f4e565b10611a7f57610383601055611a97565b8115611a9057601354601055611a97565b6011546010555b60105460009015611aee57611abd6103e8610dd86010548761192890919063ffffffff16565b601054909150611acd81836120dc565b611ad791906120f3565b60156000828254611ae89190611f4e565b90915550505b8015611aff57611aff853083611b12565b611b098185612115565b95945050505050565b6001600160a01b038316611b385760405162461bcd60e51b8152600401610ba290611fc6565b6001600160a01b038216611b5e5760405162461bcd60e51b8152600401610ba29061200b565b6001600160a01b03831660009081526020819052604090205481811015611bd65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ba2565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610fe0565b600060208083528351808285015260005b81811015611c6957858101830151858201604001528201611c4d565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146109de57600080fd5b8035611caa81611c8a565b919050565b60008060408385031215611cc257600080fd5b8235611ccd81611c8a565b946020939093013593505050565b60008060408385031215611cee57600080fd5b50508035926020909101359150565b600060208284031215611d0f57600080fd5b5035919050565b600080600060608486031215611d2b57600080fd5b8335611d3681611c8a565b92506020840135611d4681611c8a565b929592945050506040919091013590565b80151581146109de57600080fd5b8035611caa81611d57565b60008060408385031215611d8357600080fd5b8235611d8e81611c8a565b91506020830135611d9e81611d57565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215611dd257600080fd5b823567ffffffffffffffff80821115611dea57600080fd5b818501915085601f830112611dfe57600080fd5b8135602082821115611e1257611e12611da9565b8160051b604051601f19603f83011681018181108682111715611e3757611e37611da9565b604052928352818301935084810182019289841115611e5557600080fd5b948201945b83861015611e7a57611e6b86611c9f565b85529482019493820193611e5a565b9650611e899050878201611d65565b9450505050509250929050565b600060208284031215611ea857600080fd5b813561193481611d57565b600060208284031215611ec557600080fd5b813561193481611c8a565b60008060408385031215611ee357600080fd5b8235611eee81611c8a565b91506020830135611d9e81611c8a565b600181811c90821680611f1257607f821691505b602082108103611f3257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561088257610882611f38565b634e487b7160e01b600052603260045260246000fd5b600060018201611f8957611f89611f38565b5060010190565b600060208284031215611fa257600080fd5b5051919050565b600060208284031215611fbb57600080fd5b815161193481611d57565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60006020828403121561206057600080fd5b815161193481611c8a565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156120bb5784516001600160a01b031683529383019391830191600101612096565b50506001600160a01b03969096166060850152505050608001529392505050565b808202811582820484141761088257610882611f38565b60008261211057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561088257610882611f3856fea2646970667358221220b9267676398606132e4eff439f03ed2ad59061a8a2560c69d31371fc6593b53364736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102695760003560e01c80637ff5aa2b11610143578063c0246668116100bb578063e6f7ef4d11610077578063e6f7ef4d1461072d578063e99c9d091461074d578063f2fde38b1461076d578063f34eb0b81461078d578063f5648a4f146107ad578063ffb54a99146107c257005b8063c02466681461066d578063cb9637281461068d578063d1633649146106ad578063dd62ed3e146106cd578063ddee24a4146106ed578063e01af92c1461070d57005b80639e93ad8e1161010a5780639e93ad8e146105cc578063a457c2d7146105e2578063a9059cbb14610602578063aa4bde2814610622578063afa4f3b214610638578063bb57ad201461065857005b80637ff5aa2b1461053957806388e765ff146105595780638b4cee081461056f5780638da5cb5b1461058f57806395d89b41146105b757005b8063404e5129116101e15780636ddd17131161019d5780636ddd1713146104795780636e46fec41461049957806370a08231146104b9578063715018a6146104ef578063751039fc146105045780637571336a1461051957005b8063404e5129146103d8578063439f3d56146103f857806347062402146104185780634d1379a61461042e57806366d602ae1461044e57806367c453491461046457005b806318160ddd1161023057806318160ddd1461033157806323b872dd1461034657806327a14fc2146103665780632b14ca5614610386578063313ce5671461039c57806339509351146103b857005b806306fdde0314610272578063095ea7b31461029d5780630b78f9c0146102cd5780630cc835a3146102ed5780630e23500e1461030d57005b3661027057005b005b34801561027e57600080fd5b506102876107dc565b6040516102949190611c3c565b60405180910390f35b3480156102a957600080fd5b506102bd6102b8366004611caf565b61086e565b6040519015158152602001610294565b3480156102d957600080fd5b506102706102e8366004611cdb565b610888565b3480156102f957600080fd5b50610270610308366004611cfd565b61089b565b34801561031957600080fd5b50610323600e5481565b604051908152602001610294565b34801561033d57600080fd5b50600254610323565b34801561035257600080fd5b506102bd610361366004611d16565b6108a8565b34801561037257600080fd5b50610270610381366004611cfd565b6108cc565b34801561039257600080fd5b5061032360135481565b3480156103a857600080fd5b5060405160128152602001610294565b3480156103c457600080fd5b506102bd6103d3366004611caf565b6108d9565b3480156103e457600080fd5b506102706103f3366004611d70565b6108fb565b34801561040457600080fd5b50610270610413366004611dbf565b61092e565b34801561042457600080fd5b5061032360115481565b34801561043a57600080fd5b50610270610449366004611e96565b6109a2565b34801561045a57600080fd5b50610323600c5481565b34801561047057600080fd5b506102706109bd565b34801561048557600080fd5b50600a546102bd9062010000900460ff1681565b3480156104a557600080fd5b506102706104b4366004611dbf565b6109e1565b3480156104c557600080fd5b506103236104d4366004611eb3565b6001600160a01b031660009081526020819052604090205490565b3480156104fb57600080fd5b50610270610a50565b34801561051057600080fd5b50610270610a64565b34801561052557600080fd5b50610270610534366004611d70565b610a88565b34801561054557600080fd5b50610270610554366004611eb3565b610abb565b34801561056557600080fd5b50610323600b5481565b34801561057b57600080fd5b5061027061058a366004611cfd565b610b1c565b34801561059b57600080fd5b506005546040516001600160a01b039091168152602001610294565b3480156105c357600080fd5b50610287610b29565b3480156105d857600080fd5b506103236103e881565b3480156105ee57600080fd5b506102bd6105fd366004611caf565b610b38565b34801561060e57600080fd5b506102bd61061d366004611caf565b610bb8565b34801561062e57600080fd5b50610323600d5481565b34801561064457600080fd5b50610270610653366004611cfd565b610bc6565b34801561066457600080fd5b50610270610bd3565b34801561067957600080fd5b50610270610688366004611d70565b610be5565b34801561069957600080fd5b506102706106a8366004611eb3565b610c18565b3480156106b957600080fd5b506102706106c8366004611cfd565b610da3565b3480156106d957600080fd5b506103236106e8366004611ed0565b610e36565b3480156106f957600080fd5b50610270610708366004611dbf565b610e61565b34801561071957600080fd5b50610270610728366004611e96565b610ed0565b34801561073957600080fd5b50610270610748366004611cfd565b610ef4565b34801561075957600080fd5b50610270610768366004611cfd565b610f01565b34801561077957600080fd5b50610270610788366004611eb3565b610f0e565b34801561079957600080fd5b506102706107a8366004611cfd565b610f84565b3480156107b957600080fd5b50610270610f91565b3480156107ce57600080fd5b50600a546102bd9060ff1681565b6060600380546107eb90611efe565b80601f016020809104026020016040519081016040528092919081815260200182805461081790611efe565b80156108645780601f1061083957610100808354040283529160200191610864565b820191906000526020600020905b81548152906001019060200180831161084757829003601f168201915b5050505050905090565b60003361087c818585610fe6565b60019150505b92915050565b61089061110a565b601191909155601355565b6108a361110a565b601155565b6000336108b6858285611164565b6108c18585856111d8565b506001949350505050565b6108d461110a565b600d55565b60003361087c8185856108ec8383610e36565b6108f69190611f4e565b610fe6565b61090361110a565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b61093661110a565b60005b825181101561099d57816008600085848151811061095957610959611f61565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061099581611f77565b915050610939565b505050565b6109aa61110a565b600a805460ff1916911515919091179055565b6109c561110a565b306000908152602081905260409020546109de8161173e565b50565b6109e961110a565b60005b825181101561099d578160076000858481518110610a0c57610a0c611f61565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610a4881611f77565b9150506109ec565b610a5861110a565b610a626000611898565b565b610a6c61110a565b6b033b2e3c9fd0803ce8000000600b819055600c819055600d55565b610a9061110a565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b610ac361110a565b601780546001600160a01b0319166001600160a01b0392831690811782556000908152600760209081526040808320805460ff199081166001908117909255945490951683526008909152902080549091169091179055565b610b2461110a565b601355565b6060600480546107eb90611efe565b60003381610b468286610e36565b905083811015610bab5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6108c18286868403610fe6565b60003361087c8185856111d8565b610bce61110a565b601655565b610bdb61110a565b476109de816118ea565b610bed61110a565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b610c2061110a565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8b9190611f90565b11610cc45760405162461bcd60e51b81526020600482015260096024820152684e6f20746f6b656e7360b81b6044820152606401610ba2565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610d0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2f9190611f90565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015610d7f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099d9190611fa9565b610dab61110a565b600a805462ff0000191662010000179055610dde6064610dd86b033b2e3c9fd0803ce80000006001611928565b9061193b565b600b55610dfd6064610dd86b033b2e3c9fd0803ce80000006002611928565b600d55610e1d612710610dd86b033b2e3c9fd0803ce80000006005611928565b601655600a805460ff1916600117905543600e55600f55565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610e6961110a565b60005b825181101561099d578160096000858481518110610e8c57610e8c611f61565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610ec881611f77565b915050610e6c565b610ed861110a565b600a8054911515620100000262ff000019909216919091179055565b610efc61110a565b600f55565b610f0961110a565b600c55565b610f1661110a565b6001600160a01b038116610f7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba2565b6109de81611898565b610f8c61110a565b600b55565b610f9961110a565b604051600090339047908381818185875af1925050503d8060008114610fdb576040519150601f19603f3d011682016040523d82523d6000602084013e610fe0565b606091505b50505050565b6001600160a01b0383166110485760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ba2565b6001600160a01b0382166110a95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ba2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610a625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ba2565b60006111708484610e36565b90506000198114610fe057818110156111cb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610ba2565b610fe08484848403610fe6565b6001600160a01b0383166111fe5760405162461bcd60e51b8152600401610ba290611fc6565b6001600160a01b0382166112245760405162461bcd60e51b8152600401610ba29061200b565b600081116112865760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610ba2565b6001600061129c6005546001600160a01b031690565b6001600160a01b0316856001600160a01b0316141580156112cb57506005546001600160a01b03858116911614155b80156112df57506001600160a01b03841615155b80156112f657506001600160a01b03841661dead14155b801561130a5750600a54610100900460ff16155b1561161f576001600160a01b03851660009081526009602052604090205460ff1615801561135157506001600160a01b03841660009081526009602052604090205460ff16155b61138c5760405162461bcd60e51b815260206004820152600c60248201526b213630b1b5b634b9ba32b21760a11b6044820152606401610ba2565b600a5460ff16611421576001600160a01b03851660009081526007602052604090205460ff16806113d557506001600160a01b03841660009081526007602052604090205460ff165b6114215760405162461bcd60e51b815260206004820152601b60248201527f54726164696e67206973206e6f7420616c6c6f776564207965742e00000000006044820152606401610ba2565b6018546001600160a01b03868116911614801561144c57506006546001600160a01b03858116911614155b801561147157506001600160a01b03841660009081526008602052604090205460ff16155b1561156157600b548311156114da5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178426044820152683abca0b6b7bab73a1760b91b6064820152608401610ba2565b600d54836114fd866001600160a01b031660009081526020819052604090205490565b6115079190611f4e565b11156115615760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610ba2565b6018546001600160a01b03858116911614801561158c57506006546001600160a01b03868116911614155b80156115b157506001600160a01b03851660009081526008602052604090205460ff16155b1561161f57600c5483111561161b5760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785360448201526932b63620b6b7bab73a1760b11b6064820152608401610ba2565b5060015b6001600160a01b03851660009081526007602052604090205460ff168061165e57506001600160a01b03841660009081526007602052604090205460ff165b1561166857600091505b30600090815260208190526040812054905060006016548211801561168a5750825b90508080156116a15750600a5462010000900460ff165b80156116b55750600a54610100900460ff16155b80156116da57506001600160a01b03871660009081526007602052604090205460ff16155b80156116ff57506001600160a01b03861660009081526007602052604090205460ff16155b1561172857600a805461ff00191661010017905561171c82611947565b600a805461ff00191690555b61173587878787876119ed565b50505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061177357611773611f61565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f0919061204e565b8160018151811061180357611803611f61565b6001600160a01b0392831660209182029290920101526006546118299130911684610fe6565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061186290859060009086903090429060040161206b565b600060405180830381600087803b15801561187c57600080fd5b505af1158015611890573d6000803e3d6000fd5b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6017546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611924573d6000803e3d6000fd5b5050565b600061193482846120dc565b9392505050565b600061193482846120f3565b60008115806119565750601554155b1561195f575050565b60165461196d906005611928565b82111561198557601654611982906005611928565b91505b61198e8261173e565b600060158190556017546040516001600160a01b039091169147919081818185875af1925050503d80600081146119e1576040519150601f19603f3d011682016040523d82523d6000602084013e6119e6565b606091505b5050505050565b816119ff576119fa611a2e565b611a0d565b611a0a858483611a5c565b92505b611a18858585611b12565b816119e6576119e6601254601155601454601355565b601154158015611a3e5750601354155b15611a4557565b601180546012556013805460145560009182905555565b600043600f54600e54611a6f9190611f4e565b10611a7f57610383601055611a97565b8115611a9057601354601055611a97565b6011546010555b60105460009015611aee57611abd6103e8610dd86010548761192890919063ffffffff16565b601054909150611acd81836120dc565b611ad791906120f3565b60156000828254611ae89190611f4e565b90915550505b8015611aff57611aff853083611b12565b611b098185612115565b95945050505050565b6001600160a01b038316611b385760405162461bcd60e51b8152600401610ba290611fc6565b6001600160a01b038216611b5e5760405162461bcd60e51b8152600401610ba29061200b565b6001600160a01b03831660009081526020819052604090205481811015611bd65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ba2565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610fe0565b600060208083528351808285015260005b81811015611c6957858101830151858201604001528201611c4d565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146109de57600080fd5b8035611caa81611c8a565b919050565b60008060408385031215611cc257600080fd5b8235611ccd81611c8a565b946020939093013593505050565b60008060408385031215611cee57600080fd5b50508035926020909101359150565b600060208284031215611d0f57600080fd5b5035919050565b600080600060608486031215611d2b57600080fd5b8335611d3681611c8a565b92506020840135611d4681611c8a565b929592945050506040919091013590565b80151581146109de57600080fd5b8035611caa81611d57565b60008060408385031215611d8357600080fd5b8235611d8e81611c8a565b91506020830135611d9e81611d57565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215611dd257600080fd5b823567ffffffffffffffff80821115611dea57600080fd5b818501915085601f830112611dfe57600080fd5b8135602082821115611e1257611e12611da9565b8160051b604051601f19603f83011681018181108682111715611e3757611e37611da9565b604052928352818301935084810182019289841115611e5557600080fd5b948201945b83861015611e7a57611e6b86611c9f565b85529482019493820193611e5a565b9650611e899050878201611d65565b9450505050509250929050565b600060208284031215611ea857600080fd5b813561193481611d57565b600060208284031215611ec557600080fd5b813561193481611c8a565b60008060408385031215611ee357600080fd5b8235611eee81611c8a565b91506020830135611d9e81611c8a565b600181811c90821680611f1257607f821691505b602082108103611f3257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561088257610882611f38565b634e487b7160e01b600052603260045260246000fd5b600060018201611f8957611f89611f38565b5060010190565b600060208284031215611fa257600080fd5b5051919050565b600060208284031215611fbb57600080fd5b815161193481611d57565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60006020828403121561206057600080fd5b815161193481611c8a565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156120bb5784516001600160a01b031683529383019391830191600101612096565b50506001600160a01b03969096166060850152505050608001529392505050565b808202811582820484141761088257610882611f38565b60008261211057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561088257610882611f3856fea2646970667358221220b9267676398606132e4eff439f03ed2ad59061a8a2560c69d31371fc6593b53364736f6c63430008110033

Deployed Bytecode Sourcemap

24387:10407:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12712:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15063:201;;;;;;;;;;-1:-1:-1;15063:201:0;;;;;:::i;:::-;;:::i;:::-;;;1327:14:1;;1320:22;1302:41;;1290:2;1275:18;15063:201:0;1162:187:1;32067:133:0;;;;;;;;;;-1:-1:-1;32067:133:0;;;;;:::i;:::-;;:::i;32208:88::-;;;;;;;;;;-1:-1:-1;32208:88:0;;;;;:::i;:::-;;:::i;25000:35::-;;;;;;;;;;;;;;;;;;;1938:25:1;;;1926:2;1911:18;25000:35:0;1792:177:1;13832:108:0;;;;;;;;;;-1:-1:-1;13920:12:0;;13832:108;;15844:295;;;;;;;;;;-1:-1:-1;15844:295:0;;;;;:::i;:::-;;:::i;30413:124::-;;;;;;;;;;-1:-1:-1;30413:124:0;;;;;:::i;:::-;;:::i;25245:28::-;;;;;;;;;;;;;;;;13674:93;;;;;;;;;;-1:-1:-1;13674:93:0;;13757:2;2577:36:1;;2565:2;2550:18;13674:93:0;2435:184:1;16548:238:0;;;;;;;;;;-1:-1:-1;16548:238:0;;;;;:::i;:::-;;:::i;31258:113::-;;;;;;;;;;-1:-1:-1;31258:113:0;;;;;:::i;:::-;;:::i;31606:237::-;;;;;;;;;;-1:-1:-1;31606:237:0;;;;;:::i;:::-;;:::i;25164:27::-;;;;;;;;;;;;;;;;29850:91;;;;;;;;;;-1:-1:-1;29850:91:0;;;;;:::i;:::-;;:::i;24906:39::-;;;;;;;;;;;;;;;;33812:148;;;;;;;;;;;;;:::i;24771:31::-;;;;;;;;;;-1:-1:-1;24771:31:0;;;;;;;;;;;31379:215;;;;;;;;;;-1:-1:-1;31379:215:0;;;;;:::i;:::-;;:::i;14003:127::-;;;;;;;;;;-1:-1:-1;14003:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;14104:18:0;14077:7;14104:18;;;;;;;;;;;;14003:127;1535:103;;;;;;;;;;;;;:::i;34561:155::-;;;;;;;;;;;;;:::i;31104:146::-;;;;;;;;;;-1:-1:-1;31104:146:0;;;;;:::i;:::-;;:::i;30692:272::-;;;;;;;;;;-1:-1:-1;30692:272:0;;;;;:::i;:::-;;:::i;24861:38::-;;;;;;;;;;;;;;;;32304:92;;;;;;;;;;-1:-1:-1;32304:92:0;;;;;:::i;:::-;;:::i;887:87::-;;;;;;;;;;-1:-1:-1;960:6:0;;887:87;;-1:-1:-1;;;;;960:6:0;;;5239:51:1;;5227:2;5212:18;887:87:0;5093:203:1;12931:104:0;;;;;;;;;;;;;:::i;25087:42::-;;;;;;;;;;;;25125:4;25087:42;;17289:436;;;;;;;;;;-1:-1:-1;17289:436:0;;;;;:::i;:::-;;:::i;14336:193::-;;;;;;;;;;-1:-1:-1;14336:193:0;;;;;:::i;:::-;;:::i;24952:41::-;;;;;;;;;;;;;;;;30549:135;;;;;;;;;;-1:-1:-1;30549:135:0;;;;;:::i;:::-;;:::i;33972:155::-;;;;;;;;;;;;;:::i;30972:124::-;;;;;;;;;;-1:-1:-1;30972:124:0;;;;;:::i;:::-;;:::i;34301:252::-;;;;;;;;;;-1:-1:-1;34301:252:0;;;;;:::i;:::-;;:::i;29480:362::-;;;;;;;;;;-1:-1:-1;29480:362:0;;;;;:::i;:::-;;:::i;14592:151::-;;;;;;;;;;-1:-1:-1;14592:151:0;;;;;:::i;:::-;;:::i;31855:204::-;;;;;;;;;;-1:-1:-1;31855:204:0;;;;;:::i;:::-;;:::i;29949:91::-;;;;;;;;;;-1:-1:-1;29949:91:0;;;;;:::i;:::-;;:::i;30048:109::-;;;;;;;;;;-1:-1:-1;30048:109:0;;;;;:::i;:::-;;:::i;30285:116::-;;;;;;;;;;-1:-1:-1;30285:116:0;;;;;:::i;:::-;;:::i;1793:201::-;;;;;;;;;;-1:-1:-1;1793:201:0;;;;;:::i;:::-;;:::i;30165:112::-;;;;;;;;;;-1:-1:-1;30165:112:0;;;;;:::i;:::-;;:::i;34135:158::-;;;;;;;;;;;;;:::i;24712:23::-;;;;;;;;;;-1:-1:-1;24712:23:0;;;;;;;;12712:100;12766:13;12799:5;12792:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12712:100;:::o;15063:201::-;15146:4;183:10;15202:32;183:10;15218:7;15227:6;15202:8;:32::i;:::-;15252:4;15245:11;;;15063:201;;;;;:::o;32067:133::-;773:13;:11;:13::i;:::-;32147:6:::1;:16:::0;;;;32174:7:::1;:18:::0;32067:133::o;32208:88::-;773:13;:11;:13::i;:::-;32272:6:::1;:16:::0;32208:88::o;15844:295::-;15975:4;183:10;16033:38;16049:4;183:10;16064:6;16033:15;:38::i;:::-;16082:27;16092:4;16098:2;16102:6;16082:9;:27::i;:::-;-1:-1:-1;16127:4:0;;15844:295;-1:-1:-1;;;;15844:295:0:o;30413:124::-;773:13;:11;:13::i;:::-;30495:15:::1;:34:::0;30413:124::o;16548:238::-;16636:4;183:10;16692:64;183:10;16708:7;16745:10;16717:25;183:10;16708:7;16717:9;:25::i;:::-;:38;;;;:::i;:::-;16692:8;:64::i;31258:113::-;773:13;:11;:13::i;:::-;-1:-1:-1;;;;;31333:23:0;;;::::1;;::::0;;;:14:::1;:23;::::0;;;;:30;;-1:-1:-1;;31333:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31258:113::o;31606:237::-;773:13;:11;:13::i;:::-;31720:6:::1;31715:121;31736:8;:15;31732:1;:19;31715:121;;;31820:4;31773:31;:44;31805:8;31814:1;31805:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;31773:44:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;31773:44:0;:51;;-1:-1:-1;;31773:51:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31753:3;::::1;::::0;::::1;:::i;:::-;;;;31715:121;;;;31606:237:::0;;:::o;29850:91::-;773:13;:11;:13::i;:::-;29914:11:::1;:19:::0;;-1:-1:-1;;29914:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29850:91::o;33812:148::-;773:13;:11;:13::i;:::-;33902:4:::1;33858:23;14104:18:::0;;;;;;;;;;;33919:33:::1;14104:18:::0;33919:16:::1;:33::i;:::-;33847:113;33812:148::o:0;31379:215::-;773:13;:11;:13::i;:::-;31483:6:::1;31478:109;31499:8;:15;31495:1;:19;31478:109;;;31571:4;31536:19;:32;31556:8;31565:1;31556:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;31536:32:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;31536:32:0;:39;;-1:-1:-1;;31536:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31516:3;::::1;::::0;::::1;:::i;:::-;;;;31478:109;;1535:103:::0;773:13;:11;:13::i;:::-;1600:30:::1;1627:1;1600:18;:30::i;:::-;1535:103::o:0;34561:155::-;773:13;:11;:13::i;:::-;24845:9:::1;34613:12;:23:::0;;;34647:13:::1;:24:::0;;;34682:15:::1;:26:::0;34561:155::o;31104:146::-;773:13;:11;:13::i;:::-;-1:-1:-1;;;;;31195:40:0;;;::::1;;::::0;;;:31:::1;:40;::::0;;;;:47;;-1:-1:-1;;31195:47:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31104:146::o;30692:272::-;773:13;:11;:13::i;:::-;30779:19:::1;:49:::0;;-1:-1:-1;;;;;;30779:49:0::1;-1:-1:-1::0;;;;;30779:49:0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;30839:40:0;;;:19:::1;:40;::::0;;;;;;;:47;;-1:-1:-1;;30839:47:0;;::::1;-1:-1:-1::0;30839:47:0;;::::1;::::0;;;30929:19;;;;::::1;30897:52:::0;;:31:::1;:52:::0;;;;;:59;;;;::::1;::::0;;::::1;::::0;;30692:272::o;32304:92::-;773:13;:11;:13::i;:::-;32370:7:::1;:18:::0;32304:92::o;12931:104::-;12987:13;13020:7;13013:14;;;;;:::i;17289:436::-;17382:4;183:10;17382:4;17465:25;183:10;17482:7;17465:9;:25::i;:::-;17438:52;;17529:15;17509:16;:35;;17501:85;;;;-1:-1:-1;;;17501:85:0;;6815:2:1;17501:85:0;;;6797:21:1;6854:2;6834:18;;;6827:30;6893:34;6873:18;;;6866:62;-1:-1:-1;;;6944:18:1;;;6937:35;6989:19;;17501:85:0;;;;;;;;;17622:60;17631:5;17638:7;17666:15;17647:16;:34;17622:8;:60::i;14336:193::-;14415:4;183:10;14471:28;183:10;14488:2;14492:6;14471:9;:28::i;30549:135::-;773:13;:11;:13::i;:::-;30636:19:::1;:40:::0;30549:135::o;33972:155::-;773:13;:11;:13::i;:::-;34055:21:::1;34087:32;34055:21:::0;34087:12:::1;:32::i;30972:124::-:0;773:13;:11;:13::i;:::-;-1:-1:-1;;;;;31053:28:0;;;::::1;;::::0;;;:19:::1;:28;::::0;;;;:35;;-1:-1:-1;;31053:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;30972:124::o;34301:252::-;773:13;:11;:13::i;:::-;34379:36:::1;::::0;-1:-1:-1;;;34379:36:0;;34409:4:::1;34379:36;::::0;::::1;5239:51:1::0;34418:1:0::1;::::0;-1:-1:-1;;;;;34379:21:0;::::1;::::0;::::1;::::0;5212:18:1;;34379:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;34371:62;;;::::0;-1:-1:-1;;;34371:62:0;;7410:2:1;34371:62:0::1;::::0;::::1;7392:21:1::0;7449:1;7429:18;;;7422:29;-1:-1:-1;;;7467:18:1;;;7460:39;7516:18;;34371:62:0::1;7208:332:1::0;34371:62:0::1;34458:36;::::0;-1:-1:-1;;;34458:36:0;;34488:4:::1;34458:36;::::0;::::1;5239:51:1::0;34444:11:0::1;::::0;-1:-1:-1;;;;;34458:21:0;::::1;::::0;::::1;::::0;5212:18:1;;34458:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34505:40;::::0;-1:-1:-1;;;34505:40:0;;34526:10:::1;34505:40;::::0;::::1;7719:51:1::0;7786:18;;;7779:34;;;34444:50:0;;-1:-1:-1;;;;;;34505:20:0;::::1;::::0;::::1;::::0;7692:18:1;;34505:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29480:362::-:0;773:13;:11;:13::i;:::-;29545:11:::1;:18:::0;;-1:-1:-1;;29545:18:0::1;::::0;::::1;::::0;;29589:24:::1;29609:3;29589:15;24845:9;29559:4;29589:12;:15::i;:::-;:19:::0;::::1;:24::i;:::-;29574:12;:39:::0;29642:24:::1;29662:3;29642:15;24845:9;29655:1;29642:12;:15::i;:24::-;29624:15;:42:::0;29699:26:::1;29719:5;29699:15;24845:9;29712:1;29699:12;:15::i;:26::-;29677:19;:48:::0;29736:11:::1;:18:::0;;-1:-1:-1;;29736:18:0::1;29750:4;29736:18;::::0;;29784:12:::1;29765:16;:31:::0;29807:18:::1;:27:::0;29480:362::o;14592:151::-;-1:-1:-1;;;;;14708:18:0;;;14681:7;14708:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14592:151::o;31855:204::-;773:13;:11;:13::i;:::-;31953:6:::1;31948:104;31969:8;:15;31965:1;:19;31948:104;;;32036:4;32006:14;:27;32021:8;32030:1;32021:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;32006:27:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;32006:27:0;:34;;-1:-1:-1;;32006:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31986:3;::::1;::::0;::::1;:::i;:::-;;;;31948:104;;29949:91:::0;773:13;:11;:13::i;:::-;30013:11:::1;:19:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;30013:19:0;;::::1;::::0;;;::::1;::::0;;29949:91::o;30048:109::-;773:13;:11;:13::i;:::-;30122:18:::1;:27:::0;30048:109::o;30285:116::-;773:13;:11;:13::i;:::-;30363::::1;:30:::0;30285:116::o;1793:201::-;773:13;:11;:13::i;:::-;-1:-1:-1;;;;;1882:22:0;::::1;1874:73;;;::::0;-1:-1:-1;;;1874:73:0;;8276:2:1;1874:73:0::1;::::0;::::1;8258:21:1::0;8315:2;8295:18;;;8288:30;8354:34;8334:18;;;8327:62;-1:-1:-1;;;8405:18:1;;;8398:36;8451:19;;1874:73:0::1;8074:402:1::0;1874:73:0::1;1958:28;1977:8;1958:18;:28::i;30165:112::-:0;773:13;:11;:13::i;:::-;30241:12:::1;:28:::0;30165:112::o;34135:158::-;773:13;:11;:13::i;:::-;34227:58:::1;::::0;34191:12:::1;::::0;34235:10:::1;::::0;34259:21:::1;::::0;34191:12;34227:58;34191:12;34227:58;34259:21;34235:10;34227:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;34135:158:0:o;21316:380::-;-1:-1:-1;;;;;21452:19:0;;21444:68;;;;-1:-1:-1;;;21444:68:0;;8893:2:1;21444:68:0;;;8875:21:1;8932:2;8912:18;;;8905:30;8971:34;8951:18;;;8944:62;-1:-1:-1;;;9022:18:1;;;9015:34;9066:19;;21444:68:0;8691:400:1;21444:68:0;-1:-1:-1;;;;;21531:21:0;;21523:68;;;;-1:-1:-1;;;21523:68:0;;9298:2:1;21523:68:0;;;9280:21:1;9337:2;9317:18;;;9310:30;9376:34;9356:18;;;9349:62;-1:-1:-1;;;9427:18:1;;;9420:32;9469:19;;21523:68:0;9096:398:1;21523:68:0;-1:-1:-1;;;;;21604:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;21656:32;;1938:25:1;;;21656:32:0;;1911:18:1;21656:32:0;;;;;;;21316:380;;;:::o;1052:132::-;960:6;;-1:-1:-1;;;;;960:6:0;183:10;1116:23;1108:68;;;;-1:-1:-1;;;1108:68:0;;9701:2:1;1108:68:0;;;9683:21:1;;;9720:18;;;9713:30;9779:34;9759:18;;;9752:62;9831:18;;1108:68:0;9499:356:1;21987:453:0;22122:24;22149:25;22159:5;22166:7;22149:9;:25::i;:::-;22122:52;;-1:-1:-1;;22189:16:0;:37;22185:248;;22271:6;22251:16;:26;;22243:68;;;;-1:-1:-1;;;22243:68:0;;10062:2:1;22243:68:0;;;10044:21:1;10101:2;10081:18;;;10074:30;10140:31;10120:18;;;10113:59;10189:18;;22243:68:0;9860:353:1;22243:68:0;22355:51;22364:5;22371:7;22399:6;22380:16;:25;22355:8;:51::i;26500:1866::-;-1:-1:-1;;;;;26598:12:0;;26590:62;;;;-1:-1:-1;;;26590:62:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26671:10:0;;26663:58;;;;-1:-1:-1;;;26663:58:0;;;;;;;:::i;:::-;26749:1;26740:6;:10;26732:64;;;;-1:-1:-1;;;26732:64:0;;11230:2:1;26732:64:0;;;11212:21:1;11269:2;11249:18;;;11242:30;11308:34;11288:18;;;11281:62;-1:-1:-1;;;11359:18:1;;;11352:39;11408:19;;26732:64:0;11028:405:1;26732:64:0;26824:4;26809:12;26885:7;960:6;;-1:-1:-1;;;;;960:6:0;;887:87;26885:7;-1:-1:-1;;;;;26877:15:0;:4;-1:-1:-1;;;;;26877:15:0;;;:32;;;;-1:-1:-1;960:6:0;;-1:-1:-1;;;;;26896:13:0;;;960:6;;26896:13;;26877:32;:46;;;;-1:-1:-1;;;;;;26913:10:0;;;;26877:46;:60;;;;-1:-1:-1;;;;;;26927:10:0;;25531:42;26927:10;;26877:60;:74;;;;-1:-1:-1;26942:9:0;;;;;;;26941:10;26877:74;26873:939;;;-1:-1:-1;;;;;26977:20:0;;;;;;:14;:20;;;;;;;;26976:21;:44;;;;-1:-1:-1;;;;;;27002:18:0;;;;;;:14;:18;;;;;;;;27001:19;26976:44;26968:69;;;;-1:-1:-1;;;26968:69:0;;11640:2:1;26968:69:0;;;11622:21:1;11679:2;11659:18;;;11652:30;-1:-1:-1;;;11698:18:1;;;11691:42;11750:18;;26968:69:0;11438:336:1;26968:69:0;27056:11;;;;27052:144;;-1:-1:-1;;;;;27096:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;27125:23:0;;;;;;:19;:23;;;;;;;;27096:52;27088:92;;;;-1:-1:-1;;;27088:92:0;;11981:2:1;27088:92:0;;;11963:21:1;12020:2;12000:18;;;11993:30;12059:29;12039:18;;;12032:57;12106:18;;27088:92:0;11779:351:1;27088:92:0;27222:14;;-1:-1:-1;;;;;27214:22:0;;;27222:14;;27214:22;:57;;;;-1:-1:-1;27254:16:0;;-1:-1:-1;;;;;27240:31:0;;;27254:16;;27240:31;;27214:57;:97;;;;-1:-1:-1;;;;;;27276:35:0;;;;;;:31;:35;;;;;;;;27275:36;27214:97;27210:323;;;27350:12;;27340:6;:22;;27332:76;;;;-1:-1:-1;;;27332:76:0;;12337:2:1;27332:76:0;;;12319:21:1;12376:2;12356:18;;;12349:30;12415:34;12395:18;;;12388:62;-1:-1:-1;;;12466:18:1;;;12459:39;12515:19;;27332:76:0;12135:405:1;27332:76:0;27461:15;;27451:6;27435:13;27445:2;-1:-1:-1;;;;;14104:18:0;14077:7;14104:18;;;;;;;;;;;;14003:127;27435:13;:22;;;;:::i;:::-;:41;;27427:90;;;;-1:-1:-1;;;27427:90:0;;12747:2:1;27427:90:0;;;12729:21:1;12786:2;12766:18;;;12759:30;12825:34;12805:18;;;12798:62;-1:-1:-1;;;12876:18:1;;;12869:34;12920:19;;27427:90:0;12545:400:1;27427:90:0;27557:14;;-1:-1:-1;;;;;27551:20:0;;;27557:14;;27551:20;:57;;;;-1:-1:-1;27591:16:0;;-1:-1:-1;;;;;27575:33:0;;;27591:16;;27575:33;;27551:57;:99;;;;-1:-1:-1;;;;;;27613:37:0;;;;;;:31;:37;;;;;;;;27612:38;27551:99;27547:254;;;27689:13;;27679:6;:23;;27671:78;;;;-1:-1:-1;;;27671:78:0;;13152:2:1;27671:78:0;;;13134:21:1;13191:2;13171:18;;;13164:30;13230:34;13210:18;;;13203:62;-1:-1:-1;;;13281:18:1;;;13274:40;13331:19;;27671:78:0;12950:406:1;27671:78:0;-1:-1:-1;27781:4:0;27547:254;-1:-1:-1;;;;;27827:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;27856:23:0;;;;;;:19;:23;;;;;;;;27827:52;27824:99;;;27906:5;27896:15;;27824:99;27979:4;27935:23;14104:18;;;;;;;;;;;27935:50;;27996:12;28030:19;;28012:15;:37;28011:53;;;;;28054:10;28011:53;27996:68;;28081:7;:22;;;;-1:-1:-1;28092:11:0;;;;;;;28081:22;:36;;;;-1:-1:-1;28108:9:0;;;;;;;28107:10;28081:36;:66;;;;-1:-1:-1;;;;;;28122:25:0;;;;;;:19;:25;;;;;;;;28121:26;28081:66;:94;;;;-1:-1:-1;;;;;;28152:23:0;;;;;;:19;:23;;;;;;;;28151:24;28081:94;28077:216;;;28192:9;:16;;-1:-1:-1;;28192:16:0;;;;;28223:26;28233:15;28223:9;:26::i;:::-;28264:9;:17;;-1:-1:-1;;28264:17:0;;;28077:216;28305:53;28320:4;28326:2;28330:6;28338:7;28347:10;28305:14;:53::i;:::-;26579:1787;;;;26500:1866;;;:::o;28879:475::-;28970:16;;;28984:1;28970:16;;;;;;;;28946:21;;28970:16;;;;;;;;;;-1:-1:-1;28970:16:0;28946:40;;29015:4;28997;29002:1;28997:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28997:23:0;;;:7;;;;;;;;;;:23;;;;29041:16;;:23;;;-1:-1:-1;;;29041:23:0;;;;:16;;;;;:21;;:23;;;;;28997:7;;29041:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29031:4;29036:1;29031:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29031:33:0;;;:7;;;;;;;;;:33;29107:16;;29075:63;;29092:4;;29107:16;29126:11;29075:8;:63::i;:::-;29149:16;;:197;;-1:-1:-1;;;29149:197:0;;-1:-1:-1;;;;;29149:16:0;;;;:67;;:197;;29231:11;;29149:16;;29273:4;;29300;;29320:15;;29149:197;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28935:419;28879:475;:::o;2154:191::-;2247:6;;;-1:-1:-1;;;;;2264:17:0;;;-1:-1:-1;;;;;;2264:17:0;;;;;;;2297:40;;2247:6;;;2264:17;2247:6;;2297:40;;2228:16;;2297:40;2217:128;2154:191;:::o;29370:102::-;29428:19;;:36;;-1:-1:-1;;;;;29428:19:0;;;;:36;;;;;29457:6;;29428:19;:36;:19;:36;29457:6;29428:19;:36;;;;;;;;;;;;;;;;;;;;;29370:102;:::o;5440:98::-;5498:7;5525:5;5529:1;5525;:5;:::i;:::-;5518:12;5440:98;-1:-1:-1;;;5440:98:0:o;5839:::-;5897:7;5924:5;5928:1;5924;:5;:::i;28374:497::-;28438:12;28475:20;;;:43;;-1:-1:-1;28499:14:0;;:19;28475:43;28471:82;;;28535:7;28374:497;:::o;28471:82::-;28587:19;;:26;;28611:1;28587:23;:26::i;:::-;28569:15;:44;28565:121;;;28648:19;;:26;;28672:1;28648:23;:26::i;:::-;28630:44;;28565:121;28698:33;28715:15;28698:16;:33::i;:::-;28769:1;28752:14;:18;;;28804:19;;28796:67;;-1:-1:-1;;;;;28804:19:0;;;;28837:21;;28796:67;;28769:1;28796:67;28837:21;28804:19;28796:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28374:497:0:o;32780:390::-;32907:7;32902:130;;32931:14;:12;:14::i;:::-;32902:130;;;32987:33;32997:6;33005;33013;32987:9;:33::i;:::-;32978:42;;32902:130;33044:42;33060:6;33068:9;33079:6;33044:15;:42::i;:::-;33112:7;33107:56;;33136:15;32704;;32695:6;:24;32740:16;;32730:7;:26;32650:114;32404:234;32452:6;;:11;:27;;;;-1:-1:-1;32467:7:0;;:12;32452:27;32448:66;;;32404:234::o;32448:66::-;32544:6;;;32526:15;:24;32580:7;;;32561:16;:26;-1:-1:-1;32598:10:0;;;;32619:11;32404:234::o;33178:622::-;33260:7;33324:12;33302:18;;33283:16;;:37;;;;:::i;:::-;:53;33280:203;;33361:3;33353:5;:11;33280:203;;;33386:6;33382:101;;;33417:7;;33409:5;:15;33382:101;;;33465:6;;33457:5;:14;33382:101;33530:5;;33503:12;;33530:9;33526:136;;33563:34;25125:4;33563:17;33574:5;;33563:6;:10;;:17;;;;:::i;:34::-;33645:5;;33556:41;;-1:-1:-1;33630:12:0;33645:5;33556:41;33630:12;:::i;:::-;:20;;;;:::i;:::-;33612:14;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;33526:136:0;33678:8;;33674:85;;33703:44;33719:6;33735:4;33742;33703:15;:44::i;:::-;33778:14;33788:4;33778:14;;:::i;:::-;;33178:622;-1:-1:-1;;;;;33178:622:0:o;18195:840::-;-1:-1:-1;;;;;18326:18:0;;18318:68;;;;-1:-1:-1;;;18318:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18405:16:0;;18397:64;;;;-1:-1:-1;;;18397:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18547:15:0;;18525:19;18547:15;;;;;;;;;;;18581:21;;;;18573:72;;;;-1:-1:-1;;;18573:72:0;;15332:2:1;18573:72:0;;;15314:21:1;15371:2;15351:18;;;15344:30;15410:34;15390:18;;;15383:62;-1:-1:-1;;;15461:18:1;;;15454:36;15507:19;;18573:72:0;15130:402:1;18573:72:0;-1:-1:-1;;;;;18681:15:0;;;:9;:15;;;;;;;;;;;18699:20;;;18681:38;;18899:13;;;;;;;;;;:23;;;;;;18951:26;;1938:25:1;;;18899:13:0;;18951:26;;1911:18:1;18951:26:0;;;;;;;18990:37;31606:237;14:548:1;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:134;771:20;;800:31;771:20;800:31;:::i;:::-;703:134;;;:::o;842:315::-;910:6;918;971:2;959:9;950:7;946:23;942:32;939:52;;;987:1;984;977:12;939:52;1026:9;1013:23;1045:31;1070:5;1045:31;:::i;:::-;1095:5;1147:2;1132:18;;;;1119:32;;-1:-1:-1;;;842:315:1:o;1354:248::-;1422:6;1430;1483:2;1471:9;1462:7;1458:23;1454:32;1451:52;;;1499:1;1496;1489:12;1451:52;-1:-1:-1;;1522:23:1;;;1592:2;1577:18;;;1564:32;;-1:-1:-1;1354:248:1:o;1607:180::-;1666:6;1719:2;1707:9;1698:7;1694:23;1690:32;1687:52;;;1735:1;1732;1725:12;1687:52;-1:-1:-1;1758:23:1;;1607:180;-1:-1:-1;1607:180:1:o;1974:456::-;2051:6;2059;2067;2120:2;2108:9;2099:7;2095:23;2091:32;2088:52;;;2136:1;2133;2126:12;2088:52;2175:9;2162:23;2194:31;2219:5;2194:31;:::i;:::-;2244:5;-1:-1:-1;2301:2:1;2286:18;;2273:32;2314:33;2273:32;2314:33;:::i;:::-;1974:456;;2366:7;;-1:-1:-1;;;2420:2:1;2405:18;;;;2392:32;;1974:456::o;2624:118::-;2710:5;2703:13;2696:21;2689:5;2686:32;2676:60;;2732:1;2729;2722:12;2747:128;2812:20;;2841:28;2812:20;2841:28;:::i;2880:382::-;2945:6;2953;3006:2;2994:9;2985:7;2981:23;2977:32;2974:52;;;3022:1;3019;3012:12;2974:52;3061:9;3048:23;3080:31;3105:5;3080:31;:::i;:::-;3130:5;-1:-1:-1;3187:2:1;3172:18;;3159:32;3200:30;3159:32;3200:30;:::i;:::-;3249:7;3239:17;;;2880:382;;;;;:::o;3267:127::-;3328:10;3323:3;3319:20;3316:1;3309:31;3359:4;3356:1;3349:15;3383:4;3380:1;3373:15;3399:1191;3489:6;3497;3550:2;3538:9;3529:7;3525:23;3521:32;3518:52;;;3566:1;3563;3556:12;3518:52;3606:9;3593:23;3635:18;3676:2;3668:6;3665:14;3662:34;;;3692:1;3689;3682:12;3662:34;3730:6;3719:9;3715:22;3705:32;;3775:7;3768:4;3764:2;3760:13;3756:27;3746:55;;3797:1;3794;3787:12;3746:55;3833:2;3820:16;3855:4;3878:2;3874;3871:10;3868:36;;;3884:18;;:::i;:::-;3930:2;3927:1;3923:10;3962:2;3956:9;4025:2;4021:7;4016:2;4012;4008:11;4004:25;3996:6;3992:38;4080:6;4068:10;4065:22;4060:2;4048:10;4045:18;4042:46;4039:72;;;4091:18;;:::i;:::-;4127:2;4120:22;4177:18;;;4211:15;;;;-1:-1:-1;4253:11:1;;;4249:20;;;4281:19;;;4278:39;;;4313:1;4310;4303:12;4278:39;4337:11;;;;4357:148;4373:6;4368:3;4365:15;4357:148;;;4439:23;4458:3;4439:23;:::i;:::-;4427:36;;4390:12;;;;4483;;;;4357:148;;;4524:6;-1:-1:-1;4549:35:1;;-1:-1:-1;4565:18:1;;;4549:35;:::i;:::-;4539:45;;;;;;3399:1191;;;;;:::o;4595:241::-;4651:6;4704:2;4692:9;4683:7;4679:23;4675:32;4672:52;;;4720:1;4717;4710:12;4672:52;4759:9;4746:23;4778:28;4800:5;4778:28;:::i;4841:247::-;4900:6;4953:2;4941:9;4932:7;4928:23;4924:32;4921:52;;;4969:1;4966;4959:12;4921:52;5008:9;4995:23;5027:31;5052:5;5027:31;:::i;5301:388::-;5369:6;5377;5430:2;5418:9;5409:7;5405:23;5401:32;5398:52;;;5446:1;5443;5436:12;5398:52;5485:9;5472:23;5504:31;5529:5;5504:31;:::i;:::-;5554:5;-1:-1:-1;5611:2:1;5596:18;;5583:32;5624:33;5583:32;5624:33;:::i;5694:380::-;5773:1;5769:12;;;;5816;;;5837:61;;5891:4;5883:6;5879:17;5869:27;;5837:61;5944:2;5936:6;5933:14;5913:18;5910:38;5907:161;;5990:10;5985:3;5981:20;5978:1;5971:31;6025:4;6022:1;6015:15;6053:4;6050:1;6043:15;5907:161;;5694:380;;;:::o;6079:127::-;6140:10;6135:3;6131:20;6128:1;6121:31;6171:4;6168:1;6161:15;6195:4;6192:1;6185:15;6211:125;6276:9;;;6297:10;;;6294:36;;;6310:18;;:::i;6341:127::-;6402:10;6397:3;6393:20;6390:1;6383:31;6433:4;6430:1;6423:15;6457:4;6454:1;6447:15;6473:135;6512:3;6533:17;;;6530:43;;6553:18;;:::i;:::-;-1:-1:-1;6600:1:1;6589:13;;6473:135::o;7019:184::-;7089:6;7142:2;7130:9;7121:7;7117:23;7113:32;7110:52;;;7158:1;7155;7148:12;7110:52;-1:-1:-1;7181:16:1;;7019:184;-1:-1:-1;7019:184:1:o;7824:245::-;7891:6;7944:2;7932:9;7923:7;7919:23;7915:32;7912:52;;;7960:1;7957;7950:12;7912:52;7992:9;7986:16;8011:28;8033:5;8011:28;:::i;10218:401::-;10420:2;10402:21;;;10459:2;10439:18;;;10432:30;10498:34;10493:2;10478:18;;10471:62;-1:-1:-1;;;10564:2:1;10549:18;;10542:35;10609:3;10594:19;;10218:401::o;10624:399::-;10826:2;10808:21;;;10865:2;10845:18;;;10838:30;10904:34;10899:2;10884:18;;10877:62;-1:-1:-1;;;10970:2:1;10955:18;;10948:33;11013:3;10998:19;;10624:399::o;13361:251::-;13431:6;13484:2;13472:9;13463:7;13459:23;13455:32;13452:52;;;13500:1;13497;13490:12;13452:52;13532:9;13526:16;13551:31;13576:5;13551:31;:::i;13617:980::-;13879:4;13927:3;13916:9;13912:19;13958:6;13947:9;13940:25;13984:2;14022:6;14017:2;14006:9;14002:18;13995:34;14065:3;14060:2;14049:9;14045:18;14038:31;14089:6;14124;14118:13;14155:6;14147;14140:22;14193:3;14182:9;14178:19;14171:26;;14232:2;14224:6;14220:15;14206:29;;14253:1;14263:195;14277:6;14274:1;14271:13;14263:195;;;14342:13;;-1:-1:-1;;;;;14338:39:1;14326:52;;14433:15;;;;14398:12;;;;14374:1;14292:9;14263:195;;;-1:-1:-1;;;;;;;14514:32:1;;;;14509:2;14494:18;;14487:60;-1:-1:-1;;;14578:3:1;14563:19;14556:35;14475:3;13617:980;-1:-1:-1;;;13617:980:1:o;14602:168::-;14675:9;;;14706;;14723:15;;;14717:22;;14703:37;14693:71;;14744:18;;:::i;14775:217::-;14815:1;14841;14831:132;;14885:10;14880:3;14876:20;14873:1;14866:31;14920:4;14917:1;14910:15;14948:4;14945:1;14938:15;14831:132;-1:-1:-1;14977:9:1;;14775:217::o;14997:128::-;15064:9;;;15085:11;;;15082:37;;;15099:18;;:::i

Swarm Source

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