ETH Price: $3,478.60 (+2.54%)

Token

AnonPepe (APEPE)
 

Overview

Max Total Supply

10,000,000 APEPE

Holders

71

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
30,811.724137490632308476 APEPE

Value
$0.00
0x6004ead6aaa6cc5b6576cf43a3228d970311635a
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:
AnonPepe

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/**

Website: https://anonpepe.com/
Twitter: https://twitter.com/0xAnonPepe
Telegram: https://t.me/anonpepeportal
                                                                                                                                                                                                              
*/


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. 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 {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * 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.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the 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 override returns (uint8) {
        return 18;
    }

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

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

interface IWETH {
    function balanceOf(address account) external view returns (uint256);
    function approve(address guy, uint wad) external returns (bool);
}

contract AnonPepe is ERC20, Ownable {
    // events
    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );
    event ExcludeFromFees(address indexed account, bool excluded);
    event ExcludeFromMaxTransaction(address indexed account, bool excluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    // errors
    error ErrMintDisabled();
    error ErrERC20FromZero();
    error ErrERC20ToZero();
    error ErrTradingNotActive();
    error ErrBuyTransferExceedsMaxTransactionAmount();
    error ErrBuyExceedsMaxWallet();
    error ErrSellTransferExceedsMaxTransactionAmount();
    error ErrMaxWallet();
    error ErrMigrateDisabled();
    error ErrTotalSupplyExceeded();
    error ErrFeeTooHigh();
    error ErrSwapAmountTooLow();
    error ErrSwapAmountTooHigh();
    error ErrPairCannotBeRemoved();

    // constants
    uint256 public constant maxSupply = 10 * 1e6 ether;
    address constant devWallet = 0xb180A7756951db50Fe341f5Ed34BBe139709cbA7;
    IUniswapV2Router02 public constant uniswapV2Router =
        IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public immutable uniswapV2Pair;
    address private constant burnAddress = address(0xdead);

    // states
    bool public tradingEnabled = false;
    bool public swapEnabled = false;
    bool public limitsEnabled = true;

    uint256 public maxTransactionAmount;
    uint256 public maxWallet;
    uint256 public swapTokensAtAmount;

    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;

    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;

    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;

    bool private isSwapping;

    // - exclude from fees and max transaction amount
    mapping(address => bool) public isExcludedFromFees;
    mapping(address => bool) public isExcludedMaxTransactionAmount;

    // - store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    //   could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;

    // constructor
    constructor() ERC20("AnonPepe", unicode"APEPE") {
        // create uniswap pair
        address _uniswapPair = IUniswapV2Factory(uniswapV2Router.factory())
            .createPair(address(this), uniswapV2Router.WETH());
        uniswapV2Pair = _uniswapPair;

        // initialize states
        maxTransactionAmount = 2 * 1e5 ether; // 2% from total supply maxTransactionAmountTxn
        maxWallet = 2 * 1e5 ether; // 2% from total supply maxWallet
        swapTokensAtAmount = maxSupply / 1000; // 0.1% swap wallet

        buyLiquidityFee = 2;
        buyDevFee = 3;

        sellLiquidityFee = 10;
        sellDevFee = 10;

        // exclude from paying fees or having max transaction amount
        excludeFromFees(msg.sender, true);
        excludeFromFees(address(this), true);
        excludeFromFees(burnAddress, true);

        excludeFromMaxTransaction(address(uniswapV2Router), true);
        excludeFromMaxTransaction(address(_uniswapPair), true);
        excludeFromMaxTransaction(msg.sender, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(burnAddress, true);

        // set amm pair
        _setAutomatedMarketMakerPair(address(_uniswapPair), true);

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, maxSupply);
    }

    // receive
    receive() external payable {}

    // transfer
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (from == address(0)) {
            revert ErrERC20FromZero();
        }
        if (to == address(0)) {
            revert ErrERC20ToZero();
        }

        // zero amount
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        bool isBuying = automatedMarketMakerPairs[from] &&
            !isExcludedMaxTransactionAmount[to];
        bool isSelling = automatedMarketMakerPairs[to] &&
            !isExcludedMaxTransactionAmount[from];

        bool isOwner = from == owner() || to == owner();
        bool isBurning = to == burnAddress;

        // check limits
        if (limitsEnabled && !isSwapping && !isOwner && !isBurning) {
            if (!tradingEnabled) {
                if (!isExcludedFromFees[from] && !isExcludedFromFees[to]) {
                    revert ErrTradingNotActive();
                }
            }

            if (isBuying) {
                if (amount > maxTransactionAmount) {
                    revert ErrBuyTransferExceedsMaxTransactionAmount();
                }
                if (amount + balanceOf(to) > maxWallet) {
                    revert ErrBuyExceedsMaxWallet();
                }
            } else if (isSelling) {
                if (amount > maxTransactionAmount) {
                    revert ErrSellTransferExceedsMaxTransactionAmount();
                }
            } else if (!isExcludedMaxTransactionAmount[to]) {
                if (amount + balanceOf(to) > maxWallet) {
                    revert ErrMaxWallet();
                }
            }
        }

        // swap
        if (
            swapEnabled &&
            balanceOf(address(this)) >= swapTokensAtAmount &&
            !isSwapping &&
            !automatedMarketMakerPairs[from] &&
            !isExcludedFromFees[from] &&
            !isExcludedFromFees[to]
        ) {
            isSwapping = true;
            _swap();
            isSwapping = false;
        }

        // fees
        uint256 fees = 0;
        if (
            !isSwapping && !isExcludedFromFees[from] && !isExcludedFromFees[to]
        ) {
            // only take fees on buys/sells, never on wallet transfers
            uint256 sellTotalFees = sellLiquidityFee + sellDevFee;
            uint256 buyTotalFees = buyLiquidityFee + buyDevFee;

            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = (amount * sellTotalFees) / 100;
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForDev += (fees * sellDevFee) / sellTotalFees;
                super._transfer(from, address(this), fees);
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = (amount * buyTotalFees) / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForDev += (fees * buyDevFee) / buyTotalFees;
                super._transfer(from, address(this), fees);
            }
        }

        super._transfer(from, to, amount - fees);
    }

    // owners only
    function excludeFromMaxTransaction(address addr, bool excluded)
        public
        onlyOwner
    {
        isExcludedMaxTransactionAmount[addr] = excluded;
        emit ExcludeFromMaxTransaction(addr, excluded);
    }

    function excludeFromFees(address addr, bool excluded) public onlyOwner {
        isExcludedFromFees[addr] = excluded;
        emit ExcludeFromFees(addr, excluded);
    }

    function enableTrading() external onlyOwner {
        tradingEnabled = true;
        swapEnabled = true;
    }

    function pauseTrading() external onlyOwner {
        tradingEnabled = false;
        swapEnabled = false;
    }

    function removeLimits() external onlyOwner {
        limitsEnabled = false;
    }

    function setFees(
        uint256 _buyLiquidityFee,
        uint256 _buyDevFee,
        uint256 _sellLiquidityFee,
        uint256 _sellDevFee
    ) external onlyOwner {
        if (buyLiquidityFee + buyDevFee > 20) {
            revert ErrFeeTooHigh();
        }
        if (sellLiquidityFee + sellDevFee > 20) {
            revert ErrFeeTooHigh();
        }

        buyLiquidityFee = _buyLiquidityFee;
        buyDevFee = _buyDevFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellDevFee = _sellDevFee;
    }

    function setSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
        uint256 _totalSupply = totalSupply();
        if (newAmount < _totalSupply / 100000) {
            revert ErrSwapAmountTooLow();
        }
        if (newAmount > (_totalSupply * 5) / 1000) {
            revert ErrSwapAmountTooHigh();
        }
        swapTokensAtAmount = newAmount;
    }

    function setSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function setMaxTransactionAmount(uint256 max) external onlyOwner {
        maxTransactionAmount = max;
    }

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

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

    function _swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            devWallet,
            block.timestamp
        );
    }

    function _swap() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForDev;

        // nothing to swap
        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        // swap amount
        uint256 swapAmount = contractBalance;
        if (swapAmount > swapTokensAtAmount * 20) {
            swapAmount = swapTokensAtAmount * 20;
        }

        // split liquidity tokens - 0.5 keep as is, 0.5 swap to ETH
        uint256 totalLiquidityTokens = (swapAmount * tokensForLiquidity) /
            totalTokensToSwap;
        uint256 liquidityTokens = totalLiquidityTokens / 2;

        uint256 devTokens = swapAmount - totalLiquidityTokens;
        uint256 liquidityETHTokens = totalLiquidityTokens - liquidityTokens;

        uint256 initialETHBalance = address(this).balance;
        _swapTokensForEth(devTokens + liquidityETHTokens);
        uint256 gainedETH = address(this).balance - initialETHBalance;

        uint256 ethForLiquidity = (gainedETH * liquidityETHTokens) /
            (liquidityETHTokens + devTokens);

        // reset states
        tokensForLiquidity = 0;
        tokensForDev = 0;

        // add liquidity
        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                devTokens + liquidityETHTokens,
                gainedETH,
                liquidityTokens
            );
        }

        // dev transfer
        payable(address(devWallet)).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ErrBuyExceedsMaxWallet","type":"error"},{"inputs":[],"name":"ErrBuyTransferExceedsMaxTransactionAmount","type":"error"},{"inputs":[],"name":"ErrERC20FromZero","type":"error"},{"inputs":[],"name":"ErrERC20ToZero","type":"error"},{"inputs":[],"name":"ErrFeeTooHigh","type":"error"},{"inputs":[],"name":"ErrMaxWallet","type":"error"},{"inputs":[],"name":"ErrMigrateDisabled","type":"error"},{"inputs":[],"name":"ErrMintDisabled","type":"error"},{"inputs":[],"name":"ErrPairCannotBeRemoved","type":"error"},{"inputs":[],"name":"ErrSellTransferExceedsMaxTransactionAmount","type":"error"},{"inputs":[],"name":"ErrSwapAmountTooHigh","type":"error"},{"inputs":[],"name":"ErrSwapAmountTooLow","type":"error"},{"inputs":[],"name":"ErrTotalSupplyExceeded","type":"error"},{"inputs":[],"name":"ErrTradingNotActive","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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExcludeFromMaxTransaction","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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","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":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"_buyDevFee","type":"uint256"},{"internalType":"uint256","name":"_sellLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"_sellDevFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526000600560146101000a81548160ff0219169083151502179055506000600560156101000a81548160ff0219169083151502179055506001600560166101000a81548160ff0219169083151502179055503480156200006257600080fd5b506040518060400160405280600881526020017f416e6f6e506570650000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f41504550450000000000000000000000000000000000000000000000000000008152508160039081620000e0919062000bb5565b508060049081620000f2919062000bb5565b50505062000115620001096200042460201b60201c565b6200042c60201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000177573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019d919062000d06565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000d06565b6040518363ffffffff1660e01b81526004016200025e92919062000d49565b6020604051808303816000875af11580156200027e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a4919062000d06565b90508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050692a5a058fc295ed000000600681905550692a5a058fc295ed0000006007819055506103e86a084595161401484a00000062000317919062000dd4565b60088190555060026009819055506003600a81905550600a600b81905550600a600c8190555062000350336001620004f260201b60201c565b62000363306001620004f260201b60201c565b6200037861dead6001620004f260201b60201c565b6200039f737a250d5630b4cf539739df2c5dacb4c659f2488d6001620005ad60201b60201c565b620003b2816001620005ad60201b60201c565b620003c5336001620005ad60201b60201c565b620003d8306001620005ad60201b60201c565b620003ed61dead6001620005ad60201b60201c565b620004008160016200066860201b60201c565b6200041d336a084595161401484a0000006200070960201b60201c565b5062000fa4565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620005026200087660201b60201c565b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051620005a1919062000e29565b60405180910390a25050565b620005bd6200087660201b60201c565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fe0a7c1f8826ab3d62a6e242681ccca3828462e5c87816004b9f8d655b22d5f08826040516200065c919062000e29565b60405180910390a25050565b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200077b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007729062000ea7565b60405180910390fd5b6200078f600083836200090760201b60201c565b8060026000828254620007a3919062000ec9565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000856919062000f15565b60405180910390a362000872600083836200090c60201b60201c565b5050565b620008866200042460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620008ac6200091160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000905576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008fc9062000f82565b60405180910390fd5b565b505050565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009bd57607f821691505b602082108103620009d357620009d262000975565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000a3d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009fe565b62000a498683620009fe565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000a9662000a9062000a8a8462000a61565b62000a6b565b62000a61565b9050919050565b6000819050919050565b62000ab28362000a75565b62000aca62000ac18262000a9d565b84845462000a0b565b825550505050565b600090565b62000ae162000ad2565b62000aee81848462000aa7565b505050565b5b8181101562000b165762000b0a60008262000ad7565b60018101905062000af4565b5050565b601f82111562000b655762000b2f81620009d9565b62000b3a84620009ee565b8101602085101562000b4a578190505b62000b6262000b5985620009ee565b83018262000af3565b50505b505050565b600082821c905092915050565b600062000b8a6000198460080262000b6a565b1980831691505092915050565b600062000ba5838362000b77565b9150826002028217905092915050565b62000bc0826200093b565b67ffffffffffffffff81111562000bdc5762000bdb62000946565b5b62000be88254620009a4565b62000bf582828562000b1a565b600060209050601f83116001811462000c2d576000841562000c18578287015190505b62000c24858262000b97565b86555062000c94565b601f19841662000c3d86620009d9565b60005b8281101562000c675784890151825560018201915060208501945060208101905062000c40565b8683101562000c87578489015162000c83601f89168262000b77565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000cce8262000ca1565b9050919050565b62000ce08162000cc1565b811462000cec57600080fd5b50565b60008151905062000d008162000cd5565b92915050565b60006020828403121562000d1f5762000d1e62000c9c565b5b600062000d2f8482850162000cef565b91505092915050565b62000d438162000cc1565b82525050565b600060408201905062000d60600083018562000d38565b62000d6f602083018462000d38565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000de18262000a61565b915062000dee8362000a61565b92508262000e015762000e0062000d76565b5b828204905092915050565b60008115159050919050565b62000e238162000e0c565b82525050565b600060208201905062000e40600083018462000e18565b92915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000e8f601f8362000e46565b915062000e9c8262000e57565b602082019050919050565b6000602082019050818103600083015262000ec28162000e80565b9050919050565b600062000ed68262000a61565b915062000ee38362000a61565b925082820190508082111562000efe5762000efd62000da5565b5b92915050565b62000f0f8162000a61565b82525050565b600060208201905062000f2c600083018462000f04565b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000f6a60208362000e46565b915062000f778262000f32565b602082019050919050565b6000602082019050818103600083015262000f9d8162000f5b565b9050919050565b6080516135c662000fc06000396000610b7601526135c66000f3fe6080604052600436106102555760003560e01c80637571336a11610139578063b62496f5116100b6578063e01af92c1161007a578063e01af92c146108c5578063e2f45605146108ee578063f11a24d314610919578063f2fde38b14610944578063f63743421461096d578063f8b45b05146109985761025c565b8063b62496f5146107cc578063c024666814610809578063c8c8ebe414610832578063d5abeb011461085d578063dd62ed3e146108885761025c565b80639fccce32116100fd5780639fccce32146106d3578063a0d82dc5146106fe578063a457c2d714610729578063a9059cbb14610766578063afa4f3b2146107a35761025c565b80637571336a146106125780638a8c523c1461063b5780638da5cb5b1461065257806395d89b411461067d5780639c3b4fdc146106a85761025c565b806339509351116101d25780635d0044ca116101965780635d0044ca1461052a5780636ddd1713146105535780636fcba3771461057e57806370a08231146105a7578063715018a6146105e4578063751039fc146105fb5761025c565b8063395093511461041d57806349bd5a5e1461045a5780634ada218b146104855780634bb2c785146104b05780634fbee193146104ed5761025c565b80631a8145bb116102195780631a8145bb146103365780631e293c101461036157806323b872dd1461038a578063313ce567146103c75780633582ad23146103f25761025c565b806306fdde0314610261578063095ea7b31461028c5780631031e36e146102c95780631694505e146102e057806318160ddd1461030b5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b506102766109c3565b604051610283919061280b565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae91906128c6565b610a55565b6040516102c09190612921565b60405180910390f35b3480156102d557600080fd5b506102de610a78565b005b3480156102ec57600080fd5b506102f5610ab8565b604051610302919061299b565b60405180910390f35b34801561031757600080fd5b50610320610ad0565b60405161032d91906129c5565b60405180910390f35b34801561034257600080fd5b5061034b610ada565b60405161035891906129c5565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906129e0565b610ae0565b005b34801561039657600080fd5b506103b160048036038101906103ac9190612a0d565b610af2565b6040516103be9190612921565b60405180910390f35b3480156103d357600080fd5b506103dc610b21565b6040516103e99190612a7c565b60405180910390f35b3480156103fe57600080fd5b50610407610b2a565b6040516104149190612921565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f91906128c6565b610b3d565b6040516104519190612921565b60405180910390f35b34801561046657600080fd5b5061046f610b74565b60405161047c9190612aa6565b60405180910390f35b34801561049157600080fd5b5061049a610b98565b6040516104a79190612921565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d29190612ac1565b610bab565b6040516104e49190612921565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190612ac1565b610bcb565b6040516105219190612921565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c91906129e0565b610beb565b005b34801561055f57600080fd5b50610568610bfd565b6040516105759190612921565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190612aee565b610c10565b005b3480156105b357600080fd5b506105ce60048036038101906105c99190612ac1565b610cce565b6040516105db91906129c5565b60405180910390f35b3480156105f057600080fd5b506105f9610d16565b005b34801561060757600080fd5b50610610610d2a565b005b34801561061e57600080fd5b5061063960048036038101906106349190612b81565b610d4f565b005b34801561064757600080fd5b50610650610e00565b005b34801561065e57600080fd5b50610667610e40565b6040516106749190612aa6565b60405180910390f35b34801561068957600080fd5b50610692610e6a565b60405161069f919061280b565b60405180910390f35b3480156106b457600080fd5b506106bd610efc565b6040516106ca91906129c5565b60405180910390f35b3480156106df57600080fd5b506106e8610f02565b6040516106f591906129c5565b60405180910390f35b34801561070a57600080fd5b50610713610f08565b60405161072091906129c5565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b91906128c6565b610f0e565b60405161075d9190612921565b60405180910390f35b34801561077257600080fd5b5061078d600480360381019061078891906128c6565b610f85565b60405161079a9190612921565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c591906129e0565b610fa8565b005b3480156107d857600080fd5b506107f360048036038101906107ee9190612ac1565b611062565b6040516108009190612921565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b9190612b81565b611082565b005b34801561083e57600080fd5b50610847611133565b60405161085491906129c5565b60405180910390f35b34801561086957600080fd5b50610872611139565b60405161087f91906129c5565b60405180910390f35b34801561089457600080fd5b506108af60048036038101906108aa9190612bc1565b611148565b6040516108bc91906129c5565b60405180910390f35b3480156108d157600080fd5b506108ec60048036038101906108e79190612c01565b6111cf565b005b3480156108fa57600080fd5b506109036111f4565b60405161091091906129c5565b60405180910390f35b34801561092557600080fd5b5061092e6111fa565b60405161093b91906129c5565b60405180910390f35b34801561095057600080fd5b5061096b60048036038101906109669190612ac1565b611200565b005b34801561097957600080fd5b50610982611283565b60405161098f91906129c5565b60405180910390f35b3480156109a457600080fd5b506109ad611289565b6040516109ba91906129c5565b60405180910390f35b6060600380546109d290612c5d565b80601f01602080910402602001604051908101604052809291908181526020018280546109fe90612c5d565b8015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b820191906000526020600020905b815481529060010190602001808311610a2e57829003601f168201915b5050505050905090565b600080610a6061128f565b9050610a6d818585611297565b600191505092915050565b610a80611460565b6000600560146101000a81548160ff0219169083151502179055506000600560156101000a81548160ff021916908315150217905550565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b600d5481565b610ae8611460565b8060068190555050565b600080610afd61128f565b9050610b0a8582856114de565b610b1585858561156a565b60019150509392505050565b60006012905090565b600560169054906101000a900460ff1681565b600080610b4861128f565b9050610b69818585610b5a8589611148565b610b649190612cbd565b611297565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600560149054906101000a900460ff1681565b60116020528060005260406000206000915054906101000a900460ff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b610bf3611460565b8060078190555050565b600560159054906101000a900460ff1681565b610c18611460565b6014600a54600954610c2a9190612cbd565b1115610c62576040517fba45e96c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6014600c54600b54610c749190612cbd565b1115610cac576040517fba45e96c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360098190555082600a8190555081600b8190555080600c8190555050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d1e611460565b610d286000611f62565b565b610d32611460565b6000600560166101000a81548160ff021916908315150217905550565b610d57611460565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fe0a7c1f8826ab3d62a6e242681ccca3828462e5c87816004b9f8d655b22d5f0882604051610df49190612921565b60405180910390a25050565b610e08611460565b6001600560146101000a81548160ff0219169083151502179055506001600560156101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e7990612c5d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea590612c5d565b8015610ef25780601f10610ec757610100808354040283529160200191610ef2565b820191906000526020600020905b815481529060010190602001808311610ed557829003601f168201915b5050505050905090565b600a5481565b600e5481565b600c5481565b600080610f1961128f565b90506000610f278286611148565b905083811015610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6390612d63565b60405180910390fd5b610f798286868403611297565b60019250505092915050565b600080610f9061128f565b9050610f9d81858561156a565b600191505092915050565b610fb0611460565b6000610fba610ad0565b9050620186a081610fcb9190612db2565b821015611004576040517fb177ff5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e86005826110149190612de3565b61101e9190612db2565b821115611057576040517fa8b4c03400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816008819055505050565b60126020528060005260406000206000915054906101000a900460ff1681565b61108a611460565b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516111279190612921565b60405180910390a25050565b60065481565b6a084595161401484a00000081565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6111d7611460565b80600560156101000a81548160ff02191690831515021790555050565b60085481565b60095481565b611208611460565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126e90612e97565b60405180910390fd5b61128081611f62565b50565b600b5481565b60075481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd90612f29565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90612fbb565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161145391906129c5565b60405180910390a3505050565b61146861128f565b73ffffffffffffffffffffffffffffffffffffffff16611486610e40565b73ffffffffffffffffffffffffffffffffffffffff16146114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390613027565b60405180910390fd5b565b60006114ea8484611148565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115645781811015611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90613093565b60405180910390fd5b6115638484848403611297565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115d0576040517f9bb3027100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611636576040517fa614588500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000810361164f5761164a83836000612028565b611f5d565b6000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156116f45750601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b90506000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561179b5750601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b905060006117a7610e40565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148061181257506117e3610e40565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b9050600061dead73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16149050600560169054906101000a900460ff1680156118725750600f60009054906101000a900460ff16155b801561187c575081155b8015611886575080155b15611afc57600560149054906101000a900460ff1661197b57601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156119435750601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561197a576040517faa1d7f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8315611a11576006548511156119bd576040517ffff41cfd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546119c987610cce565b866119d49190612cbd565b1115611a0c576040517fcfdbc44900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611afb565b8215611a5857600654851115611a53576040517f90bce7c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611afa565b601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611af957600754611ab587610cce565b86611ac09190612cbd565b1115611af8576040517fe064ad6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b5b5b600560159054906101000a900460ff168015611b225750600854611b1f30610cce565b10155b8015611b3b5750600f60009054906101000a900460ff16155b8015611b915750601260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611be75750601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611c3d5750601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611c81576001600f60006101000a81548160ff021916908315150217905550611c6561229e565b6000600f60006101000a81548160ff0219169083151502179055505b6000600f60009054906101000a900460ff16158015611cea5750601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611d405750601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f41576000600c54600b54611d579190612cbd565b90506000600a54600954611d6b9190612cbd565b9050601260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611dc65750600082115b15611e575760648289611dd99190612de3565b611de39190612db2565b925081600b5484611df49190612de3565b611dfe9190612db2565b600d6000828254611e0f9190612cbd565b9250508190555081600c5484611e259190612de3565b611e2f9190612db2565b600e6000828254611e409190612cbd565b92505081905550611e528a3085612028565b611f3e565b601260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611eb05750600081115b15611f3d5760648189611ec39190612de3565b611ecd9190612db2565b92508060095484611ede9190612de3565b611ee89190612db2565b600d6000828254611ef99190612cbd565b9250508190555080600a5484611f0f9190612de3565b611f199190612db2565b600e6000828254611f2a9190612cbd565b92505081905550611f3c8a3085612028565b5b5b50505b611f5788888389611f5291906130b3565b612028565b50505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208e90613159565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd906131eb565b60405180910390fd5b612111838383612482565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e9061327d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161228591906129c5565b60405180910390a3612298848484612487565b50505050565b60006122a930610cce565b90506000600e54600d546122bd9190612cbd565b905060008214806122ce5750600081145b156122da575050612480565b600082905060146008546122ee9190612de3565b8111156123075760146008546123049190612de3565b90505b600082600d54836123189190612de3565b6123229190612db2565b905060006002826123339190612db2565b90506000828461234391906130b3565b90506000828461235391906130b3565b9050600047905061236e82846123699190612cbd565b61248c565b6000814761237c91906130b3565b90506000848461238c9190612cbd565b84836123989190612de3565b6123a29190612db2565b90506000600d819055506000600e819055506000861180156123c45750600081115b1561241a576123d386826126a5565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184866124009190612cbd565b83886040516124119392919061329d565b60405180910390a15b73b180a7756951db50fe341f5ed34bbe139709cba773ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612474573d6000803e3d6000fd5b50505050505050505050505b565b505050565b505050565b6000600267ffffffffffffffff8111156124a9576124a86132d4565b5b6040519080825280602002602001820160405280156124d75781602001602082028036833780820191505090505b50905030816000815181106124ef576124ee613303565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ac9190613347565b816001815181106125c0576125bf613303565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061261930737a250d5630b4cf539739df2c5dacb4c659f2488d84611297565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161266f95949392919061346d565b600060405180830381600087803b15801561268957600080fd5b505af115801561269d573d6000803e3d6000fd5b505050505050565b6126c430737a250d5630b4cf539739df2c5dacb4c659f2488d84611297565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008073b180a7756951db50fe341f5ed34bbe139709cba7426040518863ffffffff1660e01b8152600401612731969594939291906134c7565b60606040518083038185885af115801561274f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612774919061353d565b5050505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156127b557808201518184015260208101905061279a565b60008484015250505050565b6000601f19601f8301169050919050565b60006127dd8261277b565b6127e78185612786565b93506127f7818560208601612797565b612800816127c1565b840191505092915050565b6000602082019050818103600083015261282581846127d2565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061285d82612832565b9050919050565b61286d81612852565b811461287857600080fd5b50565b60008135905061288a81612864565b92915050565b6000819050919050565b6128a381612890565b81146128ae57600080fd5b50565b6000813590506128c08161289a565b92915050565b600080604083850312156128dd576128dc61282d565b5b60006128eb8582860161287b565b92505060206128fc858286016128b1565b9150509250929050565b60008115159050919050565b61291b81612906565b82525050565b60006020820190506129366000830184612912565b92915050565b6000819050919050565b600061296161295c61295784612832565b61293c565b612832565b9050919050565b600061297382612946565b9050919050565b600061298582612968565b9050919050565b6129958161297a565b82525050565b60006020820190506129b0600083018461298c565b92915050565b6129bf81612890565b82525050565b60006020820190506129da60008301846129b6565b92915050565b6000602082840312156129f6576129f561282d565b5b6000612a04848285016128b1565b91505092915050565b600080600060608486031215612a2657612a2561282d565b5b6000612a348682870161287b565b9350506020612a458682870161287b565b9250506040612a56868287016128b1565b9150509250925092565b600060ff82169050919050565b612a7681612a60565b82525050565b6000602082019050612a916000830184612a6d565b92915050565b612aa081612852565b82525050565b6000602082019050612abb6000830184612a97565b92915050565b600060208284031215612ad757612ad661282d565b5b6000612ae58482850161287b565b91505092915050565b60008060008060808587031215612b0857612b0761282d565b5b6000612b16878288016128b1565b9450506020612b27878288016128b1565b9350506040612b38878288016128b1565b9250506060612b49878288016128b1565b91505092959194509250565b612b5e81612906565b8114612b6957600080fd5b50565b600081359050612b7b81612b55565b92915050565b60008060408385031215612b9857612b9761282d565b5b6000612ba68582860161287b565b9250506020612bb785828601612b6c565b9150509250929050565b60008060408385031215612bd857612bd761282d565b5b6000612be68582860161287b565b9250506020612bf78582860161287b565b9150509250929050565b600060208284031215612c1757612c1661282d565b5b6000612c2584828501612b6c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c7557607f821691505b602082108103612c8857612c87612c2e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612cc882612890565b9150612cd383612890565b9250828201905080821115612ceb57612cea612c8e565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612d4d602583612786565b9150612d5882612cf1565b604082019050919050565b60006020820190508181036000830152612d7c81612d40565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612dbd82612890565b9150612dc883612890565b925082612dd857612dd7612d83565b5b828204905092915050565b6000612dee82612890565b9150612df983612890565b9250828202612e0781612890565b91508282048414831517612e1e57612e1d612c8e565b5b5092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612e81602683612786565b9150612e8c82612e25565b604082019050919050565b60006020820190508181036000830152612eb081612e74565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612f13602483612786565b9150612f1e82612eb7565b604082019050919050565b60006020820190508181036000830152612f4281612f06565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612fa5602283612786565b9150612fb082612f49565b604082019050919050565b60006020820190508181036000830152612fd481612f98565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613011602083612786565b915061301c82612fdb565b602082019050919050565b6000602082019050818103600083015261304081613004565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061307d601d83612786565b915061308882613047565b602082019050919050565b600060208201905081810360008301526130ac81613070565b9050919050565b60006130be82612890565b91506130c983612890565b92508282039050818111156130e1576130e0612c8e565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613143602583612786565b915061314e826130e7565b604082019050919050565b6000602082019050818103600083015261317281613136565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006131d5602383612786565b91506131e082613179565b604082019050919050565b60006020820190508181036000830152613204816131c8565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613267602683612786565b91506132728261320b565b604082019050919050565b600060208201905081810360008301526132968161325a565b9050919050565b60006060820190506132b260008301866129b6565b6132bf60208301856129b6565b6132cc60408301846129b6565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061334181612864565b92915050565b60006020828403121561335d5761335c61282d565b5b600061336b84828501613332565b91505092915050565b6000819050919050565b600061339961339461338f84613374565b61293c565b612890565b9050919050565b6133a98161337e565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133e481612852565b82525050565b60006133f683836133db565b60208301905092915050565b6000602082019050919050565b600061341a826133af565b61342481856133ba565b935061342f836133cb565b8060005b8381101561346057815161344788826133ea565b975061345283613402565b925050600181019050613433565b5085935050505092915050565b600060a08201905061348260008301886129b6565b61348f60208301876133a0565b81810360408301526134a1818661340f565b90506134b06060830185612a97565b6134bd60808301846129b6565b9695505050505050565b600060c0820190506134dc6000830189612a97565b6134e960208301886129b6565b6134f660408301876133a0565b61350360608301866133a0565b6135106080830185612a97565b61351d60a08301846129b6565b979650505050505050565b6000815190506135378161289a565b92915050565b6000806000606084860312156135565761355561282d565b5b600061356486828701613528565b935050602061357586828701613528565b925050604061358686828701613528565b915050925092509256fea264697066735822122077e14704444704c0f868017d79bc350a89f9f9e090522e735789692a5de767eb64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102555760003560e01c80637571336a11610139578063b62496f5116100b6578063e01af92c1161007a578063e01af92c146108c5578063e2f45605146108ee578063f11a24d314610919578063f2fde38b14610944578063f63743421461096d578063f8b45b05146109985761025c565b8063b62496f5146107cc578063c024666814610809578063c8c8ebe414610832578063d5abeb011461085d578063dd62ed3e146108885761025c565b80639fccce32116100fd5780639fccce32146106d3578063a0d82dc5146106fe578063a457c2d714610729578063a9059cbb14610766578063afa4f3b2146107a35761025c565b80637571336a146106125780638a8c523c1461063b5780638da5cb5b1461065257806395d89b411461067d5780639c3b4fdc146106a85761025c565b806339509351116101d25780635d0044ca116101965780635d0044ca1461052a5780636ddd1713146105535780636fcba3771461057e57806370a08231146105a7578063715018a6146105e4578063751039fc146105fb5761025c565b8063395093511461041d57806349bd5a5e1461045a5780634ada218b146104855780634bb2c785146104b05780634fbee193146104ed5761025c565b80631a8145bb116102195780631a8145bb146103365780631e293c101461036157806323b872dd1461038a578063313ce567146103c75780633582ad23146103f25761025c565b806306fdde0314610261578063095ea7b31461028c5780631031e36e146102c95780631694505e146102e057806318160ddd1461030b5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b506102766109c3565b604051610283919061280b565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae91906128c6565b610a55565b6040516102c09190612921565b60405180910390f35b3480156102d557600080fd5b506102de610a78565b005b3480156102ec57600080fd5b506102f5610ab8565b604051610302919061299b565b60405180910390f35b34801561031757600080fd5b50610320610ad0565b60405161032d91906129c5565b60405180910390f35b34801561034257600080fd5b5061034b610ada565b60405161035891906129c5565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906129e0565b610ae0565b005b34801561039657600080fd5b506103b160048036038101906103ac9190612a0d565b610af2565b6040516103be9190612921565b60405180910390f35b3480156103d357600080fd5b506103dc610b21565b6040516103e99190612a7c565b60405180910390f35b3480156103fe57600080fd5b50610407610b2a565b6040516104149190612921565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f91906128c6565b610b3d565b6040516104519190612921565b60405180910390f35b34801561046657600080fd5b5061046f610b74565b60405161047c9190612aa6565b60405180910390f35b34801561049157600080fd5b5061049a610b98565b6040516104a79190612921565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d29190612ac1565b610bab565b6040516104e49190612921565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190612ac1565b610bcb565b6040516105219190612921565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c91906129e0565b610beb565b005b34801561055f57600080fd5b50610568610bfd565b6040516105759190612921565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190612aee565b610c10565b005b3480156105b357600080fd5b506105ce60048036038101906105c99190612ac1565b610cce565b6040516105db91906129c5565b60405180910390f35b3480156105f057600080fd5b506105f9610d16565b005b34801561060757600080fd5b50610610610d2a565b005b34801561061e57600080fd5b5061063960048036038101906106349190612b81565b610d4f565b005b34801561064757600080fd5b50610650610e00565b005b34801561065e57600080fd5b50610667610e40565b6040516106749190612aa6565b60405180910390f35b34801561068957600080fd5b50610692610e6a565b60405161069f919061280b565b60405180910390f35b3480156106b457600080fd5b506106bd610efc565b6040516106ca91906129c5565b60405180910390f35b3480156106df57600080fd5b506106e8610f02565b6040516106f591906129c5565b60405180910390f35b34801561070a57600080fd5b50610713610f08565b60405161072091906129c5565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b91906128c6565b610f0e565b60405161075d9190612921565b60405180910390f35b34801561077257600080fd5b5061078d600480360381019061078891906128c6565b610f85565b60405161079a9190612921565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c591906129e0565b610fa8565b005b3480156107d857600080fd5b506107f360048036038101906107ee9190612ac1565b611062565b6040516108009190612921565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b9190612b81565b611082565b005b34801561083e57600080fd5b50610847611133565b60405161085491906129c5565b60405180910390f35b34801561086957600080fd5b50610872611139565b60405161087f91906129c5565b60405180910390f35b34801561089457600080fd5b506108af60048036038101906108aa9190612bc1565b611148565b6040516108bc91906129c5565b60405180910390f35b3480156108d157600080fd5b506108ec60048036038101906108e79190612c01565b6111cf565b005b3480156108fa57600080fd5b506109036111f4565b60405161091091906129c5565b60405180910390f35b34801561092557600080fd5b5061092e6111fa565b60405161093b91906129c5565b60405180910390f35b34801561095057600080fd5b5061096b60048036038101906109669190612ac1565b611200565b005b34801561097957600080fd5b50610982611283565b60405161098f91906129c5565b60405180910390f35b3480156109a457600080fd5b506109ad611289565b6040516109ba91906129c5565b60405180910390f35b6060600380546109d290612c5d565b80601f01602080910402602001604051908101604052809291908181526020018280546109fe90612c5d565b8015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b820191906000526020600020905b815481529060010190602001808311610a2e57829003601f168201915b5050505050905090565b600080610a6061128f565b9050610a6d818585611297565b600191505092915050565b610a80611460565b6000600560146101000a81548160ff0219169083151502179055506000600560156101000a81548160ff021916908315150217905550565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b600d5481565b610ae8611460565b8060068190555050565b600080610afd61128f565b9050610b0a8582856114de565b610b1585858561156a565b60019150509392505050565b60006012905090565b600560169054906101000a900460ff1681565b600080610b4861128f565b9050610b69818585610b5a8589611148565b610b649190612cbd565b611297565b600191505092915050565b7f0000000000000000000000004c8b814e8007b84dfddce246c9fbf5b35fa600fa81565b600560149054906101000a900460ff1681565b60116020528060005260406000206000915054906101000a900460ff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b610bf3611460565b8060078190555050565b600560159054906101000a900460ff1681565b610c18611460565b6014600a54600954610c2a9190612cbd565b1115610c62576040517fba45e96c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6014600c54600b54610c749190612cbd565b1115610cac576040517fba45e96c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360098190555082600a8190555081600b8190555080600c8190555050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d1e611460565b610d286000611f62565b565b610d32611460565b6000600560166101000a81548160ff021916908315150217905550565b610d57611460565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fe0a7c1f8826ab3d62a6e242681ccca3828462e5c87816004b9f8d655b22d5f0882604051610df49190612921565b60405180910390a25050565b610e08611460565b6001600560146101000a81548160ff0219169083151502179055506001600560156101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e7990612c5d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea590612c5d565b8015610ef25780601f10610ec757610100808354040283529160200191610ef2565b820191906000526020600020905b815481529060010190602001808311610ed557829003601f168201915b5050505050905090565b600a5481565b600e5481565b600c5481565b600080610f1961128f565b90506000610f278286611148565b905083811015610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6390612d63565b60405180910390fd5b610f798286868403611297565b60019250505092915050565b600080610f9061128f565b9050610f9d81858561156a565b600191505092915050565b610fb0611460565b6000610fba610ad0565b9050620186a081610fcb9190612db2565b821015611004576040517fb177ff5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e86005826110149190612de3565b61101e9190612db2565b821115611057576040517fa8b4c03400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816008819055505050565b60126020528060005260406000206000915054906101000a900460ff1681565b61108a611460565b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516111279190612921565b60405180910390a25050565b60065481565b6a084595161401484a00000081565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6111d7611460565b80600560156101000a81548160ff02191690831515021790555050565b60085481565b60095481565b611208611460565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126e90612e97565b60405180910390fd5b61128081611f62565b50565b600b5481565b60075481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd90612f29565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90612fbb565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161145391906129c5565b60405180910390a3505050565b61146861128f565b73ffffffffffffffffffffffffffffffffffffffff16611486610e40565b73ffffffffffffffffffffffffffffffffffffffff16146114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390613027565b60405180910390fd5b565b60006114ea8484611148565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115645781811015611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90613093565b60405180910390fd5b6115638484848403611297565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115d0576040517f9bb3027100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611636576040517fa614588500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000810361164f5761164a83836000612028565b611f5d565b6000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156116f45750601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b90506000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561179b5750601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b905060006117a7610e40565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148061181257506117e3610e40565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b9050600061dead73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16149050600560169054906101000a900460ff1680156118725750600f60009054906101000a900460ff16155b801561187c575081155b8015611886575080155b15611afc57600560149054906101000a900460ff1661197b57601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156119435750601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561197a576040517faa1d7f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8315611a11576006548511156119bd576040517ffff41cfd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546119c987610cce565b866119d49190612cbd565b1115611a0c576040517fcfdbc44900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611afb565b8215611a5857600654851115611a53576040517f90bce7c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611afa565b601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611af957600754611ab587610cce565b86611ac09190612cbd565b1115611af8576040517fe064ad6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b5b5b600560159054906101000a900460ff168015611b225750600854611b1f30610cce565b10155b8015611b3b5750600f60009054906101000a900460ff16155b8015611b915750601260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611be75750601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611c3d5750601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611c81576001600f60006101000a81548160ff021916908315150217905550611c6561229e565b6000600f60006101000a81548160ff0219169083151502179055505b6000600f60009054906101000a900460ff16158015611cea5750601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611d405750601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f41576000600c54600b54611d579190612cbd565b90506000600a54600954611d6b9190612cbd565b9050601260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611dc65750600082115b15611e575760648289611dd99190612de3565b611de39190612db2565b925081600b5484611df49190612de3565b611dfe9190612db2565b600d6000828254611e0f9190612cbd565b9250508190555081600c5484611e259190612de3565b611e2f9190612db2565b600e6000828254611e409190612cbd565b92505081905550611e528a3085612028565b611f3e565b601260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611eb05750600081115b15611f3d5760648189611ec39190612de3565b611ecd9190612db2565b92508060095484611ede9190612de3565b611ee89190612db2565b600d6000828254611ef99190612cbd565b9250508190555080600a5484611f0f9190612de3565b611f199190612db2565b600e6000828254611f2a9190612cbd565b92505081905550611f3c8a3085612028565b5b5b50505b611f5788888389611f5291906130b3565b612028565b50505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208e90613159565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd906131eb565b60405180910390fd5b612111838383612482565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e9061327d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161228591906129c5565b60405180910390a3612298848484612487565b50505050565b60006122a930610cce565b90506000600e54600d546122bd9190612cbd565b905060008214806122ce5750600081145b156122da575050612480565b600082905060146008546122ee9190612de3565b8111156123075760146008546123049190612de3565b90505b600082600d54836123189190612de3565b6123229190612db2565b905060006002826123339190612db2565b90506000828461234391906130b3565b90506000828461235391906130b3565b9050600047905061236e82846123699190612cbd565b61248c565b6000814761237c91906130b3565b90506000848461238c9190612cbd565b84836123989190612de3565b6123a29190612db2565b90506000600d819055506000600e819055506000861180156123c45750600081115b1561241a576123d386826126a5565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184866124009190612cbd565b83886040516124119392919061329d565b60405180910390a15b73b180a7756951db50fe341f5ed34bbe139709cba773ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612474573d6000803e3d6000fd5b50505050505050505050505b565b505050565b505050565b6000600267ffffffffffffffff8111156124a9576124a86132d4565b5b6040519080825280602002602001820160405280156124d75781602001602082028036833780820191505090505b50905030816000815181106124ef576124ee613303565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ac9190613347565b816001815181106125c0576125bf613303565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061261930737a250d5630b4cf539739df2c5dacb4c659f2488d84611297565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161266f95949392919061346d565b600060405180830381600087803b15801561268957600080fd5b505af115801561269d573d6000803e3d6000fd5b505050505050565b6126c430737a250d5630b4cf539739df2c5dacb4c659f2488d84611297565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008073b180a7756951db50fe341f5ed34bbe139709cba7426040518863ffffffff1660e01b8152600401612731969594939291906134c7565b60606040518083038185885af115801561274f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612774919061353d565b5050505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156127b557808201518184015260208101905061279a565b60008484015250505050565b6000601f19601f8301169050919050565b60006127dd8261277b565b6127e78185612786565b93506127f7818560208601612797565b612800816127c1565b840191505092915050565b6000602082019050818103600083015261282581846127d2565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061285d82612832565b9050919050565b61286d81612852565b811461287857600080fd5b50565b60008135905061288a81612864565b92915050565b6000819050919050565b6128a381612890565b81146128ae57600080fd5b50565b6000813590506128c08161289a565b92915050565b600080604083850312156128dd576128dc61282d565b5b60006128eb8582860161287b565b92505060206128fc858286016128b1565b9150509250929050565b60008115159050919050565b61291b81612906565b82525050565b60006020820190506129366000830184612912565b92915050565b6000819050919050565b600061296161295c61295784612832565b61293c565b612832565b9050919050565b600061297382612946565b9050919050565b600061298582612968565b9050919050565b6129958161297a565b82525050565b60006020820190506129b0600083018461298c565b92915050565b6129bf81612890565b82525050565b60006020820190506129da60008301846129b6565b92915050565b6000602082840312156129f6576129f561282d565b5b6000612a04848285016128b1565b91505092915050565b600080600060608486031215612a2657612a2561282d565b5b6000612a348682870161287b565b9350506020612a458682870161287b565b9250506040612a56868287016128b1565b9150509250925092565b600060ff82169050919050565b612a7681612a60565b82525050565b6000602082019050612a916000830184612a6d565b92915050565b612aa081612852565b82525050565b6000602082019050612abb6000830184612a97565b92915050565b600060208284031215612ad757612ad661282d565b5b6000612ae58482850161287b565b91505092915050565b60008060008060808587031215612b0857612b0761282d565b5b6000612b16878288016128b1565b9450506020612b27878288016128b1565b9350506040612b38878288016128b1565b9250506060612b49878288016128b1565b91505092959194509250565b612b5e81612906565b8114612b6957600080fd5b50565b600081359050612b7b81612b55565b92915050565b60008060408385031215612b9857612b9761282d565b5b6000612ba68582860161287b565b9250506020612bb785828601612b6c565b9150509250929050565b60008060408385031215612bd857612bd761282d565b5b6000612be68582860161287b565b9250506020612bf78582860161287b565b9150509250929050565b600060208284031215612c1757612c1661282d565b5b6000612c2584828501612b6c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c7557607f821691505b602082108103612c8857612c87612c2e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612cc882612890565b9150612cd383612890565b9250828201905080821115612ceb57612cea612c8e565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612d4d602583612786565b9150612d5882612cf1565b604082019050919050565b60006020820190508181036000830152612d7c81612d40565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612dbd82612890565b9150612dc883612890565b925082612dd857612dd7612d83565b5b828204905092915050565b6000612dee82612890565b9150612df983612890565b9250828202612e0781612890565b91508282048414831517612e1e57612e1d612c8e565b5b5092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612e81602683612786565b9150612e8c82612e25565b604082019050919050565b60006020820190508181036000830152612eb081612e74565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612f13602483612786565b9150612f1e82612eb7565b604082019050919050565b60006020820190508181036000830152612f4281612f06565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612fa5602283612786565b9150612fb082612f49565b604082019050919050565b60006020820190508181036000830152612fd481612f98565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613011602083612786565b915061301c82612fdb565b602082019050919050565b6000602082019050818103600083015261304081613004565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061307d601d83612786565b915061308882613047565b602082019050919050565b600060208201905081810360008301526130ac81613070565b9050919050565b60006130be82612890565b91506130c983612890565b92508282039050818111156130e1576130e0612c8e565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613143602583612786565b915061314e826130e7565b604082019050919050565b6000602082019050818103600083015261317281613136565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006131d5602383612786565b91506131e082613179565b604082019050919050565b60006020820190508181036000830152613204816131c8565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613267602683612786565b91506132728261320b565b604082019050919050565b600060208201905081810360008301526132968161325a565b9050919050565b60006060820190506132b260008301866129b6565b6132bf60208301856129b6565b6132cc60408301846129b6565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061334181612864565b92915050565b60006020828403121561335d5761335c61282d565b5b600061336b84828501613332565b91505092915050565b6000819050919050565b600061339961339461338f84613374565b61293c565b612890565b9050919050565b6133a98161337e565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133e481612852565b82525050565b60006133f683836133db565b60208301905092915050565b6000602082019050919050565b600061341a826133af565b61342481856133ba565b935061342f836133cb565b8060005b8381101561346057815161344788826133ea565b975061345283613402565b925050600181019050613433565b5085935050505092915050565b600060a08201905061348260008301886129b6565b61348f60208301876133a0565b81810360408301526134a1818661340f565b90506134b06060830185612a97565b6134bd60808301846129b6565b9695505050505050565b600060c0820190506134dc6000830189612a97565b6134e960208301886129b6565b6134f660408301876133a0565b61350360608301866133a0565b6135106080830185612a97565b61351d60a08301846129b6565b979650505050505050565b6000815190506135378161289a565b92915050565b6000806000606084860312156135565761355561282d565b5b600061356486828701613528565b935050602061357586828701613528565b925050604061358686828701613528565b915050925092509256fea264697066735822122077e14704444704c0f868017d79bc350a89f9f9e090522e735789692a5de767eb64736f6c63430008120033

Deployed Bytecode Sourcemap

26066:12143:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9394:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11754:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33847:114;;;;;;;;;;;;;:::i;:::-;;27278:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10523:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27909:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35098:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12535:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10365:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27611:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13205:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27409:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27532:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28129:62;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28072:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35216:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27573:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34060:539;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10694:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3052:103;;;;;;;;;;;;;:::i;:::-;;33969:83;;;;;;;;;;;;;:::i;:::-;;33311:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33726:113;;;;;;;;;;;;;:::i;:::-;;2411:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9613:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27804:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27949:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27875:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13946:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11027:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34607:378;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28353:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33546:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27652:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27143:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11283:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34993:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27725:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27767:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3310:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27837:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27694:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9394:100;9448:13;9481:5;9474:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9394:100;:::o;11754:201::-;11837:4;11854:13;11870:12;:10;:12::i;:::-;11854:28;;11893:32;11902:5;11909:7;11918:6;11893:8;:32::i;:::-;11943:4;11936:11;;;11754:201;;;;:::o;33847:114::-;2297:13;:11;:13::i;:::-;33918:5:::1;33901:14;;:22;;;;;;;;;;;;;;;;;;33948:5;33934:11;;:19;;;;;;;;;;;;;;;;;;33847:114::o:0;27278:124::-;27359:42;27278:124;:::o;10523:108::-;10584:7;10611:12;;10604:19;;10523:108;:::o;27909:33::-;;;;:::o;35098:110::-;2297:13;:11;:13::i;:::-;35197:3:::1;35174:20;:26;;;;35098:110:::0;:::o;12535:261::-;12632:4;12649:15;12667:12;:10;:12::i;:::-;12649:30;;12690:38;12706:4;12712:7;12721:6;12690:15;:38::i;:::-;12739:27;12749:4;12755:2;12759:6;12739:9;:27::i;:::-;12784:4;12777:11;;;12535:261;;;;;:::o;10365:93::-;10423:5;10448:2;10441:9;;10365:93;:::o;27611:32::-;;;;;;;;;;;;;:::o;13205:238::-;13293:4;13310:13;13326:12;:10;:12::i;:::-;13310:28;;13349:64;13358:5;13365:7;13402:10;13374:25;13384:5;13391:7;13374:9;:25::i;:::-;:38;;;;:::i;:::-;13349:8;:64::i;:::-;13431:4;13424:11;;;13205:238;;;;:::o;27409:38::-;;;:::o;27532:34::-;;;;;;;;;;;;;:::o;28129:62::-;;;;;;;;;;;;;;;;;;;;;;:::o;28072:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;35216:88::-;2297:13;:11;:13::i;:::-;35293:3:::1;35281:9;:15;;;;35216:88:::0;:::o;27573:31::-;;;;;;;;;;;;;:::o;34060:539::-;2297:13;:11;:13::i;:::-;34278:2:::1;34266:9;;34248:15;;:27;;;;:::i;:::-;:32;34244:87;;;34304:15;;;;;;;;;;;;;;34244:87;34377:2;34364:10;;34345:16;;:29;;;;:::i;:::-;:34;34341:89;;;34403:15;;;;;;;;;;;;;;34341:89;34460:16;34442:15;:34;;;;34499:10;34487:9;:22;;;;34539:17;34520:16;:36;;;;34580:11;34567:10;:24;;;;34060:539:::0;;;;:::o;10694:127::-;10768:7;10795:9;:18;10805:7;10795:18;;;;;;;;;;;;;;;;10788:25;;10694:127;;;:::o;3052:103::-;2297:13;:11;:13::i;:::-;3117:30:::1;3144:1;3117:18;:30::i;:::-;3052:103::o:0;33969:83::-;2297:13;:11;:13::i;:::-;34039:5:::1;34023:13;;:21;;;;;;;;;;;;;;;;;;33969:83::o:0;33311:227::-;2297:13;:11;:13::i;:::-;33465:8:::1;33426:30;:36;33457:4;33426:36;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;33515:4;33489:41;;;33521:8;33489:41;;;;;;:::i;:::-;;;;;;;;33311:227:::0;;:::o;33726:113::-;2297:13;:11;:13::i;:::-;33798:4:::1;33781:14;;:21;;;;;;;;;;;;;;;;;;33827:4;33813:11;;:18;;;;;;;;;;;;;;;;;;33726:113::o:0;2411:87::-;2457:7;2484:6;;;;;;;;;;;2477:13;;2411:87;:::o;9613:104::-;9669:13;9702:7;9695:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9613:104;:::o;27804:24::-;;;;:::o;27949:27::-;;;;:::o;27875:25::-;;;;:::o;13946:436::-;14039:4;14056:13;14072:12;:10;:12::i;:::-;14056:28;;14095:24;14122:25;14132:5;14139:7;14122:9;:25::i;:::-;14095:52;;14186:15;14166:16;:35;;14158:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14279:60;14288:5;14295:7;14323:15;14304:16;:34;14279:8;:60::i;:::-;14370:4;14363:11;;;;13946:436;;;;:::o;11027:193::-;11106:4;11123:13;11139:12;:10;:12::i;:::-;11123:28;;11162;11172:5;11179:2;11183:6;11162:9;:28::i;:::-;11208:4;11201:11;;;11027:193;;;;:::o;34607:378::-;2297:13;:11;:13::i;:::-;34687:20:::1;34710:13;:11;:13::i;:::-;34687:36;;34765:6;34750:12;:21;;;;:::i;:::-;34738:9;:33;34734:94;;;34795:21;;;;;;;;;;;;;;34734:94;34875:4;34870:1;34855:12;:16;;;;:::i;:::-;34854:25;;;;:::i;:::-;34842:9;:37;34838:99;;;34903:22;;;;;;;;;;;;;;34838:99;34968:9;34947:18;:30;;;;34676:309;34607:378:::0;:::o;28353:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;33546:172::-;2297:13;:11;:13::i;:::-;33655:8:::1;33628:18;:24;33647:4;33628:24;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;33695:4;33679:31;;;33701:8;33679:31;;;;;;:::i;:::-;;;;;;;;33546:172:::0;;:::o;27652:35::-;;;;:::o;27143:50::-;27179:14;27143:50;:::o;11283:151::-;11372:7;11399:11;:18;11411:5;11399:18;;;;;;;;;;;;;;;:27;11418:7;11399:27;;;;;;;;;;;;;;;;11392:34;;11283:151;;;;:::o;34993:97::-;2297:13;:11;:13::i;:::-;35075:7:::1;35061:11;;:21;;;;;;;;;;;;;;;;;;34993:97:::0;:::o;27725:33::-;;;;:::o;27767:30::-;;;;:::o;3310:201::-;2297:13;:11;:13::i;:::-;3419:1:::1;3399:22;;:8;:22;;::::0;3391:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3475:28;3494:8;3475:18;:28::i;:::-;3310:201:::0;:::o;27837:31::-;;;;:::o;27694:24::-;;;;:::o;1019:98::-;1072:7;1099:10;1092:17;;1019:98;:::o;17939:346::-;18058:1;18041:19;;:5;:19;;;18033:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18139:1;18120:21;;:7;:21;;;18112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18223:6;18193:11;:18;18205:5;18193:18;;;;;;;;;;;;;;;:27;18212:7;18193:27;;;;;;;;;;;;;;;:36;;;;18261:7;18245:32;;18254:5;18245:32;;;18270:6;18245:32;;;;;;:::i;:::-;;;;;;;;17939:346;;;:::o;2576:132::-;2651:12;:10;:12::i;:::-;2640:23;;:7;:5;:7::i;:::-;:23;;;2632:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2576:132::o;18576:419::-;18677:24;18704:25;18714:5;18721:7;18704:9;:25::i;:::-;18677:52;;18764:17;18744:16;:37;18740:248;;18826:6;18806:16;:26;;18798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18910:51;18919:5;18926:7;18954:6;18935:16;:25;18910:8;:51::i;:::-;18740:248;18666:329;18576:419;;;:::o;29963:3320::-;30107:1;30091:18;;:4;:18;;;30087:76;;30133:18;;;;;;;;;;;;;;30087:76;30191:1;30177:16;;:2;:16;;;30173:72;;30217:16;;;;;;;;;;;;;;30173:72;30295:1;30285:6;:11;30281:93;;30313:28;30329:4;30335:2;30339:1;30313:15;:28::i;:::-;30356:7;;30281:93;30386:13;30402:25;:31;30428:4;30402:31;;;;;;;;;;;;;;;;;;;;;;;;;:83;;;;;30451:30;:34;30482:2;30451:34;;;;;;;;;;;;;;;;;;;;;;;;;30450:35;30402:83;30386:99;;30496:14;30513:25;:29;30539:2;30513:29;;;;;;;;;;;;;;;;;;;;;;;;;:83;;;;;30560:30;:36;30591:4;30560:36;;;;;;;;;;;;;;;;;;;;;;;;;30559:37;30513:83;30496:100;;30609:12;30632:7;:5;:7::i;:::-;30624:15;;:4;:15;;;:32;;;;30649:7;:5;:7::i;:::-;30643:13;;:2;:13;;;30624:32;30609:47;;30667:14;27501:6;30684:17;;:2;:17;;;30667:34;;30743:13;;;;;;;;;;;:28;;;;;30761:10;;;;;;;;;;;30760:11;30743:28;:40;;;;;30776:7;30775:8;30743:40;:54;;;;;30788:9;30787:10;30743:54;30739:963;;;30819:14;;;;;;;;;;;30814:184;;30859:18;:24;30878:4;30859:24;;;;;;;;;;;;;;;;;;;;;;;;;30858:25;:52;;;;;30888:18;:22;30907:2;30888:22;;;;;;;;;;;;;;;;;;;;;;;;;30887:23;30858:52;30854:129;;;30942:21;;;;;;;;;;;;;;30854:129;30814:184;31018:8;31014:677;;;31060:20;;31051:6;:29;31047:128;;;31112:43;;;;;;;;;;;;;;31047:128;31222:9;;31206:13;31216:2;31206:9;:13::i;:::-;31197:6;:22;;;;:::i;:::-;:34;31193:114;;;31263:24;;;;;;;;;;;;;;31193:114;31014:677;;;31332:9;31328:363;;;31375:20;;31366:6;:29;31362:129;;;31427:44;;;;;;;;;;;;;;31362:129;31328:363;;;31517:30;:34;31548:2;31517:34;;;;;;;;;;;;;;;;;;;;;;;;;31512:179;;31601:9;;31585:13;31595:2;31585:9;:13::i;:::-;31576:6;:22;;;;:::i;:::-;:34;31572:104;;;31642:14;;;;;;;;;;;;;;31572:104;31512:179;31328:363;31014:677;30739:963;31749:11;;;;;;;;;;;:74;;;;;31805:18;;31777:24;31795:4;31777:9;:24::i;:::-;:46;;31749:74;:102;;;;;31841:10;;;;;;;;;;;31840:11;31749:102;:151;;;;;31869:25;:31;31895:4;31869:31;;;;;;;;;;;;;;;;;;;;;;;;;31868:32;31749:151;:193;;;;;31918:18;:24;31937:4;31918:24;;;;;;;;;;;;;;;;;;;;;;;;;31917:25;31749:193;:233;;;;;31960:18;:22;31979:2;31960:22;;;;;;;;;;;;;;;;;;;;;;;;;31959:23;31749:233;31731:362;;;32022:4;32009:10;;:17;;;;;;;;;;;;;;;;;;32041:7;:5;:7::i;:::-;32076:5;32063:10;;:18;;;;;;;;;;;;;;;;;;31731:362;32122:12;32168:10;;;;;;;;;;;32167:11;:40;;;;;32183:18;:24;32202:4;32183:24;;;;;;;;;;;;;;;;;;;;;;;;;32182:25;32167:40;:67;;;;;32212:18;:22;32231:2;32212:22;;;;;;;;;;;;;;;;;;;;;;;;;32211:23;32167:67;32149:1074;;;32333:21;32376:10;;32357:16;;:29;;;;:::i;:::-;32333:53;;32401:20;32442:9;;32424:15;;:27;;;;:::i;:::-;32401:50;;32496:25;:29;32522:2;32496:29;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;32545:1;32529:13;:17;32496:50;32492:720;;;32601:3;32584:13;32575:6;:22;;;;:::i;:::-;32574:30;;;;:::i;:::-;32567:37;;32673:13;32653:16;;32646:4;:23;;;;:::i;:::-;32645:41;;;;:::i;:::-;32623:18;;:63;;;;;;;:::i;:::-;;;;;;;;32743:13;32729:10;;32722:4;:17;;;;:::i;:::-;32721:35;;;;:::i;:::-;32705:12;;:51;;;;;;;:::i;:::-;;;;;;;;32775:42;32791:4;32805;32812;32775:15;:42::i;:::-;32492:720;;;32879:25;:31;32905:4;32879:31;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;;32929:1;32914:12;:16;32879:51;32875:337;;;32984:3;32968:12;32959:6;:21;;;;:::i;:::-;32958:29;;;;:::i;:::-;32951:36;;33055:12;33036:15;;33029:4;:22;;;;:::i;:::-;33028:39;;;;:::i;:::-;33006:18;;:61;;;;;;;:::i;:::-;;;;;;;;33123:12;33110:9;;33103:4;:16;;;;:::i;:::-;33102:33;;;;:::i;:::-;33086:12;;:49;;;;;;;:::i;:::-;;;;;;;;33154:42;33170:4;33184;33191;33154:15;:42::i;:::-;32875:337;32492:720;32246:977;;32149:1074;33235:40;33251:4;33257:2;33270:4;33261:6;:13;;;;:::i;:::-;33235:15;:40::i;:::-;30076:3207;;;;;29963:3320;;;;:::o;3671:191::-;3745:16;3764:6;;;;;;;;;;;3745:25;;3790:8;3781:6;;:17;;;;;;;;;;;;;;;;;;3845:8;3814:40;;3835:8;3814:40;;;;;;;;;;;;3734:128;3671:191;:::o;14852:806::-;14965:1;14949:18;;:4;:18;;;14941:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15042:1;15028:16;;:2;:16;;;15020:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;15097:38;15118:4;15124:2;15128:6;15097:20;:38::i;:::-;15148:19;15170:9;:15;15180:4;15170:15;;;;;;;;;;;;;;;;15148:37;;15219:6;15204:11;:21;;15196:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;15336:6;15322:11;:20;15304:9;:15;15314:4;15304:15;;;;;;;;;;;;;;;:38;;;;15539:6;15522:9;:13;15532:2;15522:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;15589:2;15574:26;;15583:4;15574:26;;;15593:6;15574:26;;;;;;:::i;:::-;;;;;;;;15613:37;15633:4;15639:2;15643:6;15613:19;:37::i;:::-;14930:728;14852:806;;;:::o;36526:1680::-;36562:23;36588:24;36606:4;36588:9;:24::i;:::-;36562:50;;36623:25;36672:12;;36651:18;;:33;;;;:::i;:::-;36623:61;;36748:1;36729:15;:20;:46;;;;36774:1;36753:17;:22;36729:46;36725:85;;;36792:7;;;;36725:85;36846:18;36867:15;36846:36;;36931:2;36910:18;;:23;;;;:::i;:::-;36897:10;:36;36893:105;;;36984:2;36963:18;;:23;;;;:::i;:::-;36950:36;;36893:105;37079:28;37159:17;37124:18;;37111:10;:31;;;;:::i;:::-;37110:66;;;;:::i;:::-;37079:97;;37187:23;37236:1;37213:20;:24;;;;:::i;:::-;37187:50;;37250:17;37283:20;37270:10;:33;;;;:::i;:::-;37250:53;;37314:26;37366:15;37343:20;:38;;;;:::i;:::-;37314:67;;37394:25;37422:21;37394:49;;37454;37484:18;37472:9;:30;;;;:::i;:::-;37454:17;:49::i;:::-;37514:17;37558;37534:21;:41;;;;:::i;:::-;37514:61;;37588:23;37684:9;37663:18;:30;;;;:::i;:::-;37627:18;37615:9;:30;;;;:::i;:::-;37614:80;;;;:::i;:::-;37588:106;;37753:1;37732:18;:22;;;;37780:1;37765:12;:16;;;;37842:1;37824:15;:19;:42;;;;;37865:1;37847:15;:19;37824:42;37820:282;;;37883:47;37897:15;37914;37883:13;:47::i;:::-;37950:140;37995:18;37983:9;:30;;;;:::i;:::-;38032:9;38060:15;37950:140;;;;;;;;:::i;:::-;;;;;;;;37820:282;27229:42;38139:36;;:59;38176:21;38139:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36551:1655;;;;;;;;;;36526:1680;:::o;19595:91::-;;;;:::o;20290:90::-;;;;:::o;35522:562::-;35649:21;35687:1;35673:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35649:40;;35718:4;35700;35705:1;35700:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;27359:42;35744:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35734:4;35739:1;35734:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;35779:62;35796:4;27359:42;35829:11;35779:8;:62::i;:::-;27359:42;35880:66;;;35961:11;35987:1;36003:4;36030;36050:15;35880:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35578:506;35522:562;:::o;36092:426::-;36209:62;36226:4;27359:42;36259:11;36209:8;:62::i;:::-;27359:42;36310:31;;;36349:9;36382:4;36402:11;36428:1;36444;27229:42;36484:15;36310:200;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;36092:426;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:60::-;3474:3;3495:5;3488:12;;3446:60;;;:::o;3512:142::-;3562:9;3595:53;3613:34;3622:24;3640:5;3622:24;:::i;:::-;3613:34;:::i;:::-;3595:53;:::i;:::-;3582:66;;3512:142;;;:::o;3660:126::-;3710:9;3743:37;3774:5;3743:37;:::i;:::-;3730:50;;3660:126;;;:::o;3792:153::-;3869:9;3902:37;3933:5;3902:37;:::i;:::-;3889:50;;3792:153;;;:::o;3951:185::-;4065:64;4123:5;4065:64;:::i;:::-;4060:3;4053:77;3951:185;;:::o;4142:276::-;4262:4;4300:2;4289:9;4285:18;4277:26;;4313:98;4408:1;4397:9;4393:17;4384:6;4313:98;:::i;:::-;4142:276;;;;:::o;4424:118::-;4511:24;4529:5;4511:24;:::i;:::-;4506:3;4499:37;4424:118;;:::o;4548:222::-;4641:4;4679:2;4668:9;4664:18;4656:26;;4692:71;4760:1;4749:9;4745:17;4736:6;4692:71;:::i;:::-;4548:222;;;;:::o;4776:329::-;4835:6;4884:2;4872:9;4863:7;4859:23;4855:32;4852:119;;;4890:79;;:::i;:::-;4852:119;5010:1;5035:53;5080:7;5071:6;5060:9;5056:22;5035:53;:::i;:::-;5025:63;;4981:117;4776:329;;;;:::o;5111:619::-;5188:6;5196;5204;5253:2;5241:9;5232:7;5228:23;5224:32;5221:119;;;5259:79;;:::i;:::-;5221:119;5379:1;5404:53;5449:7;5440:6;5429:9;5425:22;5404:53;:::i;:::-;5394:63;;5350:117;5506:2;5532:53;5577:7;5568:6;5557:9;5553:22;5532:53;:::i;:::-;5522:63;;5477:118;5634:2;5660:53;5705:7;5696:6;5685:9;5681:22;5660:53;:::i;:::-;5650:63;;5605:118;5111:619;;;;;:::o;5736:86::-;5771:7;5811:4;5804:5;5800:16;5789:27;;5736:86;;;:::o;5828:112::-;5911:22;5927:5;5911:22;:::i;:::-;5906:3;5899:35;5828:112;;:::o;5946:214::-;6035:4;6073:2;6062:9;6058:18;6050:26;;6086:67;6150:1;6139:9;6135:17;6126:6;6086:67;:::i;:::-;5946:214;;;;:::o;6166:118::-;6253:24;6271:5;6253:24;:::i;:::-;6248:3;6241:37;6166:118;;:::o;6290:222::-;6383:4;6421:2;6410:9;6406:18;6398:26;;6434:71;6502:1;6491:9;6487:17;6478:6;6434:71;:::i;:::-;6290:222;;;;:::o;6518:329::-;6577:6;6626:2;6614:9;6605:7;6601:23;6597:32;6594:119;;;6632:79;;:::i;:::-;6594:119;6752:1;6777:53;6822:7;6813:6;6802:9;6798:22;6777:53;:::i;:::-;6767:63;;6723:117;6518:329;;;;:::o;6853:765::-;6939:6;6947;6955;6963;7012:3;7000:9;6991:7;6987:23;6983:33;6980:120;;;7019:79;;:::i;:::-;6980:120;7139:1;7164:53;7209:7;7200:6;7189:9;7185:22;7164:53;:::i;:::-;7154:63;;7110:117;7266:2;7292:53;7337:7;7328:6;7317:9;7313:22;7292:53;:::i;:::-;7282:63;;7237:118;7394:2;7420:53;7465:7;7456:6;7445:9;7441:22;7420:53;:::i;:::-;7410:63;;7365:118;7522:2;7548:53;7593:7;7584:6;7573:9;7569:22;7548:53;:::i;:::-;7538:63;;7493:118;6853:765;;;;;;;:::o;7624:116::-;7694:21;7709:5;7694:21;:::i;:::-;7687:5;7684:32;7674:60;;7730:1;7727;7720:12;7674:60;7624:116;:::o;7746:133::-;7789:5;7827:6;7814:20;7805:29;;7843:30;7867:5;7843:30;:::i;:::-;7746:133;;;;:::o;7885:468::-;7950:6;7958;8007:2;7995:9;7986:7;7982:23;7978:32;7975:119;;;8013:79;;:::i;:::-;7975:119;8133:1;8158:53;8203:7;8194:6;8183:9;8179:22;8158:53;:::i;:::-;8148:63;;8104:117;8260:2;8286:50;8328:7;8319:6;8308:9;8304:22;8286:50;:::i;:::-;8276:60;;8231:115;7885:468;;;;;:::o;8359:474::-;8427:6;8435;8484:2;8472:9;8463:7;8459:23;8455:32;8452:119;;;8490:79;;:::i;:::-;8452:119;8610:1;8635:53;8680:7;8671:6;8660:9;8656:22;8635:53;:::i;:::-;8625:63;;8581:117;8737:2;8763:53;8808:7;8799:6;8788:9;8784:22;8763:53;:::i;:::-;8753:63;;8708:118;8359:474;;;;;:::o;8839:323::-;8895:6;8944:2;8932:9;8923:7;8919:23;8915:32;8912:119;;;8950:79;;:::i;:::-;8912:119;9070:1;9095:50;9137:7;9128:6;9117:9;9113:22;9095:50;:::i;:::-;9085:60;;9041:114;8839:323;;;;:::o;9168:180::-;9216:77;9213:1;9206:88;9313:4;9310:1;9303:15;9337:4;9334:1;9327:15;9354:320;9398:6;9435:1;9429:4;9425:12;9415:22;;9482:1;9476:4;9472:12;9503:18;9493:81;;9559:4;9551:6;9547:17;9537:27;;9493:81;9621:2;9613:6;9610:14;9590:18;9587:38;9584:84;;9640:18;;:::i;:::-;9584:84;9405:269;9354:320;;;:::o;9680:180::-;9728:77;9725:1;9718:88;9825:4;9822:1;9815:15;9849:4;9846:1;9839:15;9866:191;9906:3;9925:20;9943:1;9925:20;:::i;:::-;9920:25;;9959:20;9977:1;9959:20;:::i;:::-;9954:25;;10002:1;9999;9995:9;9988:16;;10023:3;10020:1;10017:10;10014:36;;;10030:18;;:::i;:::-;10014:36;9866:191;;;;:::o;10063:224::-;10203:34;10199:1;10191:6;10187:14;10180:58;10272:7;10267:2;10259:6;10255:15;10248:32;10063:224;:::o;10293:366::-;10435:3;10456:67;10520:2;10515:3;10456:67;:::i;:::-;10449:74;;10532:93;10621:3;10532:93;:::i;:::-;10650:2;10645:3;10641:12;10634:19;;10293:366;;;:::o;10665:419::-;10831:4;10869:2;10858:9;10854:18;10846:26;;10918:9;10912:4;10908:20;10904:1;10893:9;10889:17;10882:47;10946:131;11072:4;10946:131;:::i;:::-;10938:139;;10665:419;;;:::o;11090:180::-;11138:77;11135:1;11128:88;11235:4;11232:1;11225:15;11259:4;11256:1;11249:15;11276:185;11316:1;11333:20;11351:1;11333:20;:::i;:::-;11328:25;;11367:20;11385:1;11367:20;:::i;:::-;11362:25;;11406:1;11396:35;;11411:18;;:::i;:::-;11396:35;11453:1;11450;11446:9;11441:14;;11276:185;;;;:::o;11467:410::-;11507:7;11530:20;11548:1;11530:20;:::i;:::-;11525:25;;11564:20;11582:1;11564:20;:::i;:::-;11559:25;;11619:1;11616;11612:9;11641:30;11659:11;11641:30;:::i;:::-;11630:41;;11820:1;11811:7;11807:15;11804:1;11801:22;11781:1;11774:9;11754:83;11731:139;;11850:18;;:::i;:::-;11731:139;11515:362;11467:410;;;;:::o;11883:225::-;12023:34;12019:1;12011:6;12007:14;12000:58;12092:8;12087:2;12079:6;12075:15;12068:33;11883:225;:::o;12114:366::-;12256:3;12277:67;12341:2;12336:3;12277:67;:::i;:::-;12270:74;;12353:93;12442:3;12353:93;:::i;:::-;12471:2;12466:3;12462:12;12455:19;;12114:366;;;:::o;12486:419::-;12652:4;12690:2;12679:9;12675:18;12667:26;;12739:9;12733:4;12729:20;12725:1;12714:9;12710:17;12703:47;12767:131;12893:4;12767:131;:::i;:::-;12759:139;;12486:419;;;:::o;12911:223::-;13051:34;13047:1;13039:6;13035:14;13028:58;13120:6;13115:2;13107:6;13103:15;13096:31;12911:223;:::o;13140:366::-;13282:3;13303:67;13367:2;13362:3;13303:67;:::i;:::-;13296:74;;13379:93;13468:3;13379:93;:::i;:::-;13497:2;13492:3;13488:12;13481:19;;13140:366;;;:::o;13512:419::-;13678:4;13716:2;13705:9;13701:18;13693:26;;13765:9;13759:4;13755:20;13751:1;13740:9;13736:17;13729:47;13793:131;13919:4;13793:131;:::i;:::-;13785:139;;13512:419;;;:::o;13937:221::-;14077:34;14073:1;14065:6;14061:14;14054:58;14146:4;14141:2;14133:6;14129:15;14122:29;13937:221;:::o;14164:366::-;14306:3;14327:67;14391:2;14386:3;14327:67;:::i;:::-;14320:74;;14403:93;14492:3;14403:93;:::i;:::-;14521:2;14516:3;14512:12;14505:19;;14164:366;;;:::o;14536:419::-;14702:4;14740:2;14729:9;14725:18;14717:26;;14789:9;14783:4;14779:20;14775:1;14764:9;14760:17;14753:47;14817:131;14943:4;14817:131;:::i;:::-;14809:139;;14536:419;;;:::o;14961:182::-;15101:34;15097:1;15089:6;15085:14;15078:58;14961:182;:::o;15149:366::-;15291:3;15312:67;15376:2;15371:3;15312:67;:::i;:::-;15305:74;;15388:93;15477:3;15388:93;:::i;:::-;15506:2;15501:3;15497:12;15490:19;;15149:366;;;:::o;15521:419::-;15687:4;15725:2;15714:9;15710:18;15702:26;;15774:9;15768:4;15764:20;15760:1;15749:9;15745:17;15738:47;15802:131;15928:4;15802:131;:::i;:::-;15794:139;;15521:419;;;:::o;15946:179::-;16086:31;16082:1;16074:6;16070:14;16063:55;15946:179;:::o;16131:366::-;16273:3;16294:67;16358:2;16353:3;16294:67;:::i;:::-;16287:74;;16370:93;16459:3;16370:93;:::i;:::-;16488:2;16483:3;16479:12;16472:19;;16131:366;;;:::o;16503:419::-;16669:4;16707:2;16696:9;16692:18;16684:26;;16756:9;16750:4;16746:20;16742:1;16731:9;16727:17;16720:47;16784:131;16910:4;16784:131;:::i;:::-;16776:139;;16503:419;;;:::o;16928:194::-;16968:4;16988:20;17006:1;16988:20;:::i;:::-;16983:25;;17022:20;17040:1;17022:20;:::i;:::-;17017:25;;17066:1;17063;17059:9;17051:17;;17090:1;17084:4;17081:11;17078:37;;;17095:18;;:::i;:::-;17078:37;16928:194;;;;:::o;17128:224::-;17268:34;17264:1;17256:6;17252:14;17245:58;17337:7;17332:2;17324:6;17320:15;17313:32;17128:224;:::o;17358:366::-;17500:3;17521:67;17585:2;17580:3;17521:67;:::i;:::-;17514:74;;17597:93;17686:3;17597:93;:::i;:::-;17715:2;17710:3;17706:12;17699:19;;17358:366;;;:::o;17730:419::-;17896:4;17934:2;17923:9;17919:18;17911:26;;17983:9;17977:4;17973:20;17969:1;17958:9;17954:17;17947:47;18011:131;18137:4;18011:131;:::i;:::-;18003:139;;17730:419;;;:::o;18155:222::-;18295:34;18291:1;18283:6;18279:14;18272:58;18364:5;18359:2;18351:6;18347:15;18340:30;18155:222;:::o;18383:366::-;18525:3;18546:67;18610:2;18605:3;18546:67;:::i;:::-;18539:74;;18622:93;18711:3;18622:93;:::i;:::-;18740:2;18735:3;18731:12;18724:19;;18383:366;;;:::o;18755:419::-;18921:4;18959:2;18948:9;18944:18;18936:26;;19008:9;19002:4;18998:20;18994:1;18983:9;18979:17;18972:47;19036:131;19162:4;19036:131;:::i;:::-;19028:139;;18755:419;;;:::o;19180:225::-;19320:34;19316:1;19308:6;19304:14;19297:58;19389:8;19384:2;19376:6;19372:15;19365:33;19180:225;:::o;19411:366::-;19553:3;19574:67;19638:2;19633:3;19574:67;:::i;:::-;19567:74;;19650:93;19739:3;19650:93;:::i;:::-;19768:2;19763:3;19759:12;19752:19;;19411:366;;;:::o;19783:419::-;19949:4;19987:2;19976:9;19972:18;19964:26;;20036:9;20030:4;20026:20;20022:1;20011:9;20007:17;20000:47;20064:131;20190:4;20064:131;:::i;:::-;20056:139;;19783:419;;;:::o;20208:442::-;20357:4;20395:2;20384:9;20380:18;20372:26;;20408:71;20476:1;20465:9;20461:17;20452:6;20408:71;:::i;:::-;20489:72;20557:2;20546:9;20542:18;20533:6;20489:72;:::i;:::-;20571;20639:2;20628:9;20624:18;20615:6;20571:72;:::i;:::-;20208:442;;;;;;:::o;20656:180::-;20704:77;20701:1;20694:88;20801:4;20798:1;20791:15;20825:4;20822:1;20815:15;20842:180;20890:77;20887:1;20880:88;20987:4;20984:1;20977:15;21011:4;21008:1;21001:15;21028:143;21085:5;21116:6;21110:13;21101:22;;21132:33;21159:5;21132:33;:::i;:::-;21028:143;;;;:::o;21177:351::-;21247:6;21296:2;21284:9;21275:7;21271:23;21267:32;21264:119;;;21302:79;;:::i;:::-;21264:119;21422:1;21447:64;21503:7;21494:6;21483:9;21479:22;21447:64;:::i;:::-;21437:74;;21393:128;21177:351;;;;:::o;21534:85::-;21579:7;21608:5;21597:16;;21534:85;;;:::o;21625:158::-;21683:9;21716:61;21734:42;21743:32;21769:5;21743:32;:::i;:::-;21734:42;:::i;:::-;21716:61;:::i;:::-;21703:74;;21625:158;;;:::o;21789:147::-;21884:45;21923:5;21884:45;:::i;:::-;21879:3;21872:58;21789:147;;:::o;21942:114::-;22009:6;22043:5;22037:12;22027:22;;21942:114;;;:::o;22062:184::-;22161:11;22195:6;22190:3;22183:19;22235:4;22230:3;22226:14;22211:29;;22062:184;;;;:::o;22252:132::-;22319:4;22342:3;22334:11;;22372:4;22367:3;22363:14;22355:22;;22252:132;;;:::o;22390:108::-;22467:24;22485:5;22467:24;:::i;:::-;22462:3;22455:37;22390:108;;:::o;22504:179::-;22573:10;22594:46;22636:3;22628:6;22594:46;:::i;:::-;22672:4;22667:3;22663:14;22649:28;;22504:179;;;;:::o;22689:113::-;22759:4;22791;22786:3;22782:14;22774:22;;22689:113;;;:::o;22838:732::-;22957:3;22986:54;23034:5;22986:54;:::i;:::-;23056:86;23135:6;23130:3;23056:86;:::i;:::-;23049:93;;23166:56;23216:5;23166:56;:::i;:::-;23245:7;23276:1;23261:284;23286:6;23283:1;23280:13;23261:284;;;23362:6;23356:13;23389:63;23448:3;23433:13;23389:63;:::i;:::-;23382:70;;23475:60;23528:6;23475:60;:::i;:::-;23465:70;;23321:224;23308:1;23305;23301:9;23296:14;;23261:284;;;23265:14;23561:3;23554:10;;22962:608;;;22838:732;;;;:::o;23576:831::-;23839:4;23877:3;23866:9;23862:19;23854:27;;23891:71;23959:1;23948:9;23944:17;23935:6;23891:71;:::i;:::-;23972:80;24048:2;24037:9;24033:18;24024:6;23972:80;:::i;:::-;24099:9;24093:4;24089:20;24084:2;24073:9;24069:18;24062:48;24127:108;24230:4;24221:6;24127:108;:::i;:::-;24119:116;;24245:72;24313:2;24302:9;24298:18;24289:6;24245:72;:::i;:::-;24327:73;24395:3;24384:9;24380:19;24371:6;24327:73;:::i;:::-;23576:831;;;;;;;;:::o;24413:807::-;24662:4;24700:3;24689:9;24685:19;24677:27;;24714:71;24782:1;24771:9;24767:17;24758:6;24714:71;:::i;:::-;24795:72;24863:2;24852:9;24848:18;24839:6;24795:72;:::i;:::-;24877:80;24953:2;24942:9;24938:18;24929:6;24877:80;:::i;:::-;24967;25043:2;25032:9;25028:18;25019:6;24967:80;:::i;:::-;25057:73;25125:3;25114:9;25110:19;25101:6;25057:73;:::i;:::-;25140;25208:3;25197:9;25193:19;25184:6;25140:73;:::i;:::-;24413:807;;;;;;;;;:::o;25226:143::-;25283:5;25314:6;25308:13;25299:22;;25330:33;25357:5;25330:33;:::i;:::-;25226:143;;;;:::o;25375:663::-;25463:6;25471;25479;25528:2;25516:9;25507:7;25503:23;25499:32;25496:119;;;25534:79;;:::i;:::-;25496:119;25654:1;25679:64;25735:7;25726:6;25715:9;25711:22;25679:64;:::i;:::-;25669:74;;25625:128;25792:2;25818:64;25874:7;25865:6;25854:9;25850:22;25818:64;:::i;:::-;25808:74;;25763:129;25931:2;25957:64;26013:7;26004:6;25993:9;25989:22;25957:64;:::i;:::-;25947:74;;25902:129;25375:663;;;;;:::o

Swarm Source

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