ETH Price: $2,611.22 (+0.97%)

Token

PepeSwap (PepeSwap)
 

Overview

Max Total Supply

1,000,000,000,000 PepeSwap

Holders

34

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
16,000,000,000 PepeSwap

Value
$0.00
0x250d1bfabc3a4c1578a492c27cf8d6695fc51098
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:
pepeswap

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 10 of 10: PepeSwap.sol
/*
Website & App: https://www.pepeswap.capital
PepeSwap Ann: https://t.me/PepeSwapAnnouncements
PepeSwap Token Portal: https://t.me/PepeSwapDEX
Twitter: https://twitter.com/PepeSwapDEX
*/
// SPDX-License-Identifier: MIT

// Solidity version specified
pragma solidity ^0.8.21;

// Importing necessary contracts and interfaces
import "./IERC20.sol";
import "./Ownable.sol";
import "./ERC20.sol";
import "./IUniswapV2Router02.sol";

// SafeMath library for secure arithmetic operations
library SafeMath {
    // Safe addition
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

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

    // Safe subtraction with error message
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }

    // Safe multiplication
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

    // Safe division with error message
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }
}

// Interface for the Uniswap V2 Factory contract
interface IUniswapV2Factory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

// Main contract definition
contract pepeswap is Context, IERC20, Ownable {
    
    using SafeMath for uint256;

    // Mapping to track token balances of users
    mapping (address => uint256) private _balances;
    uint256 private devFees;
    uint256 private liquidityFees;

    // Mapping to track allowed token transfers between users
    mapping (address => mapping (address => uint256)) private _allowances;

    // Various contract parameters and settings
    uint8 private constant _decimals = 9;
    uint256 private constant _totalSupply = 1000000000000 * 10**_decimals;
    string private constant _name = unicode"PepeSwap";
    string private constant _symbol = unicode"PepeSwap";
    uint256 public maxTx = 20000000000 * 10**_decimals;
    uint256 public maxWallet = 20000000000 * 10**_decimals;
    bool private limitsInPlace = true;

    // Contract fees and settings
    uint256 private taxFee = 20;
    uint8 private constant liquifyPercentage = 35;
    uint8 private constant devPercentage = 65;
    uint256 public _taxSwapThreshold = 5000000000 * 10**_decimals;
    uint256 public _maxTaxSwap = 5000000000 * 10**_decimals;
    address payable private devWallet = payable(0x16eC0638323862b388E9cE8FE62FE4B696B57dEa);
    address payable private liquidityWallet = payable(0x16eC0638323862b388E9cE8FE62FE4B696B57dEa);

    //Fee liquiditation prevention parameters
    uint256 public lastFeeBlock = 0;
    uint public feesThisBlock = 0;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;
    bool private uniswapPairSet = false;

    bool private inSwap = false;
    bool private swapEnabled = false;

    // Modifier to lock token swaps while they are being executed
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    // Contract constructor
    constructor () {
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);

        uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
    }

    // Private function to handle transfers and apply fees
    function transferAndBuild(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        uint256 taxAmount = 0;

        // Calculate tax amount if it's not a transaction from or to the owner
        if (from != owner() && to != owner()) {
            uint currentblock = block.number;
            taxAmount = amount.mul(taxFee).div(100);

            //If limits are in place for tx amount and wallet, check those
            if (limitsInPlace && from == uniswapV2Pair && to != address(uniswapV2Router) && to != address(devWallet) && to != address(liquidityWallet)) {
                require(amount <= maxTx, "Exceeds the _maxTxAmount.");
                require(balanceOf(to) + amount <= maxWallet, "Exceeds the maxWalletSize.");
            }

            uint256 contractTokenBalance = balanceOf(address(this));
            // Check if the token is eligible for liquidity swap
            if (!inSwap && to == uniswapV2Pair && swapEnabled && contractTokenBalance > _taxSwapThreshold) {
                if(checkLiquifyEligibility(currentblock)){
                    //Swap tokens for ETH
                    swapTokensForEth(min(amount,min(contractTokenBalance,_maxTaxSwap)));
                    // Transfer ETH to the dev wallet if balance exceeds a threshold     
                    devWallet.transfer(address(this).balance);
                }
            }
        }

        // Apply tax and transfer tokens
        if (taxAmount > 0) {
            // Transfer pepeswap tokens to the liquidity wallet
            uint256 liquifyAmount = getLiquifyAmount(taxAmount);
            _balances[liquidityWallet] = _balances[liquidityWallet].add(liquifyAmount);
            emit Transfer(from, liquidityWallet, liquifyAmount);

            //Store the rest of the tokens on the contract for dev fees to be sold
            uint256 devAmount = getDevAmount(taxAmount);
            _balances[address(this)] = _balances[address(this)].add(devAmount);
            emit Transfer(from, address(this), devAmount);
        }
        
        _balances[from] = _balances[from].sub(amount);
        _balances[to] = _balances[to].add(amount.sub(taxAmount));
        emit Transfer(from, to, amount.sub(taxAmount));
    }

    // Function to calculate the dev fee
    function getDevAmount(uint256 tokenAmount) private pure returns (uint256) {
        return tokenAmount.mul(devPercentage).div(100);
    }

    // Function to calculate the liquidity fee
    function getLiquifyAmount(uint256 tokenAmount) private pure returns (uint256) {
        return tokenAmount.mul(liquifyPercentage).div(100);
    }

    // Function to get the minimum of two numbers
    function min(uint256 a, uint256 b) private pure returns (uint256) {
        return (a > b) ? b : a;
    }

    // Function to swap tokens for ETH on the Uniswap V2 Router
    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    // Function to check if the token can be swapped for liquidity
    // This limits the possibility of fees triggering too often
    function checkLiquifyEligibility(uint currentblock) private returns (bool) {
        require(currentblock >= lastFeeBlock, "Blockchain state invalid");
        if (inSwap) {
            return false;
        } else if (currentblock > lastFeeBlock) {
            lastFeeBlock = currentblock;
            feesThisBlock = 0;
            return true;
        } else {
            if (feesThisBlock < 2) {
                feesThisBlock += 1;
                return true;
            } else {
                return false;
            }
        }
    }
    
    // Function to update trading limits and settings
    function SetPepeSettings(bool _limitsInPlace, uint256 _maxTxPercentage, uint256 _maxWalletPercentage, bool _swapEnabled) external onlyOwner {
        require(_maxTxPercentage > 1, "Max tx must be set to at least 1");
        require(_maxWalletPercentage > 1, "Max wallet must be set to at least 1");
        limitsInPlace = _limitsInPlace;
        maxTx = _totalSupply.mul(_maxTxPercentage).div(100);
        maxWallet = _totalSupply.mul(_maxWalletPercentage).div(100);
        swapEnabled = _swapEnabled;
    }
    
    function SetPepeTax(uint256 newTax) external onlyOwner {
    taxFee = newTax;
}

    // Implementation of ERC20 allowance function
    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    // Implementation of ERC20 approve function
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    // Internal function to approve token spending
    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    // Implementation of ERC20 transfer function
    function transfer(address recipient, uint256 amount) public override returns (bool) {
        transferAndBuild(_msgSender(), recipient, amount);
        return true;
    }

    // Implementation of ERC20 transferFrom function
    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        transferAndBuild(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    // ERC20 name function
    function name() public pure returns (string memory) {
        return _name;
    }

    // ERC20 symbol function
    function symbol() public pure returns (string memory) {
        return _symbol;
    }

    // ERC20 decimals function
    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    // ERC20 totalSupply function
    function totalSupply() public pure override returns (uint256) {
        return _totalSupply;
    }

    // ERC20 balanceOf function
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    // Fallback function to accept ETH
    receive() external payable {}
}

File 1 of 10: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 2 of 10: draft-IERC6093.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

File 3 of 10: ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./IERC20Metadata.sol";
import {Context} from "./Context.sol";
import {IERC20Errors} from "./draft-IERC6093.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * 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 returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 default value returned by this function, unless
     * it's 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 returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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 `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` 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 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        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 `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` 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.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

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

File 4 of 10: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}

File 5 of 10: IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

File 6 of 10: IERC6093.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

File 7 of 10: IUniswapV2Router01.sol
pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

File 8 of 10: IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

File 9 of 10: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "./Context.sol";

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

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bool","name":"_limitsInPlace","type":"bool"},{"internalType":"uint256","name":"_maxTxPercentage","type":"uint256"},{"internalType":"uint256","name":"_maxWalletPercentage","type":"uint256"},{"internalType":"bool","name":"_swapEnabled","type":"bool"}],"name":"SetPepeSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTax","type":"uint256"}],"name":"SetPepeTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_maxTaxSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxSwapThreshold","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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"feesThisBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastFeeBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a62000473565b62000023906404a817c8006200048a565b600555620000346009600a62000473565b62000045906404a817c8006200048a565b6006556007805460ff191660011790556014600855620000686009600a62000473565b620000799064012a05f2006200048a565b6009556009600a6200008c919062000473565b6200009d9064012a05f2006200048a565b600a55600b80547316ec0638323862b388e9ce8fe62fe4b696b57dea6001600160a01b03199182168117909255600c805490911690911790555f600d819055600e556010805462ffffff60a01b19169055348015620000fa575f80fd5b505f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620001496009600a62000473565b6200015a9064e8d4a510006200048a565b335f81815260016020526040812092909255907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6200019c6009600a62000473565b620001ad9064e8d4a510006200048a565b60405190815260200160405180910390a3600f80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000221573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002479190620004a4565b6001600160a01b031663c9c6539630600f5f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002a7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002cd9190620004a4565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000318573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200033e9190620004a4565b601080546001600160a01b0319166001600160a01b0392909216919091179055620004cc565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115620003b857815f19048211156200039c576200039c62000364565b80851615620003aa57918102915b93841c93908002906200037d565b509250929050565b5f82620003d0575060016200046d565b81620003de57505f6200046d565b8160018114620003f75760028114620004025762000422565b60019150506200046d565b60ff84111562000416576200041662000364565b50506001821b6200046d565b5060208310610133831016604e8410600b841016171562000447575081810a6200046d565b62000453838362000378565b805f190482111562000469576200046962000364565b0290505b92915050565b5f6200048360ff841683620003c0565b9392505050565b80820281158282048414176200046d576200046d62000364565b5f60208284031215620004b5575f80fd5b81516001600160a01b038116811462000483575f80fd5b6114ca80620004da5f395ff3fe60806040526004361061011e575f3560e01c80637437681e1161009d578063ce5bbb9411610062578063ce5bbb94146102f5578063dd62ed3e14610314578063e4275bc114610358578063f2fde38b1461036d578063f8b45b051461038c575f80fd5b80637437681e146102865780638da5cb5b1461029b57806395d89b4114610129578063a9059cbb146102c1578063bf474bed146102e0575f80fd5b80631dfb8c30116100e35780631dfb8c30146101e357806323b872dd14610204578063313ce5671461022357806370a082311461023e578063715018a614610272575f80fd5b806306fdde0314610129578063095ea7b3146101685780630faee56f1461019757806318160ddd146101ba5780631a0a2e14146101ce575f80fd5b3661012557005b5f80fd5b348015610134575f80fd5b506040805180820182526008815267050657065537761760c41b6020820152905161015f91906110ee565b60405180910390f35b348015610173575f80fd5b5061018761018236600461114d565b6103a1565b604051901515815260200161015f565b3480156101a2575f80fd5b506101ac600a5481565b60405190815260200161015f565b3480156101c5575f80fd5b506101ac6103b7565b3480156101d9575f80fd5b506101ac600e5481565b3480156101ee575f80fd5b506102026101fd366004611186565b6103d8565b005b34801561020f575f80fd5b5061018761021e3660046111c9565b61050b565b34801561022e575f80fd5b506040516009815260200161015f565b348015610249575f80fd5b506101ac610258366004611207565b6001600160a01b03165f9081526001602052604090205490565b34801561027d575f80fd5b50610202610572565b348015610291575f80fd5b506101ac60055481565b3480156102a6575f80fd5b505f546040516001600160a01b03909116815260200161015f565b3480156102cc575f80fd5b506101876102db36600461114d565b610585565b3480156102eb575f80fd5b506101ac60095481565b348015610300575f80fd5b5061020261030f366004611222565b610591565b34801561031f575f80fd5b506101ac61032e366004611239565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b348015610363575f80fd5b506101ac600d5481565b348015610378575f80fd5b50610202610387366004611207565b61059e565b348015610397575f80fd5b506101ac60065481565b5f6103ad3384846105db565b5060015b92915050565b5f6103c46009600a611364565b6103d39064e8d4a51000611372565b905090565b6103e06106fe565b600183116104355760405162461bcd60e51b815260206004820181905260248201527f4d6178207478206d7573742062652073657420746f206174206c65617374203160448201526064015b60405180910390fd5b600182116104915760405162461bcd60e51b8152602060048201526024808201527f4d61782077616c6c6574206d7573742062652073657420746f206174206c65616044820152637374203160e01b606482015260840161042c565b6007805460ff19168515151790556104cf60646104c9856104b46009600a611364565b6104c39064e8d4a51000611372565b9061072a565b906107af565b6005556104e760646104c9846104b46009600a611364565b60065560108054911515600160b01b0260ff60b01b19909216919091179055505050565b5f6105178484846107f0565b61056884336105638560405180606001604052806028815260200161146d602891396001600160a01b038a165f9081526004602090815260408083203384529091529020549190610d3d565b6105db565b5060019392505050565b61057a6106fe565b6105835f610d75565b565b5f6103ad3384846107f0565b6105996106fe565b600855565b6105a66106fe565b6001600160a01b0381166105cf57604051631e4fbdf760e01b81525f600482015260240161042c565b6105d881610d75565b50565b6001600160a01b03831661063d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161042c565b6001600160a01b03821661069e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161042c565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f546001600160a01b031633146105835760405163118cdaa760e01b815233600482015260240161042c565b5f825f0361073957505f6103b1565b5f6107448385611372565b9050826107518583611389565b146107a85760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161042c565b9392505050565b5f6107a883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610dc4565b6001600160a01b0383166108545760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161042c565b6001600160a01b0382166108b65760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161042c565b5f81116109175760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161042c565b5f80546001600160a01b0385811691161480159061094257505f546001600160a01b03848116911614155b15610b6257600854439061095e906064906104c990869061072a565b60075490925060ff16801561098057506010546001600160a01b038681169116145b801561099a5750600f546001600160a01b03858116911614155b80156109b45750600b546001600160a01b03858116911614155b80156109ce5750600c546001600160a01b03858116911614155b15610a9f57600554831115610a255760405162461bcd60e51b815260206004820152601960248201527f4578636565647320746865205f6d61785478416d6f756e742e00000000000000604482015260640161042c565b60065483610a47866001600160a01b03165f9081526001602052604090205490565b610a5191906113a8565b1115610a9f5760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746865206d617857616c6c657453697a652e000000000000604482015260640161042c565b305f90815260016020526040902054601054600160a81b900460ff16158015610ad557506010546001600160a01b038681169116145b8015610aea5750601054600160b01b900460ff165b8015610af7575060095481115b15610b5f57610b0582610df0565b15610b5f57610b27610b2285610b1d84600a54610ea9565b610ea9565b610ebd565b600b546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015610b5d573d5f803e3d5ffd5b505b50505b8015610c78575f610b728261102d565b600c546001600160a01b03165f90815260016020526040902054909150610b99908261103e565b600c80546001600160a01b039081165f90815260016020908152604091829020949094559154915184815291811692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35f610c018361109c565b305f90815260016020526040902054909150610c1d908261103e565b305f81815260016020526040908190209290925590516001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610c6d9085815260200190565b60405180910390a350505b6001600160a01b0384165f90815260016020526040902054610c9a90836110ad565b6001600160a01b0385165f90815260016020526040902055610cdd610cbf83836110ad565b6001600160a01b0385165f908152600160205260409020549061103e565b6001600160a01b038085165f8181526001602052604090209290925585167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610d2685856110ad565b60405190815260200160405180910390a350505050565b5f8184841115610d605760405162461bcd60e51b815260040161042c91906110ee565b505f610d6c84866113bb565b95945050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8183610de45760405162461bcd60e51b815260040161042c91906110ee565b505f610d6c8486611389565b5f600d54821015610e435760405162461bcd60e51b815260206004820152601860248201527f426c6f636b636861696e20737461746520696e76616c69640000000000000000604482015260640161042c565b601054600160a81b900460ff1615610e5c57505f919050565b600d54821115610e735750600d555f600e55600190565b6002600e541015610e9d576001600e5f828254610e9091906113a8565b9091555060019392505050565b505f919050565b919050565b5f818311610eb757826107a8565b50919050565b6010805460ff60a81b1916600160a81b1790556040805160028082526060820183525f9260208301908036833701905050905030815f81518110610f0357610f036113ce565b6001600160a01b03928316602091820292909201810191909152600f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015610f5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f7e91906113e2565b81600181518110610f9157610f916113ce565b6001600160a01b039283166020918202929092010152600f54610fb791309116846105db565b600f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790610fef9085905f908690309042906004016113fd565b5f604051808303815f87803b158015611006575f80fd5b505af1158015611018573d5f803e3d5ffd5b50506010805460ff60a81b1916905550505050565b5f6103b160646104c984602361072a565b5f8061104a83856113a8565b9050838110156107a85760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161042c565b5f6103b160646104c984604161072a565b5f6107a883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610d3d565b5f6020808352835180828501525f5b81811015611119578581018301518582016040015282016110fd565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146105d8575f80fd5b5f806040838503121561115e575f80fd5b823561116981611139565b946020939093013593505050565b80358015158114610ea4575f80fd5b5f805f8060808587031215611199575f80fd5b6111a285611177565b935060208501359250604085013591506111be60608601611177565b905092959194509250565b5f805f606084860312156111db575f80fd5b83356111e681611139565b925060208401356111f681611139565b929592945050506040919091013590565b5f60208284031215611217575f80fd5b81356107a881611139565b5f60208284031215611232575f80fd5b5035919050565b5f806040838503121561124a575f80fd5b823561125581611139565b9150602083013561126581611139565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156112be57815f19048211156112a4576112a4611270565b808516156112b157918102915b93841c9390800290611289565b509250929050565b5f826112d4575060016103b1565b816112e057505f6103b1565b81600181146112f657600281146113005761131c565b60019150506103b1565b60ff84111561131157611311611270565b50506001821b6103b1565b5060208310610133831016604e8410600b841016171561133f575081810a6103b1565b6113498383611284565b805f190482111561135c5761135c611270565b029392505050565b5f6107a860ff8416836112c6565b80820281158282048414176103b1576103b1611270565b5f826113a357634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156103b1576103b1611270565b818103818111156103b1576103b1611270565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156113f2575f80fd5b81516107a881611139565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b8181101561144b5784516001600160a01b031683529383019391830191600101611426565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220b4176b94ff00ba21b2040009d46ff2cb14a15093805bdc65cd23801f7c19cee964736f6c63430008150033

Deployed Bytecode

0x60806040526004361061011e575f3560e01c80637437681e1161009d578063ce5bbb9411610062578063ce5bbb94146102f5578063dd62ed3e14610314578063e4275bc114610358578063f2fde38b1461036d578063f8b45b051461038c575f80fd5b80637437681e146102865780638da5cb5b1461029b57806395d89b4114610129578063a9059cbb146102c1578063bf474bed146102e0575f80fd5b80631dfb8c30116100e35780631dfb8c30146101e357806323b872dd14610204578063313ce5671461022357806370a082311461023e578063715018a614610272575f80fd5b806306fdde0314610129578063095ea7b3146101685780630faee56f1461019757806318160ddd146101ba5780631a0a2e14146101ce575f80fd5b3661012557005b5f80fd5b348015610134575f80fd5b506040805180820182526008815267050657065537761760c41b6020820152905161015f91906110ee565b60405180910390f35b348015610173575f80fd5b5061018761018236600461114d565b6103a1565b604051901515815260200161015f565b3480156101a2575f80fd5b506101ac600a5481565b60405190815260200161015f565b3480156101c5575f80fd5b506101ac6103b7565b3480156101d9575f80fd5b506101ac600e5481565b3480156101ee575f80fd5b506102026101fd366004611186565b6103d8565b005b34801561020f575f80fd5b5061018761021e3660046111c9565b61050b565b34801561022e575f80fd5b506040516009815260200161015f565b348015610249575f80fd5b506101ac610258366004611207565b6001600160a01b03165f9081526001602052604090205490565b34801561027d575f80fd5b50610202610572565b348015610291575f80fd5b506101ac60055481565b3480156102a6575f80fd5b505f546040516001600160a01b03909116815260200161015f565b3480156102cc575f80fd5b506101876102db36600461114d565b610585565b3480156102eb575f80fd5b506101ac60095481565b348015610300575f80fd5b5061020261030f366004611222565b610591565b34801561031f575f80fd5b506101ac61032e366004611239565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b348015610363575f80fd5b506101ac600d5481565b348015610378575f80fd5b50610202610387366004611207565b61059e565b348015610397575f80fd5b506101ac60065481565b5f6103ad3384846105db565b5060015b92915050565b5f6103c46009600a611364565b6103d39064e8d4a51000611372565b905090565b6103e06106fe565b600183116104355760405162461bcd60e51b815260206004820181905260248201527f4d6178207478206d7573742062652073657420746f206174206c65617374203160448201526064015b60405180910390fd5b600182116104915760405162461bcd60e51b8152602060048201526024808201527f4d61782077616c6c6574206d7573742062652073657420746f206174206c65616044820152637374203160e01b606482015260840161042c565b6007805460ff19168515151790556104cf60646104c9856104b46009600a611364565b6104c39064e8d4a51000611372565b9061072a565b906107af565b6005556104e760646104c9846104b46009600a611364565b60065560108054911515600160b01b0260ff60b01b19909216919091179055505050565b5f6105178484846107f0565b61056884336105638560405180606001604052806028815260200161146d602891396001600160a01b038a165f9081526004602090815260408083203384529091529020549190610d3d565b6105db565b5060019392505050565b61057a6106fe565b6105835f610d75565b565b5f6103ad3384846107f0565b6105996106fe565b600855565b6105a66106fe565b6001600160a01b0381166105cf57604051631e4fbdf760e01b81525f600482015260240161042c565b6105d881610d75565b50565b6001600160a01b03831661063d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161042c565b6001600160a01b03821661069e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161042c565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f546001600160a01b031633146105835760405163118cdaa760e01b815233600482015260240161042c565b5f825f0361073957505f6103b1565b5f6107448385611372565b9050826107518583611389565b146107a85760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161042c565b9392505050565b5f6107a883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610dc4565b6001600160a01b0383166108545760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161042c565b6001600160a01b0382166108b65760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161042c565b5f81116109175760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161042c565b5f80546001600160a01b0385811691161480159061094257505f546001600160a01b03848116911614155b15610b6257600854439061095e906064906104c990869061072a565b60075490925060ff16801561098057506010546001600160a01b038681169116145b801561099a5750600f546001600160a01b03858116911614155b80156109b45750600b546001600160a01b03858116911614155b80156109ce5750600c546001600160a01b03858116911614155b15610a9f57600554831115610a255760405162461bcd60e51b815260206004820152601960248201527f4578636565647320746865205f6d61785478416d6f756e742e00000000000000604482015260640161042c565b60065483610a47866001600160a01b03165f9081526001602052604090205490565b610a5191906113a8565b1115610a9f5760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746865206d617857616c6c657453697a652e000000000000604482015260640161042c565b305f90815260016020526040902054601054600160a81b900460ff16158015610ad557506010546001600160a01b038681169116145b8015610aea5750601054600160b01b900460ff165b8015610af7575060095481115b15610b5f57610b0582610df0565b15610b5f57610b27610b2285610b1d84600a54610ea9565b610ea9565b610ebd565b600b546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015610b5d573d5f803e3d5ffd5b505b50505b8015610c78575f610b728261102d565b600c546001600160a01b03165f90815260016020526040902054909150610b99908261103e565b600c80546001600160a01b039081165f90815260016020908152604091829020949094559154915184815291811692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35f610c018361109c565b305f90815260016020526040902054909150610c1d908261103e565b305f81815260016020526040908190209290925590516001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610c6d9085815260200190565b60405180910390a350505b6001600160a01b0384165f90815260016020526040902054610c9a90836110ad565b6001600160a01b0385165f90815260016020526040902055610cdd610cbf83836110ad565b6001600160a01b0385165f908152600160205260409020549061103e565b6001600160a01b038085165f8181526001602052604090209290925585167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610d2685856110ad565b60405190815260200160405180910390a350505050565b5f8184841115610d605760405162461bcd60e51b815260040161042c91906110ee565b505f610d6c84866113bb565b95945050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8183610de45760405162461bcd60e51b815260040161042c91906110ee565b505f610d6c8486611389565b5f600d54821015610e435760405162461bcd60e51b815260206004820152601860248201527f426c6f636b636861696e20737461746520696e76616c69640000000000000000604482015260640161042c565b601054600160a81b900460ff1615610e5c57505f919050565b600d54821115610e735750600d555f600e55600190565b6002600e541015610e9d576001600e5f828254610e9091906113a8565b9091555060019392505050565b505f919050565b919050565b5f818311610eb757826107a8565b50919050565b6010805460ff60a81b1916600160a81b1790556040805160028082526060820183525f9260208301908036833701905050905030815f81518110610f0357610f036113ce565b6001600160a01b03928316602091820292909201810191909152600f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015610f5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f7e91906113e2565b81600181518110610f9157610f916113ce565b6001600160a01b039283166020918202929092010152600f54610fb791309116846105db565b600f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790610fef9085905f908690309042906004016113fd565b5f604051808303815f87803b158015611006575f80fd5b505af1158015611018573d5f803e3d5ffd5b50506010805460ff60a81b1916905550505050565b5f6103b160646104c984602361072a565b5f8061104a83856113a8565b9050838110156107a85760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161042c565b5f6103b160646104c984604161072a565b5f6107a883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610d3d565b5f6020808352835180828501525f5b81811015611119578581018301518582016040015282016110fd565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146105d8575f80fd5b5f806040838503121561115e575f80fd5b823561116981611139565b946020939093013593505050565b80358015158114610ea4575f80fd5b5f805f8060808587031215611199575f80fd5b6111a285611177565b935060208501359250604085013591506111be60608601611177565b905092959194509250565b5f805f606084860312156111db575f80fd5b83356111e681611139565b925060208401356111f681611139565b929592945050506040919091013590565b5f60208284031215611217575f80fd5b81356107a881611139565b5f60208284031215611232575f80fd5b5035919050565b5f806040838503121561124a575f80fd5b823561125581611139565b9150602083013561126581611139565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156112be57815f19048211156112a4576112a4611270565b808516156112b157918102915b93841c9390800290611289565b509250929050565b5f826112d4575060016103b1565b816112e057505f6103b1565b81600181146112f657600281146113005761131c565b60019150506103b1565b60ff84111561131157611311611270565b50506001821b6103b1565b5060208310610133831016604e8410600b841016171561133f575081810a6103b1565b6113498383611284565b805f190482111561135c5761135c611270565b029392505050565b5f6107a860ff8416836112c6565b80820281158282048414176103b1576103b1611270565b5f826113a357634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156103b1576103b1611270565b818103818111156103b1576103b1611270565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156113f2575f80fd5b81516107a881611139565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b8181101561144b5784516001600160a01b031683529383019391830191600101611426565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220b4176b94ff00ba21b2040009d46ff2cb14a15093805bdc65cd23801f7c19cee964736f6c63430008150033

Deployed Bytecode Sourcemap

2123:9428:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10837:83;;;;;;;;;;-1:-1:-1;10907:5:8;;;;;;;;;;;-1:-1:-1;;;10907:5:8;;;;10837:83;;;;10907:5;10837:83;:::i;:::-;;;;;;;;9631:161;;;;;;;;;;-1:-1:-1;9631:161:8;;;;;:::i;:::-;;:::i;:::-;;;1188:14:10;;1181:22;1163:41;;1151:2;1136:18;9631:161:8;1023:187:10;3207:55:8;;;;;;;;;;;;;;;;;;;1361:25:10;;;1349:2;1334:18;3207:55:8;1215:177:10;11211:100:8;;;;;;;;;;;;;:::i;3550:29::-;;;;;;;;;;;;;;;;8761:518;;;;;;;;;;-1:-1:-1;8761:518:8;;;;;:::i;:::-;;:::i;:::-;;10481:320;;;;;;;;;;-1:-1:-1;10481:320:8;;;;;:::i;:::-;;:::i;11085:83::-;;;;;;;;;;-1:-1:-1;11085:83:8;;2612:1;2555:36:10;;2543:2;2528:18;11085:83:8;2413:184:10;11352:119:8;;;;;;;;;;-1:-1:-1;11352:119:8;;;;;:::i;:::-;-1:-1:-1;;;;;11445:18:8;11418:7;11445:18;;;:9;:18;;;;;;;11352:119;2253:101:7;;;;;;;;;;;;;:::i;2810:50:8:-;;;;;;;;;;;;;;;;1598:85:7;;;;;;;;;;-1:-1:-1;1644:7:7;1670:6;1598:85;;-1:-1:-1;;;;;1670:6:7;;;3000:51:10;;2988:2;2973:18;1598:85:7;2854:203:10;10245:174:8;;;;;;;;;;-1:-1:-1;10245:174:8;;;;;:::i;:::-;;:::i;3139:61::-;;;;;;;;;;;;;;;;9291:81;;;;;;;;;;-1:-1:-1;9291:81:8;;;;;:::i;:::-;;:::i;9431:143::-;;;;;;;;;;-1:-1:-1;9431:143:8;;;;;:::i;:::-;-1:-1:-1;;;;;9539:18:8;;;9512:7;9539:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9431:143;3512:31;;;;;;;;;;;;;;;;2503:215:7;;;;;;;;;;-1:-1:-1;2503:215:7;;;;;:::i;:::-;;:::i;2867:54:8:-;;;;;;;;;;;;;;;;9631:161;9706:4;9723:39;735:10:0;9746:7:8;9755:6;9723:8;:39::i;:::-;-1:-1:-1;9780:4:8;9631:161;;;;;:::o;11211:100::-;11264:7;2676:13;2612:1;2676:2;:13;:::i;:::-;2660:29;;:13;:29;:::i;:::-;11284:19;;11211:100;:::o;8761:518::-;1491:13:7;:11;:13::i;:::-;8939:1:8::1;8920:16;:20;8912:65;;;::::0;-1:-1:-1;;;8912:65:8;;5530:2:10;8912:65:8::1;::::0;::::1;5512:21:10::0;;;5549:18;;;5542:30;5608:34;5588:18;;;5581:62;5660:18;;8912:65:8::1;;;;;;;;;9019:1;8996:20;:24;8988:73;;;::::0;-1:-1:-1;;;8988:73:8;;5891:2:10;8988:73:8::1;::::0;::::1;5873:21:10::0;5930:2;5910:18;;;5903:30;5969:34;5949:18;;;5942:62;-1:-1:-1;;;6020:18:10;;;6013:34;6064:19;;8988:73:8::1;5689:400:10::0;8988:73:8::1;9072:13;:30:::0;;-1:-1:-1;;9072:30:8::1;::::0;::::1;;;::::0;;9121:43:::1;9160:3;9121:34;9138:16:::0;2676:13:::1;2612:1;2676:2;:13;:::i;:::-;2660:29;::::0;:13:::1;:29;:::i;:::-;9121:16:::0;::::1;:34::i;:::-;:38:::0;::::1;:43::i;:::-;9113:5;:51:::0;9187:47:::1;9230:3;9187:38;9204:20:::0;2676:13:::1;2612:1;2676:2;:13;:::i;9187:47::-;9175:9;:59:::0;9245:11:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;9245:26:8::1;-1:-1:-1::0;;;;9245:26:8;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;8761:518:8:o;10481:320::-;10579:4;10596:43;10613:6;10621:9;10632:6;10596:16;:43::i;:::-;10650:121;10659:6;735:10:0;10681:89:8;10719:6;10681:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10681:19:8;;;;;;:11;:19;;;;;;;;735:10:0;10681:33:8;;;;;;;;;;:37;:89::i;:::-;10650:8;:121::i;:::-;-1:-1:-1;10789:4:8;10481:320;;;;;:::o;2253:101:7:-;1491:13;:11;:13::i;:::-;2317:30:::1;2344:1;2317:18;:30::i;:::-;2253:101::o:0;10245:174:8:-;10323:4;10340:49;735:10:0;10371:9:8;10382:6;10340:16;:49::i;9291:81::-;1491:13:7;:11;:13::i;:::-;9353:6:8::1;:15:::0;9291:81::o;2503:215:7:-;1491:13;:11;:13::i;:::-;-1:-1:-1;;;;;2587:22:7;::::1;2583:91;;2632:31;::::0;-1:-1:-1;;;2632:31:7;;2660:1:::1;2632:31;::::0;::::1;3000:51:10::0;2973:18;;2632:31:7::1;2854:203:10::0;2583:91:7::1;2683:28;2702:8;2683:18;:28::i;:::-;2503:215:::0;:::o;9852:335:8:-;-1:-1:-1;;;;;9945:19:8;;9937:68;;;;-1:-1:-1;;;9937:68:8;;6296:2:10;9937:68:8;;;6278:21:10;6335:2;6315:18;;;6308:30;6374:34;6354:18;;;6347:62;-1:-1:-1;;;6425:18:10;;;6418:34;6469:19;;9937:68:8;6094:400:10;9937:68:8;-1:-1:-1;;;;;10024:21:8;;10016:68;;;;-1:-1:-1;;;10016:68:8;;6701:2:10;10016:68:8;;;6683:21:10;6740:2;6720:18;;;6713:30;6779:34;6759:18;;;6752:62;-1:-1:-1;;;6830:18:10;;;6823:32;6872:19;;10016:68:8;6499:398:10;10016:68:8;-1:-1:-1;;;;;10095:18:8;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10147:32;;1361:25:10;;;10147:32:8;;1334:18:10;10147:32:8;;;;;;;9852:335;;;:::o;1756:162:7:-;1644:7;1670:6;-1:-1:-1;;;;;1670:6:7;735:10:0;1815:23:7;1811:101;;1861:40;;-1:-1:-1;;;1861:40:7;;735:10:0;1861:40:7;;;3000:51:10;2973:18;;1861:40:7;2854:203:10;1173:246:8;1231:7;1255:1;1260;1255:6;1251:47;;-1:-1:-1;1285:1:8;1278:8;;1251:47;1308:9;1320:5;1324:1;1320;:5;:::i;:::-;1308:17;-1:-1:-1;1353:1:8;1344:5;1348:1;1308:17;1344:5;:::i;:::-;:10;1336:56;;;;-1:-1:-1;;;1336:56:8;;7326:2:10;1336:56:8;;;7308:21:10;7365:2;7345:18;;;7338:30;7404:34;7384:18;;;7377:62;-1:-1:-1;;;7455:18:10;;;7448:31;7496:19;;1336:56:8;7124:397:10;1336:56:8;1410:1;1173:246;-1:-1:-1;;;1173:246:8:o;1449:132::-;1507:7;1534:39;1538:1;1541;1534:39;;;;;;;;;;;;;;;;;:3;:39::i;4400:2477::-;-1:-1:-1;;;;;4495:18:8;;4487:68;;;;-1:-1:-1;;;4487:68:8;;7728:2:10;4487:68:8;;;7710:21:10;7767:2;7747:18;;;7740:30;7806:34;7786:18;;;7779:62;-1:-1:-1;;;7857:18:10;;;7850:35;7902:19;;4487:68:8;7526:401:10;4487:68:8;-1:-1:-1;;;;;4574:16:8;;4566:64;;;;-1:-1:-1;;;4566:64:8;;8134:2:10;4566:64:8;;;8116:21:10;8173:2;8153:18;;;8146:30;8212:34;8192:18;;;8185:62;-1:-1:-1;;;8263:18:10;;;8256:33;8306:19;;4566:64:8;7932:399:10;4566:64:8;4658:1;4649:6;:10;4641:64;;;;-1:-1:-1;;;4641:64:8;;8538:2:10;4641:64:8;;;8520:21:10;8577:2;8557:18;;;8550:30;8616:34;8596:18;;;8589:62;-1:-1:-1;;;8667:18:10;;;8660:39;8716:19;;4641:64:8;8336:405:10;4641:64:8;4716:17;1670:6:7;;-1:-1:-1;;;;;4834:15:8;;;1670:6:7;;4834:15:8;;;;:32;;-1:-1:-1;1644:7:7;1670:6;-1:-1:-1;;;;;4853:13:8;;;1670:6:7;;4853:13:8;;4834:32;4830:1194;;;4953:6;;4903:12;;4942:27;;4965:3;;4942:18;;:6;;:10;:18::i;:27::-;5066:13;;4930:39;;-1:-1:-1;5066:13:8;;:38;;;;-1:-1:-1;5091:13:8;;-1:-1:-1;;;;;5083:21:8;;;5091:13;;5083:21;5066:38;:72;;;;-1:-1:-1;5122:15:8;;-1:-1:-1;;;;;5108:30:8;;;5122:15;;5108:30;;5066:72;:100;;;;-1:-1:-1;5156:9:8;;-1:-1:-1;;;;;5142:24:8;;;5156:9;;5142:24;;5066:100;:134;;;;-1:-1:-1;5184:15:8;;-1:-1:-1;;;;;5170:30:8;;;5184:15;;5170:30;;5066:134;5062:321;;;5239:5;;5229:6;:15;;5221:53;;;;-1:-1:-1;;;5221:53:8;;8948:2:10;5221:53:8;;;8930:21:10;8987:2;8967:18;;;8960:30;9026:27;9006:18;;;8999:55;9071:18;;5221:53:8;8746:349:10;5221:53:8;5327:9;;5317:6;5301:13;5311:2;-1:-1:-1;;;;;11445:18:8;11418:7;11445:18;;;:9;:18;;;;;;;11352:119;5301:13;:22;;;;:::i;:::-;:35;;5293:74;;;;-1:-1:-1;;;5293:74:8;;9432:2:10;5293:74:8;;;9414:21:10;9471:2;9451:18;;;9444:30;9510:28;9490:18;;;9483:56;9556:18;;5293:74:8;9230:350:10;5293:74:8;5448:4;5399:28;11445:18;;;:9;:18;;;;;;5540:6;;-1:-1:-1;;;5540:6:8;;;;5539:7;:30;;;;-1:-1:-1;5556:13:8;;-1:-1:-1;;;;;5550:19:8;;;5556:13;;5550:19;5539:30;:45;;;;-1:-1:-1;5573:11:8;;-1:-1:-1;;;5573:11:8;;;;5539:45;:89;;;;;5611:17;;5588:20;:40;5539:89;5535:478;;;5652:37;5676:12;5652:23;:37::i;:::-;5649:349;;;5756:67;5773:49;5777:6;5784:37;5788:20;5809:11;;5784:3;:37::i;:::-;5773:3;:49::i;:::-;5756:16;:67::i;:::-;5937:9;;:41;;-1:-1:-1;;;;;5937:9:8;;;;5956:21;5937:41;;;;;:9;:41;:9;:41;5956:21;5937:9;:41;;;;;;;;;;;;;;;;;;;;;5649:349;4868:1156;;4830:1194;6082:13;;6078:602;;6177:21;6201:27;6218:9;6201:16;:27::i;:::-;6282:15;;-1:-1:-1;;;;;6282:15:8;6272:26;;;;:9;:26;;;;;;6177:51;;-1:-1:-1;6272:45:8;;6177:51;6272:30;:45::i;:::-;6253:15;;;-1:-1:-1;;;;;6253:15:8;;;6243:26;;;;:9;:26;;;;;;;;;:74;;;;6352:15;;6337:46;;1361:25:10;;;6352:15:8;;;;6337:46;;;;;;1334:18:10;6337:46:8;;;;;;;6484:17;6504:23;6517:9;6504:12;:23::i;:::-;6587:4;6569:24;;;;:9;:24;;;;;;6484:43;;-1:-1:-1;6569:39:8;;6484:43;6569:28;:39::i;:::-;6560:4;6542:24;;;;:9;:24;;;;;;;:66;;;;6628:40;;-1:-1:-1;;;;;6628:40:8;;;;;;;6658:9;1361:25:10;;1349:2;1334:18;;1215:177;6628:40:8;;;;;;;;6097:583;;6078:602;-1:-1:-1;;;;;6718:15:8;;;;;;:9;:15;;;;;;:27;;6738:6;6718:19;:27::i;:::-;-1:-1:-1;;;;;6700:15:8;;;;;;:9;:15;;;;;:45;6772:40;6790:21;:6;6801:9;6790:10;:21::i;:::-;-1:-1:-1;;;;;6772:13:8;;;;;;:9;:13;;;;;;;:17;:40::i;:::-;-1:-1:-1;;;;;6756:13:8;;;;;;;:9;:13;;;;;:56;;;;6828:41;;;6847:21;:6;6858:9;6847:10;:21::i;:::-;6828:41;;1361:25:10;;;1349:2;1334:18;6828:41:8;;;;;;;4476:2401;4400:2477;;;:::o;947:190::-;1033:7;1069:12;1061:6;;;;1053:29;;;;-1:-1:-1;;;1053:29:8;;;;;;;;:::i;:::-;-1:-1:-1;1093:9:8;1105:5;1109:1;1105;:5;:::i;:::-;1093:17;947:190;-1:-1:-1;;;;;947:190:8:o;2872:187:7:-;2945:16;2964:6;;-1:-1:-1;;;;;2980:17:7;;;-1:-1:-1;;;;;;2980:17:7;;;;;;3012:40;;2964:6;;;;;;;3012:40;;2945:16;3012:40;2935:124;2872:187;:::o;1630:189:8:-;1716:7;1751:12;1744:5;1736:28;;;;-1:-1:-1;;;1736:28:8;;;;;;;;:::i;:::-;-1:-1:-1;1775:9:8;1787:5;1791:1;1787;:5;:::i;8132:562::-;8201:4;8242:12;;8226;:28;;8218:65;;;;-1:-1:-1;;;8218:65:8;;9920:2:10;8218:65:8;;;9902:21:10;9959:2;9939:18;;;9932:30;9998:26;9978:18;;;9971:54;10042:18;;8218:65:8;9718:348:10;8218:65:8;8298:6;;-1:-1:-1;;;8298:6:8;;;;8294:393;;;-1:-1:-1;8328:5:8;;8132:562;-1:-1:-1;8132:562:8:o;8294:393::-;8370:12;;8355;:27;8351:336;;;-1:-1:-1;8399:12:8;:27;8457:1;8441:13;:17;8480:4;;8132:562::o;8351:336::-;8537:1;8521:13;;:17;8517:159;;;8576:1;8559:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;8603:4:8;;8132:562;-1:-1:-1;;;8132:562:8:o;8517:159::-;-1:-1:-1;8655:5:8;;8132:562;-1:-1:-1;8132:562:8:o;8517:159::-;8132:562;;;:::o;7328:107::-;7385:7;7417:1;7413;:5;7412:15;;7426:1;7412:15;;;-1:-1:-1;7422:1:8;7328:107;-1:-1:-1;7328:107:8:o;7508:483::-;3891:6;:13;;-1:-1:-1;;;;3891:13:8;-1:-1:-1;;;3891:13:8;;;7610:16:::1;::::0;;7624:1:::1;7610:16:::0;;;;;::::1;::::0;;-1:-1:-1;;7610:16:8::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;7610:16:8::1;7586:40;;7655:4;7637;7642:1;7637:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7637:23:8;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;7681:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;7681:22:8;;;;:15;;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;7637:7;;7681:22;;;;;:15;:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7671:4;7676:1;7671:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7671:32:8;;::::1;:7;::::0;;::::1;::::0;;;;;:32;7746:15:::1;::::0;7714:62:::1;::::0;7731:4:::1;::::0;7746:15:::1;7764:11:::0;7714:8:::1;:62::i;:::-;7787:15;::::0;:196:::1;::::0;-1:-1:-1;;;7787:196:8;;-1:-1:-1;;;;;7787:15:8;;::::1;::::0;:66:::1;::::0;:196:::1;::::0;7868:11;;7787:15:::1;::::0;7910:4;;7937::::1;::::0;7957:15:::1;::::0;7787:196:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;3927:6:8;:14;;-1:-1:-1;;;;3927:14:8;;;-1:-1:-1;;;;7508:483:8:o;7122:147::-;7191:7;7218:43;7257:3;7218:34;:11;3082:2;7218:15;:34::i;547:179::-;605:7;;637:5;641:1;637;:5;:::i;:::-;625:17;;666:1;661;:6;;653:46;;;;-1:-1:-1;;;653:46:8;;11778:2:10;653:46:8;;;11760:21:10;11817:2;11797:18;;;11790:30;11856:29;11836:18;;;11829:57;11903:18;;653:46:8;11576:351:10;6927:139:8;6992:7;7019:39;7054:3;7019:30;:11;3130:2;7019:15;:30::i;759:136::-;817:7;844:43;848:1;851;844:43;;;;;;;;;;;;;;;;;:3;:43::i;14:548:10:-;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:10;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:10:o;1397:160::-;1462:20;;1518:13;;1511:21;1501:32;;1491:60;;1547:1;1544;1537:12;1562:385;1642:6;1650;1658;1666;1719:3;1707:9;1698:7;1694:23;1690:33;1687:53;;;1736:1;1733;1726:12;1687:53;1759:26;1775:9;1759:26;:::i;:::-;1749:36;;1832:2;1821:9;1817:18;1804:32;1794:42;;1883:2;1872:9;1868:18;1855:32;1845:42;;1906:35;1937:2;1926:9;1922:18;1906:35;:::i;:::-;1896:45;;1562:385;;;;;;;:::o;1952:456::-;2029:6;2037;2045;2098:2;2086:9;2077:7;2073:23;2069:32;2066:52;;;2114:1;2111;2104:12;2066:52;2153:9;2140:23;2172:31;2197:5;2172:31;:::i;:::-;2222:5;-1:-1:-1;2279:2:10;2264:18;;2251:32;2292:33;2251:32;2292:33;:::i;:::-;1952:456;;2344:7;;-1:-1:-1;;;2398:2:10;2383:18;;;;2370:32;;1952:456::o;2602:247::-;2661:6;2714:2;2702:9;2693:7;2689:23;2685:32;2682:52;;;2730:1;2727;2720:12;2682:52;2769:9;2756:23;2788:31;2813:5;2788:31;:::i;3062:180::-;3121:6;3174:2;3162:9;3153:7;3149:23;3145:32;3142:52;;;3190:1;3187;3180:12;3142:52;-1:-1:-1;3213:23:10;;3062:180;-1:-1:-1;3062:180:10:o;3247:388::-;3315:6;3323;3376:2;3364:9;3355:7;3351:23;3347:32;3344:52;;;3392:1;3389;3382:12;3344:52;3431:9;3418:23;3450:31;3475:5;3450:31;:::i;:::-;3500:5;-1:-1:-1;3557:2:10;3542:18;;3529:32;3570:33;3529:32;3570:33;:::i;:::-;3622:7;3612:17;;;3247:388;;;;;:::o;3640:127::-;3701:10;3696:3;3692:20;3689:1;3682:31;3732:4;3729:1;3722:15;3756:4;3753:1;3746:15;3772:422;3861:1;3904:5;3861:1;3918:270;3939:7;3929:8;3926:21;3918:270;;;3998:4;3994:1;3990:6;3986:17;3980:4;3977:27;3974:53;;;4007:18;;:::i;:::-;4057:7;4047:8;4043:22;4040:55;;;4077:16;;;;4040:55;4156:22;;;;4116:15;;;;3918:270;;;3922:3;3772:422;;;;;:::o;4199:806::-;4248:5;4278:8;4268:80;;-1:-1:-1;4319:1:10;4333:5;;4268:80;4367:4;4357:76;;-1:-1:-1;4404:1:10;4418:5;;4357:76;4449:4;4467:1;4462:59;;;;4535:1;4530:130;;;;4442:218;;4462:59;4492:1;4483:10;;4506:5;;;4530:130;4567:3;4557:8;4554:17;4551:43;;;4574:18;;:::i;:::-;-1:-1:-1;;4630:1:10;4616:16;;4645:5;;4442:218;;4744:2;4734:8;4731:16;4725:3;4719:4;4716:13;4712:36;4706:2;4696:8;4693:16;4688:2;4682:4;4679:12;4675:35;4672:77;4669:159;;;-1:-1:-1;4781:19:10;;;4813:5;;4669:159;4860:34;4885:8;4879:4;4860:34;:::i;:::-;4930:6;4926:1;4922:6;4918:19;4909:7;4906:32;4903:58;;;4941:18;;:::i;:::-;4979:20;;4199:806;-1:-1:-1;;;4199:806:10:o;5010:140::-;5068:5;5097:47;5138:4;5128:8;5124:19;5118:4;5097:47;:::i;5155:168::-;5228:9;;;5259;;5276:15;;;5270:22;;5256:37;5246:71;;5297:18;;:::i;6902:217::-;6942:1;6968;6958:132;;7012:10;7007:3;7003:20;7000:1;6993:31;7047:4;7044:1;7037:15;7075:4;7072:1;7065:15;6958:132;-1:-1:-1;7104:9:10;;6902:217::o;9100:125::-;9165:9;;;9186:10;;;9183:36;;;9199:18;;:::i;9585:128::-;9652:9;;;9673:11;;;9670:37;;;9687:18;;:::i;10203:127::-;10264:10;10259:3;10255:20;10252:1;10245:31;10295:4;10292:1;10285:15;10319:4;10316:1;10309:15;10335:251;10405:6;10458:2;10446:9;10437:7;10433:23;10429:32;10426:52;;;10474:1;10471;10464:12;10426:52;10506:9;10500:16;10525:31;10550:5;10525:31;:::i;10591:980::-;10853:4;10901:3;10890:9;10886:19;10932:6;10921:9;10914:25;10958:2;10996:6;10991:2;10980:9;10976:18;10969:34;11039:3;11034:2;11023:9;11019:18;11012:31;11063:6;11098;11092:13;11129:6;11121;11114:22;11167:3;11156:9;11152:19;11145:26;;11206:2;11198:6;11194:15;11180:29;;11227:1;11237:195;11251:6;11248:1;11245:13;11237:195;;;11316:13;;-1:-1:-1;;;;;11312:39:10;11300:52;;11407:15;;;;11372:12;;;;11348:1;11266:9;11237:195;;;-1:-1:-1;;;;;;;11488:32:10;;;;11483:2;11468:18;;11461:60;-1:-1:-1;;;11552:3:10;11537:19;11530:35;11449:3;10591:980;-1:-1:-1;;;10591:980:10:o

Swarm Source

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