ETH Price: $2,956.76 (-0.00%)

Token

AISEA (AISEA)

Overview

Max Total Supply

210,000,000,000,000,000 AISEA

Holders

12,613

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 6 Decimals)

Balance
839,800,000,000 AISEA

Value
$0.00
0xa218a214e35cf339eed1e3e0fd9ed996dc792624
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
AISEA

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2023-05-13
*/

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;



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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

        _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 {}
}

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

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

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

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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

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

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

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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

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

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

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

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

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

        return result;
    }
}

// File: contracts/interfaces/ICamelotFactory.sol


pragma solidity >=0.5.0;

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

    function owner() external view returns (address);

    function feePercentOwner() external view returns (address);

    function setStableOwner() external view returns (address);

    function feeTo() external view returns (address);

    function ownerFeeShare() external view returns (uint256);

    function referrersFeeShare(address) external view returns (uint256);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function feeInfo()
        external
        view
        returns (uint _ownerFeeShare, address _feeTo);
}

// File: contracts/interfaces/IUniswapV2Router01.sol


pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

// File: contracts/interfaces/ICamelotRouter.sol


pragma solidity >=0.6.2;

interface ICamelotRouter 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,
        address referrer,
        uint deadline
    ) external;

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

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

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

// File: contracts/interfaces/IWETH.sol


pragma solidity >=0.5.0;

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

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

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

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

    function deposit() external payable;

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

    function withdraw(uint256) external;
}

// File: contracts/interfaces/IDogeBonusPool.sol


pragma solidity >=0.5.0;

interface IDogeBonusPool {
    function deposit(uint256 _pid, uint256 _amount) external;
    function withdraw(uint256 _pid, uint256 _amount) external;
    function emergencyWithdraw(uint256 _pid) external;
    function injectRewards(uint256 amount) external;
    function injectRewardsWithTime(uint256 amount, uint256 rewardsSeconds) external;
}

pragma solidity =0.8.19;

contract AISEA is ERC20, Ownable {
    using SafeERC20 for IERC20;
    using EnumerableSet for EnumerableSet.AddressSet;

    event SwapBack(uint256 burn, uint256 gov1, uint256 gov2, uint256 liquidity, uint256 bonus, uint256 dev, uint timestamp);
    event Trade(address user, address pair, uint256 amount, uint side, uint256 circulatingSupply, uint timestamp);
    event AddLiquidity(uint256 tokenAmount, uint256 ethAmount, uint256 timestamp);

    bool public swapEnabled = true;
    bool public addLiquidityEnabled = true;

    bool public inSwap;
    modifier swapping() {
        inSwap = true;
        _;
        inSwap = false;
    }

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

    uint256 private burnFee;
    uint256 public gov1Fee;
    uint256 public gov2Fee;
    uint256 private liquidityFee;
    uint256 private bonusFee;
    uint256 private devFee;
    uint256 private totalFee;
    uint256 public feeDenominator = 10000;

    // Buy Fees
    uint256 public burnFeeBuy = 200;
    uint256 public gov1FeeBuy = 100;
    uint256 public gov2FeeBuy = 200;
    uint256 public liquidityFeeBuy = 400;
    uint256 public bonusFeeBuy = 300;
    uint256 public devFeeBuy = 300;
    uint256 public totalFeeBuy = 1500;
    // Sell Fees
    uint256 public burnFeeSell = 200;
    uint256 public gov1FeeSell = 100;
    uint256 public gov2FeeSell = 200;
    uint256 public liquidityFeeSell = 400;
    uint256 public bonusFeeSell = 300;
    uint256 public devFeeSell = 300;
    uint256 public totalFeeSell = 1500;

    // Fees receivers
    address private gov1Wallet;
    address private gov2Wallet;
    address private bonusWallet;
    address private devWallet;

    IERC20 public backToken;
    uint256 public launchedAt;
    uint256 public launchedAtTimestamp;
    bool private initialized;

    ICamelotFactory private immutable factory;
    ICamelotRouter private immutable swapRouter;
    IWETH private immutable WETH;
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address private constant ZERO = 0x0000000000000000000000000000000000000000;

    EnumerableSet.AddressSet private _pairs;

    constructor(
        IERC20 _backToken,
        address _factory,
        address _swapRouter,
        address _weth
    ) ERC20("AISEA", "AISEA") {
        uint256 _totalSupply = 210_000_000_000_000_000 * 1e6;
        backToken = _backToken;
        canAddLiquidityBeforeLaunch[_msgSender()] = true;
        canAddLiquidityBeforeLaunch[address(this)] = true;
        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(this)] = true;
        factory = ICamelotFactory(_factory);
        swapRouter = ICamelotRouter(_swapRouter);
        WETH = IWETH(_weth);
        _mint(_msgSender(), _totalSupply);
    }

    function initializePair() external onlyOwner {
        require(!initialized, "Already initialized");
        address pair = factory.createPair(address(WETH), address(this));
        _pairs.add(pair);
        initialized = true;
    }

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

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

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

    function _dogTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        if (inSwap) {
            _transfer(sender, recipient, amount);
            return true;
        }
        if (!canAddLiquidityBeforeLaunch[sender]) {
            require(launched(), "Trading not open yet");
        }

        bool shouldTakeFee = (!isFeeExempt[sender] && !isFeeExempt[recipient]) && launched();
        uint side = 0;
        address user_ = sender;
        address pair_ = recipient;
        // Set Fees
        if (isPair(sender)) {
            buyFees();
            side = 1;
            user_ = recipient;
            pair_ = sender;
        } else if (isPair(recipient)) {
            sellFees();
            side = 2;
        } else {
            shouldTakeFee = false;
        }

        if (shouldSwapBack()) {
            swapBack();
        }

        uint256 amountReceived = shouldTakeFee ? takeFee(sender, amount) : amount;
        _transfer(sender, recipient, amountReceived);

        if (side > 0) {
            emit Trade(user_, pair_, amount, side, getCirculatingSupply(), block.timestamp);
        }
        return true;
    }

    function shouldSwapBack() internal view returns (bool) {
        return !inSwap && swapEnabled && launched() && balanceOf(address(this)) > 0 && !isPair(_msgSender());
    }

    function swapBack() internal swapping {
        uint256 taxAmount = balanceOf(address(this));
        _approve(address(this), address(swapRouter), taxAmount);

        uint256 amountDogBurn = (taxAmount * burnFee) / (totalFee);
        uint256 amountDogLp = (taxAmount * liquidityFee) / (totalFee);
        uint256 amountDogBonus = (taxAmount * bonusFee) / (totalFee);
        taxAmount -= amountDogBurn;
        taxAmount -= amountDogLp;
        taxAmount -= amountDogBonus;
        

        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = address(WETH);
        path[2] = address(backToken);

        bool success = false;
        uint256 balanceBefore = backToken.balanceOf(address(this));
        try swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(taxAmount,0,path,address(this),address(0),block.timestamp){
            success = true;
        } catch {
            try swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(taxAmount,0,path,address(this),block.timestamp) {
                success = true;
            } 
            catch {}
        }
        if (!success) {
            return;
        }

        _transfer(address(this), DEAD, amountDogBurn);
        _approve(address(this), address(bonusWallet), amountDogBonus);
        IDogeBonusPool(bonusWallet).injectRewards(amountDogBonus);
        
        uint256 amountBackToken = backToken.balanceOf(address(this)) - balanceBefore;
        uint256 backTokenTotalFee = totalFee - burnFee - liquidityFee - bonusFee;
        uint256 amountBackTokenGov1 = (amountBackToken * gov1Fee) / (backTokenTotalFee);
        uint256 amountBackTokenGov2 = (amountBackToken * gov2Fee) / (backTokenTotalFee);
        uint256 amountBackTokenDev = amountBackToken - amountBackTokenGov1 - amountBackTokenGov2;

        backToken.transfer(gov1Wallet, amountBackTokenGov1);
        backToken.transfer(gov2Wallet, amountBackTokenGov2);
        backToken.transfer(devWallet, amountBackTokenDev);

        if (addLiquidityEnabled) {
            _doAddLp();
        }
        
        emit SwapBack(amountDogBurn, amountBackTokenGov1, amountBackTokenGov2, amountDogLp, amountDogBonus, amountBackTokenDev, block.timestamp);
    }

    function _doAddLp() internal {
        address[] memory pathEth = new address[](2);
        pathEth[0] = address(this);
        pathEth[1] = address(WETH);

        uint256 tokenAmount = balanceOf(address(this));
        uint256 half = tokenAmount / 2;
        if(half < 1000) return;

        uint256 ethAmountBefore = address(this).balance;
        bool success = false;
        try swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(half,0, pathEth,address(this),address(0),block.timestamp){
            success = true;
        } catch {
            try swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(half,0, pathEth,address(this),block.timestamp){
                success = true;
            } catch {}
        }
        if (!success) {
            return;
        }

        uint256 ethAmount = address(this).balance - ethAmountBefore;
        _addLiquidity(half, ethAmount);
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        _approve(address(this), address(swapRouter), tokenAmount);
        try swapRouter.addLiquidityETH{value: ethAmount}(address(this), tokenAmount, 0, 0, address(0), block.timestamp) {
            emit AddLiquidity(tokenAmount, ethAmount, block.timestamp);
        } catch {}
    }

    function doSwapBack() public onlyOwner {
        swapBack();
    }

    function launched() internal view returns (bool) {
        return launchedAt != 0;
    }

    function buyFees() internal {
        burnFee = burnFeeBuy;
        gov1Fee = gov1FeeBuy;
        gov2Fee = gov2FeeBuy;
        liquidityFee = liquidityFeeBuy;
        bonusFee = bonusFeeBuy;
        devFee = devFeeBuy;
        totalFee = totalFeeBuy;
    }

    function sellFees() internal {
        burnFee = burnFeeSell;
        gov1Fee = gov1FeeSell;
        gov2Fee = gov2FeeSell;
        liquidityFee = liquidityFeeSell;
        bonusFee = bonusFeeSell;
        devFee = devFeeSell;
        totalFee = totalFeeSell;
    }

    function takeFee(address sender, uint256 amount) internal returns (uint256) {
        uint256 feeAmount = (amount * totalFee) / feeDenominator;
        _transfer(sender, address(this), feeAmount);
        return amount - feeAmount;
    }

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

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

    function clearStuckBalance() external onlyOwner {
        backToken.transfer(_msgSender(), backToken.balanceOf(address(this)));
    }

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

    /*** ADMIN FUNCTIONS ***/
    function launch() public onlyOwner {
        require(launchedAt == 0, "Already launched");
        launchedAt = block.number;
        launchedAtTimestamp = block.timestamp;
    }

    function setBuyFees(
        uint256 _gov1Fee,
        uint256 _gov2Fee,
        uint256 _liquidityFee,
        uint256 _bonusFee,
        uint256 _devFee,
        uint256 _burnFee
    ) external onlyOwner {
        gov1FeeBuy = _gov1Fee;
        gov2FeeBuy = _gov2Fee;
        liquidityFeeBuy = _liquidityFee;
        bonusFeeBuy = _bonusFee;
        devFeeBuy = _devFee;
        burnFeeBuy = _burnFee;
        totalFeeBuy = _liquidityFee + _bonusFee + _devFee + _burnFee;
    }

    function setSellFees(
        uint256 _gov1Fee,
        uint256 _gov2Fee,
        uint256 _liquidityFee,
        uint256 _bonusFee,
        uint256 _devFee,
        uint256 _burnFee
    ) external onlyOwner {
        gov1FeeSell = _gov1Fee;
        gov2FeeSell = _gov2Fee;
        liquidityFeeSell = _liquidityFee;
        bonusFeeSell = _bonusFee;
        devFeeSell = _devFee;
        burnFeeSell = _burnFee;
        totalFeeSell = _liquidityFee + _bonusFee + _devFee + _burnFee;
    }

    function setFeeReceivers(
        address _gov1Wallet,
        address _gov2Wallet,
        address _bonusWallet,
        address _devWallet
    ) external onlyOwner {
        gov1Wallet = _gov1Wallet;
        gov2Wallet = _gov2Wallet;
        bonusWallet = _bonusWallet;
        devWallet = _devWallet;
        devWallet = _devWallet;
    }

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

    function setSwapBackSettings(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
    }

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

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

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

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

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

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

    receive() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IERC20","name":"_backToken","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_swapRouter","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"burn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gov1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gov2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bonus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dev","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SwapBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"side","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"circulatingSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"addLiquidityEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"addPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"backToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"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":"bonusFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAddLiquidityBeforeLaunch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearStuckEthBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"delPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinterLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov1FeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov1FeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov2Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov2FeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov2FeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAtTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeSell","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setAddLiquidityEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gov1Fee","type":"uint256"},{"internalType":"uint256","name":"_gov2Fee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_bonusFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov1Wallet","type":"address"},{"internalType":"address","name":"_gov2Wallet","type":"address"},{"internalType":"address","name":"_bonusWallet","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gov1Fee","type":"uint256"},{"internalType":"uint256","name":"_gov2Fee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_bonusFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040526001600560146101000a81548160ff0219169083151502179055506001600560156101000a81548160ff021916908315150217905550612710600f5560c8601055606460115560c860125561019060135561012c60145561012c6015556105dc60165560c8601755606460185560c8601955610190601a5561012c601b5561012c601c556105dc601d553480156200009b57600080fd5b5060405162005a0738038062005a078339818101604052810190620000c19190620006ee565b6040518060400160405280600581526020017f41495345410000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f414953454100000000000000000000000000000000000000000000000000000081525081600390816200013e9190620009da565b508060049081620001509190620009da565b5050506200017362000167620003fa60201b60201c565b6200040260201b60201c565b6000692c781f708c509f400000905084602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160076000620001d9620003fa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050620003ef620003e2620003fa60201b60201c565b82620004c860201b60201c565b505050505062000bdc565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200053a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005319062000b22565b60405180910390fd5b6200054e600083836200063560201b60201c565b806002600082825462000562919062000b73565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000615919062000bbf565b60405180910390a362000631600083836200063a60201b60201c565b5050565b505050565b505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006718262000644565b9050919050565b6000620006858262000664565b9050919050565b620006978162000678565b8114620006a357600080fd5b50565b600081519050620006b7816200068c565b92915050565b620006c88162000664565b8114620006d457600080fd5b50565b600081519050620006e881620006bd565b92915050565b600080600080608085870312156200070b576200070a6200063f565b5b60006200071b87828801620006a6565b94505060206200072e87828801620006d7565b93505060406200074187828801620006d7565b92505060606200075487828801620006d7565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007e257607f821691505b602082108103620007f857620007f76200079a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008627fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000823565b6200086e868362000823565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008bb620008b5620008af8462000886565b62000890565b62000886565b9050919050565b6000819050919050565b620008d7836200089a565b620008ef620008e682620008c2565b84845462000830565b825550505050565b600090565b62000906620008f7565b62000913818484620008cc565b505050565b5b818110156200093b576200092f600082620008fc565b60018101905062000919565b5050565b601f8211156200098a576200095481620007fe565b6200095f8462000813565b810160208510156200096f578190505b620009876200097e8562000813565b83018262000918565b50505b505050565b600082821c905092915050565b6000620009af600019846008026200098f565b1980831691505092915050565b6000620009ca83836200099c565b9150826002028217905092915050565b620009e58262000760565b67ffffffffffffffff81111562000a015762000a006200076b565b5b62000a0d8254620007c9565b62000a1a8282856200093f565b600060209050601f83116001811462000a52576000841562000a3d578287015190505b62000a498582620009bc565b86555062000ab9565b601f19841662000a6286620007fe565b60005b8281101562000a8c5784890151825560018201915060208501945060208101905062000a65565b8683101562000aac578489015162000aa8601f8916826200099c565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000b0a601f8362000ac1565b915062000b178262000ad2565b602082019050919050565b6000602082019050818103600083015262000b3d8162000afb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b808262000886565b915062000b8d8362000886565b925082820190508082111562000ba85762000ba762000b44565b5b92915050565b62000bb98162000886565b82525050565b600060208201905062000bd6600083018462000bae565b92915050565b60805160a05160c051614dc362000c44600039600081816113780152818161245301526131f4015260008181612308015281816125d4015281816126680152818161329a0152818161332e0152818161358901526135b00152600061133c0152614dc36000f3fe60806040526004361061037a5760003560e01c806386013940116101d1578063bdf391cc11610102578063d8306786116100a0578063e5e31b131161006f578063e5e31b1314610cc1578063f2fde38b14610cfe578063f74c9f4714610d27578063fb5f27fb14610d5057610381565b8063d830678614610c03578063dbd6c48914610c2e578063dd62ed3e14610c59578063e1e5a66d14610c9657610381565b8063c2b7bbb6116100dc578063c2b7bbb614610b45578063c6d2577d14610b82578063cb806e0714610bad578063cdba31fd14610bd857610381565b8063bdf391cc14610ac6578063bf56b37114610b03578063bfa382b514610b2e57610381565b8063a5bc50851161016f578063ace1880111610149578063ace1880114610a1e578063b6309f6814610a49578063b8c6113014610a74578063ba876bb914610a9d57610381565b8063a5bc50851461097b578063a9059cbb146109b8578063aac46c95146109f557610381565b80638da5cb5b116101ab5780638da5cb5b146108d15780638fbbd750146108fc57806395d89b4114610913578063a457c2d71461093e57610381565b80638601394014610850578063861faf5f1461087b57806386c8782f146108a657610381565b8063364333f4116102ab578063658d4b7f1161024957806370c8810e1161022357806370c8810e146107a6578063715018a6146107d15780638072250b146107e857806382d201161461082557610381565b8063658d4b7f146107155780636ddd17131461073e57806370a082311461076957610381565b80633f4218e0116102855780633f4218e01461066d5780634460d3cf146106aa5780634fab9e4c146106d357806353148416146106ea57610381565b8063364333f4146105f057806339509351146106075780633c8e556d1461064457610381565b806315674e8e11610318578063234a2daa116102f2578063234a2daa1461053257806323b872dd1461055d5780632b112e491461059a578063313ce567146105c557610381565b806315674e8e146104b1578063180b0d7e146104dc57806318160ddd1461050757610381565b806306fdde031161035457806306fdde03146103f3578063095ea7b31461041e5780631107b3a51461045b57806312835c5e1461048657610381565b806301339c2114610386578063017e24e11461039d5780630323aac7146103c857610381565b3661038157005b600080fd5b34801561039257600080fd5b5061039b610d7b565b005b3480156103a957600080fd5b506103b2610dd8565b6040516103bf9190613866565b60405180910390f35b3480156103d457600080fd5b506103dd610dde565b6040516103ea9190613866565b60405180910390f35b3480156103ff57600080fd5b50610408610def565b6040516104159190613911565b60405180910390f35b34801561042a57600080fd5b50610445600480360381019061044091906139c2565b610e81565b6040516104529190613a1d565b60405180910390f35b34801561046757600080fd5b50610470610ea4565b60405161047d9190613866565b60405180910390f35b34801561049257600080fd5b5061049b610eaa565b6040516104a89190613866565b60405180910390f35b3480156104bd57600080fd5b506104c6610eb0565b6040516104d39190613866565b60405180910390f35b3480156104e857600080fd5b506104f1610eb6565b6040516104fe9190613866565b60405180910390f35b34801561051357600080fd5b5061051c610ebc565b6040516105299190613866565b60405180910390f35b34801561053e57600080fd5b50610547610ec6565b6040516105549190613866565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190613a38565b610ecc565b6040516105919190613a1d565b60405180910390f35b3480156105a657600080fd5b506105af610ef9565b6040516105bc9190613866565b60405180910390f35b3480156105d157600080fd5b506105da610f31565b6040516105e79190613aa7565b60405180910390f35b3480156105fc57600080fd5b50610605610f3a565b005b34801561061357600080fd5b5061062e600480360381019061062991906139c2565b611087565b60405161063b9190613a1d565b60405180910390f35b34801561065057600080fd5b5061066b60048036038101906106669190613ac2565b6110be565b005b34801561067957600080fd5b50610694600480360381019061068f9190613b29565b611211565b6040516106a19190613a1d565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190613b29565b611231565b005b3480156106df57600080fd5b506106e86112e0565b005b3480156106f657600080fd5b506106ff61142d565b60405161070c9190613866565b60405180910390f35b34801561072157600080fd5b5061073c60048036038101906107379190613b82565b611433565b005b34801561074a57600080fd5b50610753611496565b6040516107609190613a1d565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190613b29565b6114a9565b60405161079d9190613866565b60405180910390f35b3480156107b257600080fd5b506107bb6114f1565b6040516107c89190613866565b60405180910390f35b3480156107dd57600080fd5b506107e66114f7565b005b3480156107f457600080fd5b5061080f600480360381019061080a9190613b29565b61150b565b60405161081c9190613a1d565b60405180910390f35b34801561083157600080fd5b5061083a61152b565b6040516108479190613866565b60405180910390f35b34801561085c57600080fd5b50610865611531565b6040516108729190613a1d565b60405180910390f35b34801561088757600080fd5b50610890611544565b60405161089d9190613c21565b60405180910390f35b3480156108b257600080fd5b506108bb61156a565b6040516108c89190613866565b60405180910390f35b3480156108dd57600080fd5b506108e6611570565b6040516108f39190613c4b565b60405180910390f35b34801561090857600080fd5b5061091161159a565b005b34801561091f57600080fd5b506109286115ac565b6040516109359190613911565b60405180910390f35b34801561094a57600080fd5b50610965600480360381019061096091906139c2565b61163e565b6040516109729190613a1d565b60405180910390f35b34801561098757600080fd5b506109a2600480360381019061099d9190613b29565b6116b5565b6040516109af9190613a1d565b60405180910390f35b3480156109c457600080fd5b506109df60048036038101906109da91906139c2565b611749565b6040516109ec9190613a1d565b60405180910390f35b348015610a0157600080fd5b50610a1c6004803603810190610a179190613c66565b611765565b005b348015610a2a57600080fd5b50610a3361178a565b604051610a409190613866565b60405180910390f35b348015610a5557600080fd5b50610a5e611790565b604051610a6b9190613866565b60405180910390f35b348015610a8057600080fd5b50610a9b6004803603810190610a969190613c66565b611796565b005b348015610aa957600080fd5b50610ac46004803603810190610abf9190613c93565b6117bb565b005b348015610ad257600080fd5b50610aed6004803603810190610ae89190613d20565b61181d565b604051610afa9190613c4b565b60405180910390f35b348015610b0f57600080fd5b50610b18611892565b604051610b259190613866565b60405180910390f35b348015610b3a57600080fd5b50610b43611898565b005b348015610b5157600080fd5b50610b6c6004803603810190610b679190613b29565b6119ab565b604051610b799190613a1d565b60405180910390f35b348015610b8e57600080fd5b50610b97611a3f565b604051610ba49190613866565b60405180910390f35b348015610bb957600080fd5b50610bc2611a45565b604051610bcf9190613866565b60405180910390f35b348015610be457600080fd5b50610bed611a4b565b604051610bfa9190613866565b60405180910390f35b348015610c0f57600080fd5b50610c18611a51565b604051610c259190613a1d565b60405180910390f35b348015610c3a57600080fd5b50610c43611a64565b604051610c509190613866565b60405180910390f35b348015610c6557600080fd5b50610c806004803603810190610c7b9190613d4d565b611a6a565b604051610c8d9190613866565b60405180910390f35b348015610ca257600080fd5b50610cab611af1565b604051610cb89190613866565b60405180910390f35b348015610ccd57600080fd5b50610ce86004803603810190610ce39190613b29565b611af7565b604051610cf59190613a1d565b60405180910390f35b348015610d0a57600080fd5b50610d256004803603810190610d209190613b29565b611b14565b005b348015610d3357600080fd5b50610d4e6004803603810190610d499190613c93565b611b97565b005b348015610d5c57600080fd5b50610d65611bf9565b604051610d729190613866565b60405180910390f35b610d83611bff565b600060235414610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf90613dd9565b60405180910390fd5b4360238190555042602481905550565b600a5481565b6000610dea6026611c7d565b905090565b606060038054610dfe90613e28565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2a90613e28565b8015610e775780601f10610e4c57610100808354040283529160200191610e77565b820191906000526020600020905b815481529060010190602001808311610e5a57829003601f168201915b5050505050905090565b600080610e8c611c92565b9050610e99818585611c9a565b600191505092915050565b601a5481565b601c5481565b60105481565b600f5481565b6000600254905090565b60175481565b600080610ed7611c92565b9050610ee4858285611e63565b610eef858585611eef565b9150509392505050565b6000610f0560006114a9565b610f1061dead6114a9565b610f18610ebc565b610f229190613e88565b610f2c9190613e88565b905090565b60006006905090565b610f42611bff565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610f88611c92565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fe39190613c4b565b602060405180830381865afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190613ed1565b6040518363ffffffff1660e01b8152600401611041929190613efe565b6020604051808303816000875af1158015611060573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110849190613f3c565b50565b600080611092611c92565b90506110b38185856110a48589611a6a565b6110ae9190613f69565b611c9a565b600191505092915050565b6110c6611bff565b83601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b60066020528060005260406000206000915054906101000a900460ff1681565b611239611bff565b6112dd338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112769190613c4b565b602060405180830381865afa158015611293573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b79190613ed1565b8373ffffffffffffffffffffffffffffffffffffffff1661215e9092919063ffffffff16565b50565b6112e8611bff565b602560009054906101000a900460ff1615611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90613fe9565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c653967f0000000000000000000000000000000000000000000000000000000000000000306040518363ffffffff1660e01b81526004016113b5929190614009565b6020604051808303816000875af11580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f89190614047565b905061140e8160266121e490919063ffffffff16565b506001602560006101000a81548160ff02191690831515021790555050565b601d5481565b61143b611bff565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600560149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60115481565b6114ff611bff565b6115096000612214565b565b60076020528060005260406000206000915054906101000a900460ff1681565b60135481565b600560159054906101000a900460ff1681565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60145481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115a2611bff565b6115aa6122da565b565b6060600480546115bb90613e28565b80601f01602080910402602001604051908101604052809291908181526020018280546115e790613e28565b80156116345780601f1061160957610100808354040283529160200191611634565b820191906000526020600020905b81548152906001019060200180831161161757829003601f168201915b5050505050905090565b600080611649611c92565b905060006116578286611a6a565b90508381101561169c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611693906140e6565b60405180910390fd5b6116a98286868403611c9a565b60019250505092915050565b60006116bf611bff565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614152565b60405180910390fd5b611742826026612be190919063ffffffff16565b9050919050565b600061175d611756611c92565b8484611eef565b905092915050565b61176d611bff565b80600560156101000a81548160ff02191690831515021790555050565b601b5481565b60195481565b61179e611bff565b80600560146101000a81548160ff02191690831515021790555050565b6117c3611bff565b856018819055508460198190555083601a8190555082601b8190555081601c8190555080601781905550808284866117fb9190613f69565b6118059190613f69565b61180f9190613f69565b601d81905550505050505050565b6000600161182b6026611c7d565b6118359190613e88565b821115611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e906141be565b60405180910390fd5b61188b826026612c1190919063ffffffff16565b9050919050565b60235481565b6118a0611bff565b600047905060006118af611c92565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff8111156118e1576118e06141de565b5b6040519080825280601f01601f1916602001820160405280156119135781602001600182028036833780820191505090505b506040516119219190614254565b60006040518083038185875af1925050503d806000811461195e576040519150601f19603f3d011682016040523d82523d6000602084013e611963565b606091505b50509050806119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e906142b7565b60405180910390fd5b5050565b60006119b5611bff565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1b90614152565b60405180910390fd5b611a388260266121e490919063ffffffff16565b9050919050565b60245481565b60095481565b60155481565b600560169054906101000a900460ff1681565b60185481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60125481565b6000611b0d826026612c2b90919063ffffffff16565b9050919050565b611b1c611bff565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290614349565b60405180910390fd5b611b9481612214565b50565b611b9f611bff565b85601181905550846012819055508360138190555082601481905550816015819055508060108190555080828486611bd79190613f69565b611be19190613f69565b611beb9190613f69565b601681905550505050505050565b60165481565b611c07611c92565b73ffffffffffffffffffffffffffffffffffffffff16611c25611570565b73ffffffffffffffffffffffffffffffffffffffff1614611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c72906143b5565b60405180910390fd5b565b6000611c8b82600001612c5b565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0090614447565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6f906144d9565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e569190613866565b60405180910390a3505050565b6000611e6f8484611a6a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611ee95781811015611edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed290614545565b60405180910390fd5b611ee88484848403611c9a565b5b50505050565b6000600560169054906101000a900460ff1615611f1a57611f11848484612c6c565b60019050612157565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fb357611f73612ee2565b611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa9906145b1565b60405180910390fd5b5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156120595750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156120695750612068612ee2565b5b9050600080869050600086905061207f88611af7565b1561209b5761208c612eef565b600192508691508790506120c0565b6120a487611af7565b156120ba576120b1612f30565b600292506120bf565b600093505b5b6120c8612f71565b156120d6576120d56122da565b5b6000846120e357866120ee565b6120ed8988612fde565b5b90506120fb898983612c6c565b600084111561214d577fe6f814da7244d1ae6c61b54b5684858ba39cad7b9a91884be10060664987d75483838987612131610ef9565b42604051612144969594939291906145d1565b60405180910390a15b6001955050505050505b9392505050565b6121df8363a9059cbb60e01b848460405160240161217d929190613efe565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061301e565b505050565b600061220c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6130e5565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600560166101000a81548160ff0219169083151502179055506000612300306114a9565b905061232d307f000000000000000000000000000000000000000000000000000000000000000083611c9a565b6000600e54600854836123409190614632565b61234a91906146a3565b90506000600e54600b548461235f9190614632565b61236991906146a3565b90506000600e54600c548561237e9190614632565b61238891906146a3565b905082846123969190613e88565b935081846123a49190613e88565b935080846123b29190613e88565b93506000600367ffffffffffffffff8111156123d1576123d06141de565b5b6040519080825280602002602001820160405280156123ff5781602001602082028036833780820191505090505b5090503081600081518110612417576124166146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110612486576124856146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106124f7576124f66146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600080602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161258f9190613c4b565b602060405180830381865afa1580156125ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d09190613ed1565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ac3893ba88600086306000426040518763ffffffff1660e01b8152600401612637969594939291906147fc565b600060405180830381600087803b15801561265157600080fd5b505af1925050508015612662575060015b612702577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c11d7958860008630426040518663ffffffff1660e01b81526004016126c8959493929190614864565b600060405180830381600087803b1580156126e257600080fd5b505af19250505080156126f3575060015b156126fd57600191505b612707565b600191505b816127185750505050505050612bc4565b6127253061dead88612c6c565b61275230602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686611c9a565b602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633bdc8a1f856040518263ffffffff1660e01b81526004016127ad9190613866565b600060405180830381600087803b1580156127c757600080fd5b505af11580156127db573d6000803e3d6000fd5b50505050600081602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161283d9190613c4b565b602060405180830381865afa15801561285a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287e9190613ed1565b6128889190613e88565b90506000600c54600b54600854600e546128a29190613e88565b6128ac9190613e88565b6128b69190613e88565b9050600081600954846128c99190614632565b6128d391906146a3565b9050600082600a54856128e69190614632565b6128f091906146a3565b905060008183866129019190613e88565b61290b9190613e88565b9050602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b815260040161298c929190613efe565b6020604051808303816000875af11580156129ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cf9190613f3c565b50602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612a4f929190613efe565b6020604051808303816000875af1158015612a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a929190613f3c565b50602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612b12929190613efe565b6020604051808303816000875af1158015612b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b559190613f3c565b50600560159054906101000a900460ff1615612b7457612b73613155565b5b7f0bc091a9ed8a9b857f446b61b8646a7e28d535db811003dd8cfa8bdba85657c88b84848d8d8642604051612baf97969594939291906148be565b60405180910390a15050505050505050505050505b6000600560166101000a81548160ff021916908315150217905550565b6000612c09836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6133ff565b905092915050565b6000612c208360000183613513565b60001c905092915050565b6000612c53836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61353e565b905092915050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd29061499f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4190614a31565b60405180910390fd5b612d55838383613561565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd290614ac3565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ec99190613866565b60405180910390a3612edc848484613566565b50505050565b6000806023541415905090565b601054600881905550601154600981905550601254600a81905550601354600b81905550601454600c81905550601554600d81905550601654600e81905550565b601754600881905550601854600981905550601954600a81905550601a54600b81905550601b54600c81905550601c54600d81905550601d54600e81905550565b6000600560169054906101000a900460ff16158015612f9c5750600560149054906101000a900460ff165b8015612fac5750612fab612ee2565b5b8015612fc057506000612fbe306114a9565b115b8015612fd95750612fd7612fd2611c92565b611af7565b155b905090565b600080600f54600e5484612ff29190614632565b612ffc91906146a3565b9050613009843083612c6c565b80836130159190613e88565b91505092915050565b6000613080826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661356b9092919063ffffffff16565b90506000815111156130e057808060200190518101906130a09190613f3c565b6130df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d690614b55565b60405180910390fd5b5b505050565b60006130f1838361353e565b61314a57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061314f565b600090505b92915050565b6000600267ffffffffffffffff811115613172576131716141de565b5b6040519080825280602002602001820160405280156131a05781602001602082028036833780820191505090505b50905030816000815181106131b8576131b76146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110613227576132266146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600061326c306114a9565b9050600060028261327d91906146a3565b90506103e8811015613291575050506133fd565b600047905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166352aa4c2284600088306000426040518763ffffffff1660e01b81526004016132fd969594939291906147fc565b600060405180830381600087803b15801561331757600080fd5b505af1925050508015613328575060015b6133c8577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008830426040518663ffffffff1660e01b815260040161338e959493929190614864565b600060405180830381600087803b1580156133a857600080fd5b505af19250505080156133b9575060015b156133c357600190505b6133cd565b600190505b806133dc5750505050506133fd565b600082476133ea9190613e88565b90506133f68482613583565b5050505050505b565b600080836001016000848152602001908152602001600020549050600081146135075760006001826134319190613e88565b90506000600186600001805490506134499190613e88565b90508181146134b857600086600001828154811061346a576134696146d4565b5b906000526020600020015490508087600001848154811061348e5761348d6146d4565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806134cc576134cb614b75565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061350d565b60009150505b92915050565b600082600001828154811061352b5761352a6146d4565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b505050565b606061357a8484600085613698565b90509392505050565b6135ae307f000000000000000000000000000000000000000000000000000000000000000084611c9a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806000426040518863ffffffff1660e01b815260040161361496959493929190614ba4565b60606040518083038185885af19350505050801561365057506040513d601f19601f8201168201806040525081019061364d9190614c05565b60015b15613694575050507ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b2482824260405161368b93929190614c58565b60405180910390a15b5050565b6060824710156136dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d490614d01565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516137069190614254565b60006040518083038185875af1925050503d8060008114613743576040519150601f19603f3d011682016040523d82523d6000602084013e613748565b606091505b509150915061375987838387613765565b92505050949350505050565b606083156137c75760008351036137bf5761377f856137da565b6137be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b590614d6d565b60405180910390fd5b5b8290506137d2565b6137d183836137fd565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156138105781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138449190613911565b60405180910390fd5b6000819050919050565b6138608161384d565b82525050565b600060208201905061387b6000830184613857565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138bb5780820151818401526020810190506138a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006138e382613881565b6138ed818561388c565b93506138fd81856020860161389d565b613906816138c7565b840191505092915050565b6000602082019050818103600083015261392b81846138d8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061396382613938565b9050919050565b61397381613958565b811461397e57600080fd5b50565b6000813590506139908161396a565b92915050565b61399f8161384d565b81146139aa57600080fd5b50565b6000813590506139bc81613996565b92915050565b600080604083850312156139d9576139d8613933565b5b60006139e785828601613981565b92505060206139f8858286016139ad565b9150509250929050565b60008115159050919050565b613a1781613a02565b82525050565b6000602082019050613a326000830184613a0e565b92915050565b600080600060608486031215613a5157613a50613933565b5b6000613a5f86828701613981565b9350506020613a7086828701613981565b9250506040613a81868287016139ad565b9150509250925092565b600060ff82169050919050565b613aa181613a8b565b82525050565b6000602082019050613abc6000830184613a98565b92915050565b60008060008060808587031215613adc57613adb613933565b5b6000613aea87828801613981565b9450506020613afb87828801613981565b9350506040613b0c87828801613981565b9250506060613b1d87828801613981565b91505092959194509250565b600060208284031215613b3f57613b3e613933565b5b6000613b4d84828501613981565b91505092915050565b613b5f81613a02565b8114613b6a57600080fd5b50565b600081359050613b7c81613b56565b92915050565b60008060408385031215613b9957613b98613933565b5b6000613ba785828601613981565b9250506020613bb885828601613b6d565b9150509250929050565b6000819050919050565b6000613be7613be2613bdd84613938565b613bc2565b613938565b9050919050565b6000613bf982613bcc565b9050919050565b6000613c0b82613bee565b9050919050565b613c1b81613c00565b82525050565b6000602082019050613c366000830184613c12565b92915050565b613c4581613958565b82525050565b6000602082019050613c606000830184613c3c565b92915050565b600060208284031215613c7c57613c7b613933565b5b6000613c8a84828501613b6d565b91505092915050565b60008060008060008060c08789031215613cb057613caf613933565b5b6000613cbe89828a016139ad565b9650506020613ccf89828a016139ad565b9550506040613ce089828a016139ad565b9450506060613cf189828a016139ad565b9350506080613d0289828a016139ad565b92505060a0613d1389828a016139ad565b9150509295509295509295565b600060208284031215613d3657613d35613933565b5b6000613d44848285016139ad565b91505092915050565b60008060408385031215613d6457613d63613933565b5b6000613d7285828601613981565b9250506020613d8385828601613981565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b6000613dc360108361388c565b9150613dce82613d8d565b602082019050919050565b60006020820190508181036000830152613df281613db6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e4057607f821691505b602082108103613e5357613e52613df9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e938261384d565b9150613e9e8361384d565b9250828203905081811115613eb657613eb5613e59565b5b92915050565b600081519050613ecb81613996565b92915050565b600060208284031215613ee757613ee6613933565b5b6000613ef584828501613ebc565b91505092915050565b6000604082019050613f136000830185613c3c565b613f206020830184613857565b9392505050565b600081519050613f3681613b56565b92915050565b600060208284031215613f5257613f51613933565b5b6000613f6084828501613f27565b91505092915050565b6000613f748261384d565b9150613f7f8361384d565b9250828201905080821115613f9757613f96613e59565b5b92915050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b6000613fd360138361388c565b9150613fde82613f9d565b602082019050919050565b6000602082019050818103600083015261400281613fc6565b9050919050565b600060408201905061401e6000830185613c3c565b61402b6020830184613c3c565b9392505050565b6000815190506140418161396a565b92915050565b60006020828403121561405d5761405c613933565b5b600061406b84828501614032565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006140d060258361388c565b91506140db82614074565b604082019050919050565b600060208201905081810360008301526140ff816140c3565b9050919050565b7f7061697220697320746865207a65726f20616464726573730000000000000000600082015250565b600061413c60188361388c565b915061414782614106565b602082019050919050565b6000602082019050818103600083015261416b8161412f565b9050919050565b7f696e646578206f7574206f6620626f756e647300000000000000000000000000600082015250565b60006141a860138361388c565b91506141b382614172565b602082019050919050565b600060208201905081810360008301526141d78161419b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b600061422e8261420d565b6142388185614218565b935061424881856020860161389d565b80840191505092915050565b60006142608284614223565b915081905092915050565b7f41495345413a204554485f5452414e534645525f4641494c4544000000000000600082015250565b60006142a1601a8361388c565b91506142ac8261426b565b602082019050919050565b600060208201905081810360008301526142d081614294565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061433360268361388c565b915061433e826142d7565b604082019050919050565b6000602082019050818103600083015261436281614326565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061439f60208361388c565b91506143aa82614369565b602082019050919050565b600060208201905081810360008301526143ce81614392565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061443160248361388c565b915061443c826143d5565b604082019050919050565b6000602082019050818103600083015261446081614424565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006144c360228361388c565b91506144ce82614467565b604082019050919050565b600060208201905081810360008301526144f2816144b6565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061452f601d8361388c565b915061453a826144f9565b602082019050919050565b6000602082019050818103600083015261455e81614522565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b600061459b60148361388c565b91506145a682614565565b602082019050919050565b600060208201905081810360008301526145ca8161458e565b9050919050565b600060c0820190506145e66000830189613c3c565b6145f36020830188613c3c565b6146006040830187613857565b61460d6060830186613857565b61461a6080830185613857565b61462760a0830184613857565b979650505050505050565b600061463d8261384d565b91506146488361384d565b92508282026146568161384d565b9150828204841483151761466d5761466c613e59565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146ae8261384d565b91506146b98361384d565b9250826146c9576146c8614674565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061472861472361471e84614703565b613bc2565b61384d565b9050919050565b6147388161470d565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61477381613958565b82525050565b6000614785838361476a565b60208301905092915050565b6000602082019050919050565b60006147a98261473e565b6147b38185614749565b93506147be8361475a565b8060005b838110156147ef5781516147d68882614779565b97506147e183614791565b9250506001810190506147c2565b5085935050505092915050565b600060c0820190506148116000830189613857565b61481e602083018861472f565b8181036040830152614830818761479e565b905061483f6060830186613c3c565b61484c6080830185613c3c565b61485960a0830184613857565b979650505050505050565b600060a0820190506148796000830188613857565b614886602083018761472f565b8181036040830152614898818661479e565b90506148a76060830185613c3c565b6148b46080830184613857565b9695505050505050565b600060e0820190506148d3600083018a613857565b6148e06020830189613857565b6148ed6040830188613857565b6148fa6060830187613857565b6149076080830186613857565b61491460a0830185613857565b61492160c0830184613857565b98975050505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061498960258361388c565b91506149948261492d565b604082019050919050565b600060208201905081810360008301526149b88161497c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614a1b60238361388c565b9150614a26826149bf565b604082019050919050565b60006020820190508181036000830152614a4a81614a0e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614aad60268361388c565b9150614ab882614a51565b604082019050919050565b60006020820190508181036000830152614adc81614aa0565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614b3f602a8361388c565b9150614b4a82614ae3565b604082019050919050565b60006020820190508181036000830152614b6e81614b32565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060c082019050614bb96000830189613c3c565b614bc66020830188613857565b614bd3604083018761472f565b614be0606083018661472f565b614bed6080830185613c3c565b614bfa60a0830184613857565b979650505050505050565b600080600060608486031215614c1e57614c1d613933565b5b6000614c2c86828701613ebc565b9350506020614c3d86828701613ebc565b9250506040614c4e86828701613ebc565b9150509250925092565b6000606082019050614c6d6000830186613857565b614c7a6020830185613857565b614c876040830184613857565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614ceb60268361388c565b9150614cf682614c8f565b604082019050919050565b60006020820190508181036000830152614d1a81614cde565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614d57601d8361388c565b9150614d6282614d21565b602082019050919050565b60006020820190508181036000830152614d8681614d4a565b905091905056fea2646970667358221220d18847919c4f5aeed8169a645fd755cb0ad9159d55bb7e9b2ec90e02316fe6f064736f6c63430008130033000000000000000000000000912ce59144191c1204e64559fe8253a0e49e65480000000000000000000000006eccab422d763ac031210895c81787e87b43a652000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

Deployed Bytecode

0x60806040526004361061037a5760003560e01c806386013940116101d1578063bdf391cc11610102578063d8306786116100a0578063e5e31b131161006f578063e5e31b1314610cc1578063f2fde38b14610cfe578063f74c9f4714610d27578063fb5f27fb14610d5057610381565b8063d830678614610c03578063dbd6c48914610c2e578063dd62ed3e14610c59578063e1e5a66d14610c9657610381565b8063c2b7bbb6116100dc578063c2b7bbb614610b45578063c6d2577d14610b82578063cb806e0714610bad578063cdba31fd14610bd857610381565b8063bdf391cc14610ac6578063bf56b37114610b03578063bfa382b514610b2e57610381565b8063a5bc50851161016f578063ace1880111610149578063ace1880114610a1e578063b6309f6814610a49578063b8c6113014610a74578063ba876bb914610a9d57610381565b8063a5bc50851461097b578063a9059cbb146109b8578063aac46c95146109f557610381565b80638da5cb5b116101ab5780638da5cb5b146108d15780638fbbd750146108fc57806395d89b4114610913578063a457c2d71461093e57610381565b80638601394014610850578063861faf5f1461087b57806386c8782f146108a657610381565b8063364333f4116102ab578063658d4b7f1161024957806370c8810e1161022357806370c8810e146107a6578063715018a6146107d15780638072250b146107e857806382d201161461082557610381565b8063658d4b7f146107155780636ddd17131461073e57806370a082311461076957610381565b80633f4218e0116102855780633f4218e01461066d5780634460d3cf146106aa5780634fab9e4c146106d357806353148416146106ea57610381565b8063364333f4146105f057806339509351146106075780633c8e556d1461064457610381565b806315674e8e11610318578063234a2daa116102f2578063234a2daa1461053257806323b872dd1461055d5780632b112e491461059a578063313ce567146105c557610381565b806315674e8e146104b1578063180b0d7e146104dc57806318160ddd1461050757610381565b806306fdde031161035457806306fdde03146103f3578063095ea7b31461041e5780631107b3a51461045b57806312835c5e1461048657610381565b806301339c2114610386578063017e24e11461039d5780630323aac7146103c857610381565b3661038157005b600080fd5b34801561039257600080fd5b5061039b610d7b565b005b3480156103a957600080fd5b506103b2610dd8565b6040516103bf9190613866565b60405180910390f35b3480156103d457600080fd5b506103dd610dde565b6040516103ea9190613866565b60405180910390f35b3480156103ff57600080fd5b50610408610def565b6040516104159190613911565b60405180910390f35b34801561042a57600080fd5b50610445600480360381019061044091906139c2565b610e81565b6040516104529190613a1d565b60405180910390f35b34801561046757600080fd5b50610470610ea4565b60405161047d9190613866565b60405180910390f35b34801561049257600080fd5b5061049b610eaa565b6040516104a89190613866565b60405180910390f35b3480156104bd57600080fd5b506104c6610eb0565b6040516104d39190613866565b60405180910390f35b3480156104e857600080fd5b506104f1610eb6565b6040516104fe9190613866565b60405180910390f35b34801561051357600080fd5b5061051c610ebc565b6040516105299190613866565b60405180910390f35b34801561053e57600080fd5b50610547610ec6565b6040516105549190613866565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190613a38565b610ecc565b6040516105919190613a1d565b60405180910390f35b3480156105a657600080fd5b506105af610ef9565b6040516105bc9190613866565b60405180910390f35b3480156105d157600080fd5b506105da610f31565b6040516105e79190613aa7565b60405180910390f35b3480156105fc57600080fd5b50610605610f3a565b005b34801561061357600080fd5b5061062e600480360381019061062991906139c2565b611087565b60405161063b9190613a1d565b60405180910390f35b34801561065057600080fd5b5061066b60048036038101906106669190613ac2565b6110be565b005b34801561067957600080fd5b50610694600480360381019061068f9190613b29565b611211565b6040516106a19190613a1d565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190613b29565b611231565b005b3480156106df57600080fd5b506106e86112e0565b005b3480156106f657600080fd5b506106ff61142d565b60405161070c9190613866565b60405180910390f35b34801561072157600080fd5b5061073c60048036038101906107379190613b82565b611433565b005b34801561074a57600080fd5b50610753611496565b6040516107609190613a1d565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190613b29565b6114a9565b60405161079d9190613866565b60405180910390f35b3480156107b257600080fd5b506107bb6114f1565b6040516107c89190613866565b60405180910390f35b3480156107dd57600080fd5b506107e66114f7565b005b3480156107f457600080fd5b5061080f600480360381019061080a9190613b29565b61150b565b60405161081c9190613a1d565b60405180910390f35b34801561083157600080fd5b5061083a61152b565b6040516108479190613866565b60405180910390f35b34801561085c57600080fd5b50610865611531565b6040516108729190613a1d565b60405180910390f35b34801561088757600080fd5b50610890611544565b60405161089d9190613c21565b60405180910390f35b3480156108b257600080fd5b506108bb61156a565b6040516108c89190613866565b60405180910390f35b3480156108dd57600080fd5b506108e6611570565b6040516108f39190613c4b565b60405180910390f35b34801561090857600080fd5b5061091161159a565b005b34801561091f57600080fd5b506109286115ac565b6040516109359190613911565b60405180910390f35b34801561094a57600080fd5b50610965600480360381019061096091906139c2565b61163e565b6040516109729190613a1d565b60405180910390f35b34801561098757600080fd5b506109a2600480360381019061099d9190613b29565b6116b5565b6040516109af9190613a1d565b60405180910390f35b3480156109c457600080fd5b506109df60048036038101906109da91906139c2565b611749565b6040516109ec9190613a1d565b60405180910390f35b348015610a0157600080fd5b50610a1c6004803603810190610a179190613c66565b611765565b005b348015610a2a57600080fd5b50610a3361178a565b604051610a409190613866565b60405180910390f35b348015610a5557600080fd5b50610a5e611790565b604051610a6b9190613866565b60405180910390f35b348015610a8057600080fd5b50610a9b6004803603810190610a969190613c66565b611796565b005b348015610aa957600080fd5b50610ac46004803603810190610abf9190613c93565b6117bb565b005b348015610ad257600080fd5b50610aed6004803603810190610ae89190613d20565b61181d565b604051610afa9190613c4b565b60405180910390f35b348015610b0f57600080fd5b50610b18611892565b604051610b259190613866565b60405180910390f35b348015610b3a57600080fd5b50610b43611898565b005b348015610b5157600080fd5b50610b6c6004803603810190610b679190613b29565b6119ab565b604051610b799190613a1d565b60405180910390f35b348015610b8e57600080fd5b50610b97611a3f565b604051610ba49190613866565b60405180910390f35b348015610bb957600080fd5b50610bc2611a45565b604051610bcf9190613866565b60405180910390f35b348015610be457600080fd5b50610bed611a4b565b604051610bfa9190613866565b60405180910390f35b348015610c0f57600080fd5b50610c18611a51565b604051610c259190613a1d565b60405180910390f35b348015610c3a57600080fd5b50610c43611a64565b604051610c509190613866565b60405180910390f35b348015610c6557600080fd5b50610c806004803603810190610c7b9190613d4d565b611a6a565b604051610c8d9190613866565b60405180910390f35b348015610ca257600080fd5b50610cab611af1565b604051610cb89190613866565b60405180910390f35b348015610ccd57600080fd5b50610ce86004803603810190610ce39190613b29565b611af7565b604051610cf59190613a1d565b60405180910390f35b348015610d0a57600080fd5b50610d256004803603810190610d209190613b29565b611b14565b005b348015610d3357600080fd5b50610d4e6004803603810190610d499190613c93565b611b97565b005b348015610d5c57600080fd5b50610d65611bf9565b604051610d729190613866565b60405180910390f35b610d83611bff565b600060235414610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf90613dd9565b60405180910390fd5b4360238190555042602481905550565b600a5481565b6000610dea6026611c7d565b905090565b606060038054610dfe90613e28565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2a90613e28565b8015610e775780601f10610e4c57610100808354040283529160200191610e77565b820191906000526020600020905b815481529060010190602001808311610e5a57829003601f168201915b5050505050905090565b600080610e8c611c92565b9050610e99818585611c9a565b600191505092915050565b601a5481565b601c5481565b60105481565b600f5481565b6000600254905090565b60175481565b600080610ed7611c92565b9050610ee4858285611e63565b610eef858585611eef565b9150509392505050565b6000610f0560006114a9565b610f1061dead6114a9565b610f18610ebc565b610f229190613e88565b610f2c9190613e88565b905090565b60006006905090565b610f42611bff565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610f88611c92565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fe39190613c4b565b602060405180830381865afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190613ed1565b6040518363ffffffff1660e01b8152600401611041929190613efe565b6020604051808303816000875af1158015611060573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110849190613f3c565b50565b600080611092611c92565b90506110b38185856110a48589611a6a565b6110ae9190613f69565b611c9a565b600191505092915050565b6110c6611bff565b83601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b60066020528060005260406000206000915054906101000a900460ff1681565b611239611bff565b6112dd338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112769190613c4b565b602060405180830381865afa158015611293573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b79190613ed1565b8373ffffffffffffffffffffffffffffffffffffffff1661215e9092919063ffffffff16565b50565b6112e8611bff565b602560009054906101000a900460ff1615611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90613fe9565b60405180910390fd5b60007f0000000000000000000000006eccab422d763ac031210895c81787e87b43a65273ffffffffffffffffffffffffffffffffffffffff1663c9c653967f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1306040518363ffffffff1660e01b81526004016113b5929190614009565b6020604051808303816000875af11580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f89190614047565b905061140e8160266121e490919063ffffffff16565b506001602560006101000a81548160ff02191690831515021790555050565b601d5481565b61143b611bff565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600560149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60115481565b6114ff611bff565b6115096000612214565b565b60076020528060005260406000206000915054906101000a900460ff1681565b60135481565b600560159054906101000a900460ff1681565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60145481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115a2611bff565b6115aa6122da565b565b6060600480546115bb90613e28565b80601f01602080910402602001604051908101604052809291908181526020018280546115e790613e28565b80156116345780601f1061160957610100808354040283529160200191611634565b820191906000526020600020905b81548152906001019060200180831161161757829003601f168201915b5050505050905090565b600080611649611c92565b905060006116578286611a6a565b90508381101561169c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611693906140e6565b60405180910390fd5b6116a98286868403611c9a565b60019250505092915050565b60006116bf611bff565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614152565b60405180910390fd5b611742826026612be190919063ffffffff16565b9050919050565b600061175d611756611c92565b8484611eef565b905092915050565b61176d611bff565b80600560156101000a81548160ff02191690831515021790555050565b601b5481565b60195481565b61179e611bff565b80600560146101000a81548160ff02191690831515021790555050565b6117c3611bff565b856018819055508460198190555083601a8190555082601b8190555081601c8190555080601781905550808284866117fb9190613f69565b6118059190613f69565b61180f9190613f69565b601d81905550505050505050565b6000600161182b6026611c7d565b6118359190613e88565b821115611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e906141be565b60405180910390fd5b61188b826026612c1190919063ffffffff16565b9050919050565b60235481565b6118a0611bff565b600047905060006118af611c92565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff8111156118e1576118e06141de565b5b6040519080825280601f01601f1916602001820160405280156119135781602001600182028036833780820191505090505b506040516119219190614254565b60006040518083038185875af1925050503d806000811461195e576040519150601f19603f3d011682016040523d82523d6000602084013e611963565b606091505b50509050806119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e906142b7565b60405180910390fd5b5050565b60006119b5611bff565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1b90614152565b60405180910390fd5b611a388260266121e490919063ffffffff16565b9050919050565b60245481565b60095481565b60155481565b600560169054906101000a900460ff1681565b60185481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60125481565b6000611b0d826026612c2b90919063ffffffff16565b9050919050565b611b1c611bff565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290614349565b60405180910390fd5b611b9481612214565b50565b611b9f611bff565b85601181905550846012819055508360138190555082601481905550816015819055508060108190555080828486611bd79190613f69565b611be19190613f69565b611beb9190613f69565b601681905550505050505050565b60165481565b611c07611c92565b73ffffffffffffffffffffffffffffffffffffffff16611c25611570565b73ffffffffffffffffffffffffffffffffffffffff1614611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c72906143b5565b60405180910390fd5b565b6000611c8b82600001612c5b565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0090614447565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6f906144d9565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e569190613866565b60405180910390a3505050565b6000611e6f8484611a6a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611ee95781811015611edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed290614545565b60405180910390fd5b611ee88484848403611c9a565b5b50505050565b6000600560169054906101000a900460ff1615611f1a57611f11848484612c6c565b60019050612157565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fb357611f73612ee2565b611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa9906145b1565b60405180910390fd5b5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156120595750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156120695750612068612ee2565b5b9050600080869050600086905061207f88611af7565b1561209b5761208c612eef565b600192508691508790506120c0565b6120a487611af7565b156120ba576120b1612f30565b600292506120bf565b600093505b5b6120c8612f71565b156120d6576120d56122da565b5b6000846120e357866120ee565b6120ed8988612fde565b5b90506120fb898983612c6c565b600084111561214d577fe6f814da7244d1ae6c61b54b5684858ba39cad7b9a91884be10060664987d75483838987612131610ef9565b42604051612144969594939291906145d1565b60405180910390a15b6001955050505050505b9392505050565b6121df8363a9059cbb60e01b848460405160240161217d929190613efe565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061301e565b505050565b600061220c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6130e5565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600560166101000a81548160ff0219169083151502179055506000612300306114a9565b905061232d307f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d83611c9a565b6000600e54600854836123409190614632565b61234a91906146a3565b90506000600e54600b548461235f9190614632565b61236991906146a3565b90506000600e54600c548561237e9190614632565b61238891906146a3565b905082846123969190613e88565b935081846123a49190613e88565b935080846123b29190613e88565b93506000600367ffffffffffffffff8111156123d1576123d06141de565b5b6040519080825280602002602001820160405280156123ff5781602001602082028036833780820191505090505b5090503081600081518110612417576124166146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab181600181518110612486576124856146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106124f7576124f66146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600080602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161258f9190613c4b565b602060405180830381865afa1580156125ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d09190613ed1565b90507f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff1663ac3893ba88600086306000426040518763ffffffff1660e01b8152600401612637969594939291906147fc565b600060405180830381600087803b15801561265157600080fd5b505af1925050508015612662575060015b612702577f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff16635c11d7958860008630426040518663ffffffff1660e01b81526004016126c8959493929190614864565b600060405180830381600087803b1580156126e257600080fd5b505af19250505080156126f3575060015b156126fd57600191505b612707565b600191505b816127185750505050505050612bc4565b6127253061dead88612c6c565b61275230602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686611c9a565b602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633bdc8a1f856040518263ffffffff1660e01b81526004016127ad9190613866565b600060405180830381600087803b1580156127c757600080fd5b505af11580156127db573d6000803e3d6000fd5b50505050600081602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161283d9190613c4b565b602060405180830381865afa15801561285a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287e9190613ed1565b6128889190613e88565b90506000600c54600b54600854600e546128a29190613e88565b6128ac9190613e88565b6128b69190613e88565b9050600081600954846128c99190614632565b6128d391906146a3565b9050600082600a54856128e69190614632565b6128f091906146a3565b905060008183866129019190613e88565b61290b9190613e88565b9050602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b815260040161298c929190613efe565b6020604051808303816000875af11580156129ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cf9190613f3c565b50602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612a4f929190613efe565b6020604051808303816000875af1158015612a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a929190613f3c565b50602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612b12929190613efe565b6020604051808303816000875af1158015612b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b559190613f3c565b50600560159054906101000a900460ff1615612b7457612b73613155565b5b7f0bc091a9ed8a9b857f446b61b8646a7e28d535db811003dd8cfa8bdba85657c88b84848d8d8642604051612baf97969594939291906148be565b60405180910390a15050505050505050505050505b6000600560166101000a81548160ff021916908315150217905550565b6000612c09836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6133ff565b905092915050565b6000612c208360000183613513565b60001c905092915050565b6000612c53836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61353e565b905092915050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd29061499f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4190614a31565b60405180910390fd5b612d55838383613561565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd290614ac3565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ec99190613866565b60405180910390a3612edc848484613566565b50505050565b6000806023541415905090565b601054600881905550601154600981905550601254600a81905550601354600b81905550601454600c81905550601554600d81905550601654600e81905550565b601754600881905550601854600981905550601954600a81905550601a54600b81905550601b54600c81905550601c54600d81905550601d54600e81905550565b6000600560169054906101000a900460ff16158015612f9c5750600560149054906101000a900460ff165b8015612fac5750612fab612ee2565b5b8015612fc057506000612fbe306114a9565b115b8015612fd95750612fd7612fd2611c92565b611af7565b155b905090565b600080600f54600e5484612ff29190614632565b612ffc91906146a3565b9050613009843083612c6c565b80836130159190613e88565b91505092915050565b6000613080826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661356b9092919063ffffffff16565b90506000815111156130e057808060200190518101906130a09190613f3c565b6130df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d690614b55565b60405180910390fd5b5b505050565b60006130f1838361353e565b61314a57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061314f565b600090505b92915050565b6000600267ffffffffffffffff811115613172576131716141de565b5b6040519080825280602002602001820160405280156131a05781602001602082028036833780820191505090505b50905030816000815181106131b8576131b76146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab181600181518110613227576132266146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600061326c306114a9565b9050600060028261327d91906146a3565b90506103e8811015613291575050506133fd565b600047905060007f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff166352aa4c2284600088306000426040518763ffffffff1660e01b81526004016132fd969594939291906147fc565b600060405180830381600087803b15801561331757600080fd5b505af1925050508015613328575060015b6133c8577f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008830426040518663ffffffff1660e01b815260040161338e959493929190614864565b600060405180830381600087803b1580156133a857600080fd5b505af19250505080156133b9575060015b156133c357600190505b6133cd565b600190505b806133dc5750505050506133fd565b600082476133ea9190613e88565b90506133f68482613583565b5050505050505b565b600080836001016000848152602001908152602001600020549050600081146135075760006001826134319190613e88565b90506000600186600001805490506134499190613e88565b90508181146134b857600086600001828154811061346a576134696146d4565b5b906000526020600020015490508087600001848154811061348e5761348d6146d4565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806134cc576134cb614b75565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061350d565b60009150505b92915050565b600082600001828154811061352b5761352a6146d4565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b505050565b606061357a8484600085613698565b90509392505050565b6135ae307f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d84611c9a565b7f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806000426040518863ffffffff1660e01b815260040161361496959493929190614ba4565b60606040518083038185885af19350505050801561365057506040513d601f19601f8201168201806040525081019061364d9190614c05565b60015b15613694575050507ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b2482824260405161368b93929190614c58565b60405180910390a15b5050565b6060824710156136dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d490614d01565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516137069190614254565b60006040518083038185875af1925050503d8060008114613743576040519150601f19603f3d011682016040523d82523d6000602084013e613748565b606091505b509150915061375987838387613765565b92505050949350505050565b606083156137c75760008351036137bf5761377f856137da565b6137be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b590614d6d565b60405180910390fd5b5b8290506137d2565b6137d183836137fd565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156138105781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138449190613911565b60405180910390fd5b6000819050919050565b6138608161384d565b82525050565b600060208201905061387b6000830184613857565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138bb5780820151818401526020810190506138a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006138e382613881565b6138ed818561388c565b93506138fd81856020860161389d565b613906816138c7565b840191505092915050565b6000602082019050818103600083015261392b81846138d8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061396382613938565b9050919050565b61397381613958565b811461397e57600080fd5b50565b6000813590506139908161396a565b92915050565b61399f8161384d565b81146139aa57600080fd5b50565b6000813590506139bc81613996565b92915050565b600080604083850312156139d9576139d8613933565b5b60006139e785828601613981565b92505060206139f8858286016139ad565b9150509250929050565b60008115159050919050565b613a1781613a02565b82525050565b6000602082019050613a326000830184613a0e565b92915050565b600080600060608486031215613a5157613a50613933565b5b6000613a5f86828701613981565b9350506020613a7086828701613981565b9250506040613a81868287016139ad565b9150509250925092565b600060ff82169050919050565b613aa181613a8b565b82525050565b6000602082019050613abc6000830184613a98565b92915050565b60008060008060808587031215613adc57613adb613933565b5b6000613aea87828801613981565b9450506020613afb87828801613981565b9350506040613b0c87828801613981565b9250506060613b1d87828801613981565b91505092959194509250565b600060208284031215613b3f57613b3e613933565b5b6000613b4d84828501613981565b91505092915050565b613b5f81613a02565b8114613b6a57600080fd5b50565b600081359050613b7c81613b56565b92915050565b60008060408385031215613b9957613b98613933565b5b6000613ba785828601613981565b9250506020613bb885828601613b6d565b9150509250929050565b6000819050919050565b6000613be7613be2613bdd84613938565b613bc2565b613938565b9050919050565b6000613bf982613bcc565b9050919050565b6000613c0b82613bee565b9050919050565b613c1b81613c00565b82525050565b6000602082019050613c366000830184613c12565b92915050565b613c4581613958565b82525050565b6000602082019050613c606000830184613c3c565b92915050565b600060208284031215613c7c57613c7b613933565b5b6000613c8a84828501613b6d565b91505092915050565b60008060008060008060c08789031215613cb057613caf613933565b5b6000613cbe89828a016139ad565b9650506020613ccf89828a016139ad565b9550506040613ce089828a016139ad565b9450506060613cf189828a016139ad565b9350506080613d0289828a016139ad565b92505060a0613d1389828a016139ad565b9150509295509295509295565b600060208284031215613d3657613d35613933565b5b6000613d44848285016139ad565b91505092915050565b60008060408385031215613d6457613d63613933565b5b6000613d7285828601613981565b9250506020613d8385828601613981565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b6000613dc360108361388c565b9150613dce82613d8d565b602082019050919050565b60006020820190508181036000830152613df281613db6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e4057607f821691505b602082108103613e5357613e52613df9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e938261384d565b9150613e9e8361384d565b9250828203905081811115613eb657613eb5613e59565b5b92915050565b600081519050613ecb81613996565b92915050565b600060208284031215613ee757613ee6613933565b5b6000613ef584828501613ebc565b91505092915050565b6000604082019050613f136000830185613c3c565b613f206020830184613857565b9392505050565b600081519050613f3681613b56565b92915050565b600060208284031215613f5257613f51613933565b5b6000613f6084828501613f27565b91505092915050565b6000613f748261384d565b9150613f7f8361384d565b9250828201905080821115613f9757613f96613e59565b5b92915050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b6000613fd360138361388c565b9150613fde82613f9d565b602082019050919050565b6000602082019050818103600083015261400281613fc6565b9050919050565b600060408201905061401e6000830185613c3c565b61402b6020830184613c3c565b9392505050565b6000815190506140418161396a565b92915050565b60006020828403121561405d5761405c613933565b5b600061406b84828501614032565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006140d060258361388c565b91506140db82614074565b604082019050919050565b600060208201905081810360008301526140ff816140c3565b9050919050565b7f7061697220697320746865207a65726f20616464726573730000000000000000600082015250565b600061413c60188361388c565b915061414782614106565b602082019050919050565b6000602082019050818103600083015261416b8161412f565b9050919050565b7f696e646578206f7574206f6620626f756e647300000000000000000000000000600082015250565b60006141a860138361388c565b91506141b382614172565b602082019050919050565b600060208201905081810360008301526141d78161419b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b600061422e8261420d565b6142388185614218565b935061424881856020860161389d565b80840191505092915050565b60006142608284614223565b915081905092915050565b7f41495345413a204554485f5452414e534645525f4641494c4544000000000000600082015250565b60006142a1601a8361388c565b91506142ac8261426b565b602082019050919050565b600060208201905081810360008301526142d081614294565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061433360268361388c565b915061433e826142d7565b604082019050919050565b6000602082019050818103600083015261436281614326565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061439f60208361388c565b91506143aa82614369565b602082019050919050565b600060208201905081810360008301526143ce81614392565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061443160248361388c565b915061443c826143d5565b604082019050919050565b6000602082019050818103600083015261446081614424565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006144c360228361388c565b91506144ce82614467565b604082019050919050565b600060208201905081810360008301526144f2816144b6565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061452f601d8361388c565b915061453a826144f9565b602082019050919050565b6000602082019050818103600083015261455e81614522565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b600061459b60148361388c565b91506145a682614565565b602082019050919050565b600060208201905081810360008301526145ca8161458e565b9050919050565b600060c0820190506145e66000830189613c3c565b6145f36020830188613c3c565b6146006040830187613857565b61460d6060830186613857565b61461a6080830185613857565b61462760a0830184613857565b979650505050505050565b600061463d8261384d565b91506146488361384d565b92508282026146568161384d565b9150828204841483151761466d5761466c613e59565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146ae8261384d565b91506146b98361384d565b9250826146c9576146c8614674565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061472861472361471e84614703565b613bc2565b61384d565b9050919050565b6147388161470d565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61477381613958565b82525050565b6000614785838361476a565b60208301905092915050565b6000602082019050919050565b60006147a98261473e565b6147b38185614749565b93506147be8361475a565b8060005b838110156147ef5781516147d68882614779565b97506147e183614791565b9250506001810190506147c2565b5085935050505092915050565b600060c0820190506148116000830189613857565b61481e602083018861472f565b8181036040830152614830818761479e565b905061483f6060830186613c3c565b61484c6080830185613c3c565b61485960a0830184613857565b979650505050505050565b600060a0820190506148796000830188613857565b614886602083018761472f565b8181036040830152614898818661479e565b90506148a76060830185613c3c565b6148b46080830184613857565b9695505050505050565b600060e0820190506148d3600083018a613857565b6148e06020830189613857565b6148ed6040830188613857565b6148fa6060830187613857565b6149076080830186613857565b61491460a0830185613857565b61492160c0830184613857565b98975050505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061498960258361388c565b91506149948261492d565b604082019050919050565b600060208201905081810360008301526149b88161497c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614a1b60238361388c565b9150614a26826149bf565b604082019050919050565b60006020820190508181036000830152614a4a81614a0e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614aad60268361388c565b9150614ab882614a51565b604082019050919050565b60006020820190508181036000830152614adc81614aa0565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614b3f602a8361388c565b9150614b4a82614ae3565b604082019050919050565b60006020820190508181036000830152614b6e81614b32565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060c082019050614bb96000830189613c3c565b614bc66020830188613857565b614bd3604083018761472f565b614be0606083018661472f565b614bed6080830185613c3c565b614bfa60a0830184613857565b979650505050505050565b600080600060608486031215614c1e57614c1d613933565b5b6000614c2c86828701613ebc565b9350506020614c3d86828701613ebc565b9250506040614c4e86828701613ebc565b9150509250925092565b6000606082019050614c6d6000830186613857565b614c7a6020830185613857565b614c876040830184613857565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614ceb60268361388c565b9150614cf682614c8f565b604082019050919050565b60006020820190508181036000830152614d1a81614cde565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614d57601d8361388c565b9150614d6282614d21565b602082019050919050565b60006020820190508181036000830152614d8681614d4a565b905091905056fea2646970667358221220d18847919c4f5aeed8169a645fd755cb0ad9159d55bb7e9b2ec90e02316fe6f064736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000912ce59144191c1204e64559fe8253a0e49e65480000000000000000000000006eccab422d763ac031210895c81787e87b43a652000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

-----Decoded View---------------
Arg [0] : _backToken (address): 0x912CE59144191C1204E64559FE8253a0e49E6548
Arg [1] : _factory (address): 0x6EcCab422D763aC031210895C81787E87B43A652
Arg [2] : _swapRouter (address): 0xc873fEcbd354f5A56E00E710B90EF4201db2448d
Arg [3] : _weth (address): 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000912ce59144191c1204e64559fe8253a0e49e6548
Arg [1] : 0000000000000000000000006eccab422d763ac031210895c81787e87b43a652
Arg [2] : 000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d
Arg [3] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1


Deployed Bytecode Sourcemap

56649:13169:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67094:182;;;;;;;;;;;;;:::i;:::-;;57490:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69497:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6672:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9023:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58116:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58200:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57708;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57645:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7792:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57999:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60061:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66918:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59804:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66775:135;;;;;;;;;;;;;:::i;:::-;;10508:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68296:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57313:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66331:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59558:238;;;;;;;;;;;;;:::i;:::-;;58238:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68656:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57107:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7963:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57746:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36028:103;;;;;;;;;;;;;:::i;:::-;;57363:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57822:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57144:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58438:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57865:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35380:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65354:68;;;;;;;;;;;;;:::i;:::-;;6891:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11249:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69315:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59904:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68895:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58160:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58077:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68783:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67786:502;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69603:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58468:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66511:256;;;;;;;;;;;;;:::i;:::-;;69136:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58500:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57461:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57904:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57191:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58038:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8552:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57784:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69018:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36286:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67284:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57941:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67094:182;35266:13;:11;:13::i;:::-;67162:1:::1;67148:10;;:15;67140:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;67208:12;67195:10;:25;;;;67253:15;67231:19;:37;;;;67094:182::o:0;57490:22::-;;;;:::o;69497:98::-;69545:7;69572:15;:6;:13;:15::i;:::-;69565:22;;69497:98;:::o;6672:100::-;6726:13;6759:5;6752:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6672:100;:::o;9023:201::-;9106:4;9123:13;9139:12;:10;:12::i;:::-;9123:28;;9162:32;9171:5;9178:7;9187:6;9162:8;:32::i;:::-;9212:4;9205:11;;;9023:201;;;;:::o;58116:37::-;;;;:::o;58200:31::-;;;;:::o;57708:::-;;;;:::o;57645:37::-;;;;:::o;7792:108::-;7853:7;7880:12;;7873:19;;7792:108;:::o;57999:32::-;;;;:::o;60061:269::-;60167:4;60184:15;60202:12;:10;:12::i;:::-;60184:30;;60225:40;60241:6;60249:7;60258:6;60225:15;:40::i;:::-;60283:39;60296:6;60304:9;60315:6;60283:12;:39::i;:::-;60276:46;;;60061:269;;;;;:::o;66918:137::-;66971:7;67032:15;58820:42;67032:9;:15::i;:::-;67014;58739:42;67014:9;:15::i;:::-;66998:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:49;;;;:::i;:::-;66991:56;;66918:137;:::o;59804:92::-;59862:5;59887:1;59880:8;;59804:92;:::o;66775:135::-;35266:13;:11;:13::i;:::-;66834:9:::1;;;;;;;;;;;:18;;;66853:12;:10;:12::i;:::-;66867:9;;;;;;;;;;;:19;;;66895:4;66867:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66834:68;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66775:135::o:0;10508:238::-;10596:4;10613:13;10629:12;:10;:12::i;:::-;10613:28;;10652:64;10661:5;10668:7;10705:10;10677:25;10687:5;10694:7;10677:9;:25::i;:::-;:38;;;;:::i;:::-;10652:8;:64::i;:::-;10734:4;10727:11;;;10508:238;;;;:::o;68296:352::-;35266:13;:11;:13::i;:::-;68491:11:::1;68478:10;;:24;;;;;;;;;;;;;;;;;;68526:11;68513:10;;:24;;;;;;;;;;;;;;;;;;68562:12;68548:11;;:26;;;;;;;;;;;;;;;;;;68597:10;68585:9;;:22;;;;;;;;;;;;;;;;;;68630:10;68618:9;;:22;;;;;;;;;;;;;;;;;;68296:352:::0;;;;:::o;57313:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;66331:172::-;35266:13;:11;:13::i;:::-;66404:91:::1;66438:10;66456:12;66449:30;;;66488:4;66449:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66411:12;66404:33;;;;:91;;;;;:::i;:::-;66331:172:::0;:::o;59558:238::-;35266:13;:11;:13::i;:::-;59623:11:::1;;;;;;;;;;;59622:12;59614:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;59669:12;59684:7;:18;;;59711:4;59726;59684:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59669:63;;59743:16;59754:4;59743:6;:10;;:16;;;;:::i;:::-;;59784:4;59770:11;;:18;;;;;;;;;;;;;;;;;;59603:193;59558:238::o:0;58238:34::-;;;;:::o;68656:119::-;35266:13;:11;:13::i;:::-;68761:6:::1;68739:11;:19;68751:6;68739:19;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;68656:119:::0;;:::o;57107:30::-;;;;;;;;;;;;;:::o;7963:127::-;8037:7;8064:9;:18;8074:7;8064:18;;;;;;;;;;;;;;;;8057:25;;7963:127;;;:::o;57746:31::-;;;;:::o;36028:103::-;35266:13;:11;:13::i;:::-;36093:30:::1;36120:1;36093:18;:30::i;:::-;36028:103::o:0;57363:59::-;;;;;;;;;;;;;;;;;;;;;;:::o;57822:36::-;;;;:::o;57144:38::-;;;;;;;;;;;;;:::o;58438:23::-;;;;;;;;;;;;;:::o;57865:32::-;;;;:::o;35380:87::-;35426:7;35453:6;;;;;;;;;;;35446:13;;35380:87;:::o;65354:68::-;35266:13;:11;:13::i;:::-;65404:10:::1;:8;:10::i;:::-;65354:68::o:0;6891:104::-;6947:13;6980:7;6973:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6891:104;:::o;11249:436::-;11342:4;11359:13;11375:12;:10;:12::i;:::-;11359:28;;11398:24;11425:25;11435:5;11442:7;11425:9;:25::i;:::-;11398:52;;11489:15;11469:16;:35;;11461:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11582:60;11591:5;11598:7;11626:15;11607:16;:34;11582:8;:60::i;:::-;11673:4;11666:11;;;;11249:436;;;;:::o;69315:174::-;69372:4;35266:13;:11;:13::i;:::-;69413:1:::1;69397:18;;:4;:18;;::::0;69389:55:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;69462:19;69476:4;69462:6;:13;;:19;;;;:::i;:::-;69455:26;;69315:174:::0;;;:::o;59904:149::-;59983:4;60007:38;60020:12;:10;:12::i;:::-;60034:2;60038:6;60007:12;:38::i;:::-;60000:45;;59904:149;;;;:::o;68895:115::-;35266:13;:11;:13::i;:::-;68994:8:::1;68972:19;;:30;;;;;;;;;;;;;;;;;;68895:115:::0;:::o;58160:33::-;;;;:::o;58077:32::-;;;;:::o;68783:104::-;35266:13;:11;:13::i;:::-;68871:8:::1;68857:11;;:22;;;;;;;;;;;;;;;;;;68783:104:::0;:::o;67786:502::-;35266:13;:11;:13::i;:::-;68025:8:::1;68011:11;:22;;;;68058:8;68044:11;:22;;;;68096:13;68077:16;:32;;;;68135:9;68120:12;:24;;;;68168:7;68155:10;:20;;;;68200:8;68186:11;:22;;;;68272:8;68262:7;68250:9;68234:13;:25;;;;:::i;:::-;:35;;;;:::i;:::-;:46;;;;:::i;:::-;68219:12;:61;;;;67786:502:::0;;;;;;:::o;69603:175::-;69656:7;69711:1;69693:15;:6;:13;:15::i;:::-;:19;;;;:::i;:::-;69684:5;:28;;69676:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;69754:16;69764:5;69754:6;:9;;:16;;;;:::i;:::-;69747:23;;69603:175;;;:::o;58468:25::-;;;;:::o;66511:256::-;35266:13;:11;:13::i;:::-;66573:17:::1;66593:21;66573:41;;66626:12;66652;:10;:12::i;:::-;66644:26;;66678:9;66699:1;66689:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66644:58;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66625:77;;;66721:7;66713:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;66562:205;;66511:256::o:0;69136:171::-;69193:4;35266:13;:11;:13::i;:::-;69234:1:::1;69218:18;;:4;:18;;::::0;69210:55:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;69283:16;69294:4;69283:6;:10;;:16;;;;:::i;:::-;69276:23;;69136:171:::0;;;:::o;58500:34::-;;;;:::o;57461:22::-;;;;:::o;57904:30::-;;;;:::o;57191:18::-;;;;;;;;;;;;;:::o;58038:32::-;;;;:::o;8552:151::-;8641:7;8668:11;:18;8680:5;8668:18;;;;;;;;;;;;;;;:27;8687:7;8668:27;;;;;;;;;;;;;;;;8661:34;;8552:151;;;;:::o;57784:31::-;;;;:::o;69018:110::-;69072:4;69096:24;69112:7;69096:6;:15;;:24;;;;:::i;:::-;69089:31;;69018:110;;;:::o;36286:201::-;35266:13;:11;:13::i;:::-;36395:1:::1;36375:22;;:8;:22;;::::0;36367:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36451:28;36470:8;36451:18;:28::i;:::-;36286:201:::0;:::o;67284:494::-;35266:13;:11;:13::i;:::-;67521:8:::1;67508:10;:21;;;;67553:8;67540:10;:21;;;;67590:13;67572:15;:31;;;;67628:9;67614:11;:23;;;;67660:7;67648:9;:19;;;;67691:8;67678:10;:21;;;;67762:8;67752:7;67740:9;67724:13;:25;;;;:::i;:::-;:35;;;;:::i;:::-;:46;;;;:::i;:::-;67710:11;:60;;;;67284:494:::0;;;;;;:::o;57941:33::-;;;;:::o;35545:132::-;35620:12;:10;:12::i;:::-;35609:23;;:7;:5;:7::i;:::-;:23;;;35601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35545:132::o;46244:117::-;46307:7;46334:19;46342:3;:10;;46334:7;:19::i;:::-;46327:26;;46244:117;;;:::o;4318:98::-;4371:7;4398:10;4391:17;;4318:98;:::o;15276:380::-;15429:1;15412:19;;:5;:19;;;15404:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15510:1;15491:21;;:7;:21;;;15483:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15594:6;15564:11;:18;15576:5;15564:18;;;;;;;;;;;;;;;:27;15583:7;15564:27;;;;;;;;;;;;;;;:36;;;;15632:7;15616:32;;15625:5;15616:32;;;15641:6;15616:32;;;;;;:::i;:::-;;;;;;;;15276:380;;;:::o;15947:453::-;16082:24;16109:25;16119:5;16126:7;16109:9;:25::i;:::-;16082:52;;16169:17;16149:16;:37;16145:248;;16231:6;16211:16;:26;;16203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16315:51;16324:5;16331:7;16359:6;16340:16;:25;16315:8;:51::i;:::-;16145:248;16071:329;15947:453;;;:::o;60338:1208::-;60429:4;60450:6;;;;;;;;;;;60446:101;;;60473:36;60483:6;60491:9;60502:6;60473:9;:36::i;:::-;60531:4;60524:11;;;;60446:101;60562:27;:35;60590:6;60562:35;;;;;;;;;;;;;;;;;;;;;;;;;60557:112;;60622:10;:8;:10::i;:::-;60614:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;60557:112;60681:18;60704:11;:19;60716:6;60704:19;;;;;;;;;;;;;;;;;;;;;;;;;60703:20;:47;;;;;60728:11;:22;60740:9;60728:22;;;;;;;;;;;;;;;;;;;;;;;;;60727:23;60703:47;60702:63;;;;;60755:10;:8;:10::i;:::-;60702:63;60681:84;;60776:9;60800:13;60816:6;60800:22;;60833:13;60849:9;60833:25;;60894:14;60901:6;60894;:14::i;:::-;60890:283;;;60925:9;:7;:9::i;:::-;60956:1;60949:8;;60980:9;60972:17;;61012:6;61004:14;;60890:283;;;61040:17;61047:9;61040:6;:17::i;:::-;61036:137;;;61074:10;:8;:10::i;:::-;61106:1;61099:8;;61036:137;;;61156:5;61140:21;;61036:137;60890:283;61189:16;:14;:16::i;:::-;61185:59;;;61222:10;:8;:10::i;:::-;61185:59;61256:22;61281:13;:48;;61323:6;61281:48;;;61297:23;61305:6;61313;61297:7;:23::i;:::-;61281:48;61256:73;;61340:44;61350:6;61358:9;61369:14;61340:9;:44::i;:::-;61408:1;61401:4;:8;61397:120;;;61431:74;61437:5;61444;61451:6;61459:4;61465:22;:20;:22::i;:::-;61489:15;61431:74;;;;;;;;;;;:::i;:::-;;;;;;;;61397:120;61534:4;61527:11;;;;;;;60338:1208;;;;;;:::o;30359:211::-;30476:86;30496:5;30526:23;;;30551:2;30555:5;30503:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30476:19;:86::i;:::-;30359:211;;;:::o;45419:152::-;45489:4;45513:50;45518:3;:10;;45554:5;45538:23;;45530:32;;45513:4;:50::i;:::-;45506:57;;45419:152;;;;:::o;36647:191::-;36721:16;36740:6;;;;;;;;;;;36721:25;;36766:8;36757:6;;:17;;;;;;;;;;;;;;;;;;36821:8;36790:40;;36811:8;36790:40;;;;;;;;;;;;36710:128;36647:191;:::o;61736:2294::-;57256:4;57247:6;;:13;;;;;;;;;;;;;;;;;;61785:17:::1;61805:24;61823:4;61805:9;:24::i;:::-;61785:44;;61840:55;61857:4;61872:10;61885:9;61840:8;:55::i;:::-;61908:21;61957:8;;61945:7;;61933:9;:19;;;;:::i;:::-;61932:34;;;;:::i;:::-;61908:58;;61977:19;62029:8;;62012:12;;62000:9;:24;;;;:::i;:::-;61999:39;;;;:::i;:::-;61977:61;;62049:22;62100:8;;62087;;62075:9;:20;;;;:::i;:::-;62074:35;;;;:::i;:::-;62049:60;;62133:13;62120:26;;;;;:::i;:::-;;;62170:11;62157:24;;;;;:::i;:::-;;;62205:14;62192:27;;;;;:::i;:::-;;;62242:21;62280:1;62266:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62242:40;;62311:4;62293;62298:1;62293:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;62345:4;62327;62332:1;62327:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;62379:9;;;;;;;;;;;62361:4;62366:1;62361:7;;;;;;;;:::i;:::-;;;;;;;:28;;;;;;;;;::::0;::::1;62402:12;62433:21:::0;62457:9:::1;;;;;;;;;;;:19;;;62485:4;62457:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62433:58;;62506:10;:64;;;62571:9;62581:1;62583:4;62596;62610:1;62613:15;62506:123;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;62502:390;;62696:10;:64;;;62761:9;62771:1;62773:4;62786;62792:15;62696:112;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;62692:189:::0;::::1;;62838:4;62828:14;;62692:189;62502:390;;;62654:4;62644:14;;62502:390;62907:7;62902:47;;62931:7;;;;;;;;;62902:47;62961:45;62979:4;58739:42;62992:13;62961:9;:45::i;:::-;63017:61;63034:4;63049:11;;;;;;;;;;;63063:14;63017:8;:61::i;:::-;63104:11;;;;;;;;;;;63089:41;;;63131:14;63089:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63167:23;63230:13;63193:9;;;;;;;;;;;:19;;;63221:4;63193:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;63167:76;;63254:25;63318:8;;63303:12;;63293:7;;63282:8;;:18;;;;:::i;:::-;:33;;;;:::i;:::-;:44;;;;:::i;:::-;63254:72;;63337:27;63398:17;63386:7;;63368:15;:25;;;;:::i;:::-;63367:49;;;;:::i;:::-;63337:79;;63427:27;63488:17;63476:7;;63458:15;:25;;;;:::i;:::-;63457:49;;;;:::i;:::-;63427:79;;63517:26;63586:19;63564;63546:15;:37;;;;:::i;:::-;:59;;;;:::i;:::-;63517:88;;63618:9;;;;;;;;;;;:18;;;63637:10;;;;;;;;;;;63649:19;63618:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63680:9;;;;;;;;;;;:18;;;63699:10;;;;;;;;;;;63711:19;63680:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63742:9;;;;;;;;;;;:18;;;63761:9;;;;;;;;;;;63772:18;63742:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63808:19;;;;;;;;;;;63804:62;;;63844:10;:8;:10::i;:::-;63804:62;63891:131;63900:13;63915:19;63936;63957:11;63970:14;63986:18;64006:15;63891:131;;;;;;;;;;;;:::i;:::-;;;;;;;;61774:2256;;;;;;;;;;;;57271:1;57292:5:::0;57283:6;;:14;;;;;;;;;;;;;;;;;;61736:2294::o;45747:158::-;45820:4;45844:53;45852:3;:10;;45888:5;45872:23;;45864:32;;45844:7;:53::i;:::-;45837:60;;45747:158;;;;:::o;46715:::-;46789:7;46840:22;46844:3;:10;;46856:5;46840:3;:22::i;:::-;46832:31;;46809:56;;46715:158;;;;:::o;45991:167::-;46071:4;46095:55;46105:3;:10;;46141:5;46125:23;;46117:32;;46095:9;:55::i;:::-;46088:62;;45991:167;;;;:::o;41461:109::-;41517:7;41544:3;:11;;:18;;;;41537:25;;41461:109;;;:::o;12155:840::-;12302:1;12286:18;;:4;:18;;;12278:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12379:1;12365:16;;:2;:16;;;12357:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12434:38;12455:4;12461:2;12465:6;12434:20;:38::i;:::-;12485:19;12507:9;:15;12517:4;12507:15;;;;;;;;;;;;;;;;12485:37;;12556:6;12541:11;:21;;12533:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;12673:6;12659:11;:20;12641:9;:15;12651:4;12641:15;;;;;;;;;;;;;;;:38;;;;12876:6;12859:9;:13;12869:2;12859:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;12926:2;12911:26;;12920:4;12911:26;;;12930:6;12911:26;;;;;;:::i;:::-;;;;;;;;12950:37;12970:4;12976:2;12980:6;12950:19;:37::i;:::-;12267:728;12155:840;;;:::o;65430:90::-;65473:4;65511:1;65497:10;;:15;;65490:22;;65430:90;:::o;65528:265::-;65577:10;;65567:7;:20;;;;65608:10;;65598:7;:20;;;;65639:10;;65629:7;:20;;;;65675:15;;65660:12;:30;;;;65712:11;;65701:8;:22;;;;65743:9;;65734:6;:18;;;;65774:11;;65763:8;:22;;;;65528:265::o;65801:273::-;65851:11;;65841:7;:21;;;;65883:11;;65873:7;:21;;;;65915:11;;65905:7;:21;;;;65952:16;;65937:12;:31;;;;65990:12;;65979:8;:23;;;;66022:10;;66013:6;:19;;;;66054:12;;66043:8;:23;;;;65801:273::o;61554:174::-;61603:4;61628:6;;;;;;;;;;;61627:7;:22;;;;;61638:11;;;;;;;;;;;61627:22;:36;;;;;61653:10;:8;:10::i;:::-;61627:36;:68;;;;;61694:1;61667:24;61685:4;61667:9;:24::i;:::-;:28;61627:68;:93;;;;;61700:20;61707:12;:10;:12::i;:::-;61700:6;:20::i;:::-;61699:21;61627:93;61620:100;;61554:174;:::o;66082:241::-;66149:7;66169:17;66211:14;;66199:8;;66190:6;:17;;;;:::i;:::-;66189:36;;;;:::i;:::-;66169:56;;66236:43;66246:6;66262:4;66269:9;66236;:43::i;:::-;66306:9;66297:6;:18;;;;:::i;:::-;66290:25;;;66082:241;;;;:::o;33426:716::-;33850:23;33876:69;33904:4;33876:69;;;;;;;;;;;;;;;;;33884:5;33876:27;;;;:69;;;;;:::i;:::-;33850:95;;33980:1;33960:10;:17;:21;33956:179;;;34057:10;34046:30;;;;;;;;;;;;:::i;:::-;34038:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33956:179;33496:646;33426:716;;:::o;39150:414::-;39213:4;39235:21;39245:3;39250:5;39235:9;:21::i;:::-;39230:327;;39273:3;:11;;39290:5;39273:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39456:3;:11;;:18;;;;39434:3;:12;;:19;39447:5;39434:19;;;;;;;;;;;:40;;;;39496:4;39489:11;;;;39230:327;39540:5;39533:12;;39150:414;;;;;:::o;64038:936::-;64078:24;64119:1;64105:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64078:43;;64153:4;64132:7;64140:1;64132:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;64190:4;64169:7;64177:1;64169:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;64208:19;64230:24;64248:4;64230:9;:24::i;:::-;64208:46;;64265:12;64294:1;64280:11;:15;;;;:::i;:::-;64265:30;;64316:4;64309;:11;64306:23;;;64322:7;;;;;64306:23;64341;64367:21;64341:47;;64399:12;64434:10;:61;;;64496:4;64501:1;64504:7;64520:4;64534:1;64537:15;64434:119;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64430:367;;64620:10;:61;;;64682:4;64687:1;64690:7;64706:4;64712:15;64620:108;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64616:170;;;64757:4;64747:14;;64616:170;64430:367;;;64578:4;64568:14;;64430:367;64812:7;64807:47;;64836:7;;;;;;;64807:47;64866:17;64910:15;64886:21;:39;;;;:::i;:::-;64866:59;;64936:30;64950:4;64956:9;64936:13;:30::i;:::-;64067:907;;;;;;64038:936;:::o;39740:1420::-;39806:4;39924:18;39945:3;:12;;:19;39958:5;39945:19;;;;;;;;;;;;39924:40;;39995:1;39981:10;:15;39977:1176;;40356:21;40393:1;40380:10;:14;;;;:::i;:::-;40356:38;;40409:17;40450:1;40429:3;:11;;:18;;;;:22;;;;:::i;:::-;40409:42;;40485:13;40472:9;:26;40468:405;;40519:17;40539:3;:11;;40551:9;40539:22;;;;;;;;:::i;:::-;;;;;;;;;;40519:42;;40693:9;40664:3;:11;;40676:13;40664:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;40804:10;40778:3;:12;;:23;40791:9;40778:23;;;;;;;;;;;:36;;;;40500:373;40468:405;40954:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41049:3;:12;;:19;41062:5;41049:19;;;;;;;;;;;41042:26;;;41092:4;41085:11;;;;;;;39977:1176;41136:5;41129:12;;;39740:1420;;;;;:::o;41924:120::-;41991:7;42018:3;:11;;42030:5;42018:18;;;;;;;;:::i;:::-;;;;;;;;;;42011:25;;41924:120;;;;:::o;41246:129::-;41319:4;41366:1;41343:3;:12;;:19;41356:5;41343:19;;;;;;;;;;;;:24;;41336:31;;41246:129;;;;:::o;17000:125::-;;;;:::o;17729:124::-;;;;:::o;24211:229::-;24348:12;24380:52;24402:6;24410:4;24416:1;24419:12;24380:21;:52::i;:::-;24373:59;;24211:229;;;;;:::o;64982:364::-;65065:57;65082:4;65097:10;65110:11;65065:8;:57::i;:::-;65137:10;:26;;;65171:9;65190:4;65197:11;65210:1;65213;65224;65228:15;65137:107;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65133:206;;;;;;65265:53;65278:11;65291:9;65302:15;65265:53;;;;;;;;:::i;:::-;;;;;;;;65133:206;64982:364;;:::o;25331:455::-;25501:12;25559:5;25534:21;:30;;25526:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;25619:12;25633:23;25660:6;:11;;25679:5;25686:4;25660:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25618:73;;;;25709:69;25736:6;25744:7;25753:10;25765:12;25709:26;:69::i;:::-;25702:76;;;;25331:455;;;;;;:::o;27904:644::-;28089:12;28118:7;28114:427;;;28167:1;28146:10;:17;:22;28142:290;;28364:18;28375:6;28364:10;:18::i;:::-;28356:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28142:290;28453:10;28446:17;;;;28114:427;28496:33;28504:10;28516:12;28496:7;:33::i;:::-;27904:644;;;;;;;:::o;21454:326::-;21514:4;21771:1;21749:7;:19;;;:23;21742:30;;21454:326;;;:::o;29090:552::-;29271:1;29251:10;:17;:21;29247:388;;;29483:10;29477:17;29540:15;29527:10;29523:2;29519:19;29512:44;29247:388;29610:12;29603:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:77:1;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:246::-;803:1;813:113;827:6;824:1;821:13;813:113;;;912:1;907:3;903:11;897:18;893:1;888:3;884:11;877:39;849:2;846:1;842:10;837:15;;813:113;;;960:1;951:6;946:3;942:16;935:27;784:184;722:246;;;:::o;974:102::-;1015:6;1066:2;1062:7;1057:2;1050:5;1046:14;1042:28;1032:38;;974:102;;;:::o;1082:377::-;1170:3;1198:39;1231:5;1198:39;:::i;:::-;1253:71;1317:6;1312:3;1253:71;:::i;:::-;1246:78;;1333:65;1391:6;1386:3;1379:4;1372:5;1368:16;1333:65;:::i;:::-;1423:29;1445:6;1423:29;:::i;:::-;1418:3;1414:39;1407:46;;1174:285;1082:377;;;;:::o;1465:313::-;1578:4;1616:2;1605:9;1601:18;1593:26;;1665:9;1659:4;1655:20;1651:1;1640:9;1636:17;1629:47;1693:78;1766:4;1757:6;1693:78;:::i;:::-;1685:86;;1465:313;;;;:::o;1865:117::-;1974:1;1971;1964:12;2111:126;2148:7;2188:42;2181:5;2177:54;2166:65;;2111:126;;;:::o;2243:96::-;2280:7;2309:24;2327:5;2309:24;:::i;:::-;2298:35;;2243:96;;;:::o;2345:122::-;2418:24;2436:5;2418:24;:::i;:::-;2411:5;2408:35;2398:63;;2457:1;2454;2447:12;2398:63;2345:122;:::o;2473:139::-;2519:5;2557:6;2544:20;2535:29;;2573:33;2600:5;2573:33;:::i;:::-;2473:139;;;;:::o;2618:122::-;2691:24;2709:5;2691:24;:::i;:::-;2684:5;2681:35;2671:63;;2730:1;2727;2720:12;2671:63;2618:122;:::o;2746:139::-;2792:5;2830:6;2817:20;2808:29;;2846:33;2873:5;2846:33;:::i;:::-;2746:139;;;;:::o;2891:474::-;2959:6;2967;3016:2;3004:9;2995:7;2991:23;2987:32;2984:119;;;3022:79;;:::i;:::-;2984:119;3142:1;3167:53;3212:7;3203:6;3192:9;3188:22;3167:53;:::i;:::-;3157:63;;3113:117;3269:2;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3240:118;2891:474;;;;;:::o;3371:90::-;3405:7;3448:5;3441:13;3434:21;3423:32;;3371:90;;;:::o;3467:109::-;3548:21;3563:5;3548:21;:::i;:::-;3543:3;3536:34;3467:109;;:::o;3582:210::-;3669:4;3707:2;3696:9;3692:18;3684:26;;3720:65;3782:1;3771:9;3767:17;3758:6;3720:65;:::i;:::-;3582:210;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:765::-;4939:6;4947;4955;4963;5012:3;5000:9;4991:7;4987:23;4983:33;4980:120;;;5019:79;;:::i;:::-;4980:120;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;5394:2;5420:53;5465:7;5456:6;5445:9;5441:22;5420:53;:::i;:::-;5410:63;;5365:118;5522:2;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5493:118;4853:765;;;;;;;:::o;5624:329::-;5683:6;5732:2;5720:9;5711:7;5707:23;5703:32;5700:119;;;5738:79;;:::i;:::-;5700:119;5858:1;5883:53;5928:7;5919:6;5908:9;5904:22;5883:53;:::i;:::-;5873:63;;5829:117;5624:329;;;;:::o;5959:116::-;6029:21;6044:5;6029:21;:::i;:::-;6022:5;6019:32;6009:60;;6065:1;6062;6055:12;6009:60;5959:116;:::o;6081:133::-;6124:5;6162:6;6149:20;6140:29;;6178:30;6202:5;6178:30;:::i;:::-;6081:133;;;;:::o;6220:468::-;6285:6;6293;6342:2;6330:9;6321:7;6317:23;6313:32;6310:119;;;6348:79;;:::i;:::-;6310:119;6468:1;6493:53;6538:7;6529:6;6518:9;6514:22;6493:53;:::i;:::-;6483:63;;6439:117;6595:2;6621:50;6663:7;6654:6;6643:9;6639:22;6621:50;:::i;:::-;6611:60;;6566:115;6220:468;;;;;:::o;6694:60::-;6722:3;6743:5;6736:12;;6694:60;;;:::o;6760:142::-;6810:9;6843:53;6861:34;6870:24;6888:5;6870:24;:::i;:::-;6861:34;:::i;:::-;6843:53;:::i;:::-;6830:66;;6760:142;;;:::o;6908:126::-;6958:9;6991:37;7022:5;6991:37;:::i;:::-;6978:50;;6908:126;;;:::o;7040:139::-;7103:9;7136:37;7167:5;7136:37;:::i;:::-;7123:50;;7040:139;;;:::o;7185:157::-;7285:50;7329:5;7285:50;:::i;:::-;7280:3;7273:63;7185:157;;:::o;7348:248::-;7454:4;7492:2;7481:9;7477:18;7469:26;;7505:84;7586:1;7575:9;7571:17;7562:6;7505:84;:::i;:::-;7348:248;;;;:::o;7602:118::-;7689:24;7707:5;7689:24;:::i;:::-;7684:3;7677:37;7602:118;;:::o;7726:222::-;7819:4;7857:2;7846:9;7842:18;7834:26;;7870:71;7938:1;7927:9;7923:17;7914:6;7870:71;:::i;:::-;7726:222;;;;:::o;7954:323::-;8010:6;8059:2;8047:9;8038:7;8034:23;8030:32;8027:119;;;8065:79;;:::i;:::-;8027:119;8185:1;8210:50;8252:7;8243:6;8232:9;8228:22;8210:50;:::i;:::-;8200:60;;8156:114;7954:323;;;;:::o;8283:1057::-;8387:6;8395;8403;8411;8419;8427;8476:3;8464:9;8455:7;8451:23;8447:33;8444:120;;;8483:79;;:::i;:::-;8444:120;8603:1;8628:53;8673:7;8664:6;8653:9;8649:22;8628:53;:::i;:::-;8618:63;;8574:117;8730:2;8756:53;8801:7;8792:6;8781:9;8777:22;8756:53;:::i;:::-;8746:63;;8701:118;8858:2;8884:53;8929:7;8920:6;8909:9;8905:22;8884:53;:::i;:::-;8874:63;;8829:118;8986:2;9012:53;9057:7;9048:6;9037:9;9033:22;9012:53;:::i;:::-;9002:63;;8957:118;9114:3;9141:53;9186:7;9177:6;9166:9;9162:22;9141:53;:::i;:::-;9131:63;;9085:119;9243:3;9270:53;9315:7;9306:6;9295:9;9291:22;9270:53;:::i;:::-;9260:63;;9214:119;8283:1057;;;;;;;;:::o;9346:329::-;9405:6;9454:2;9442:9;9433:7;9429:23;9425:32;9422:119;;;9460:79;;:::i;:::-;9422:119;9580:1;9605:53;9650:7;9641:6;9630:9;9626:22;9605:53;:::i;:::-;9595:63;;9551:117;9346:329;;;;:::o;9681:474::-;9749:6;9757;9806:2;9794:9;9785:7;9781:23;9777:32;9774:119;;;9812:79;;:::i;:::-;9774:119;9932:1;9957:53;10002:7;9993:6;9982:9;9978:22;9957:53;:::i;:::-;9947:63;;9903:117;10059:2;10085:53;10130:7;10121:6;10110:9;10106:22;10085:53;:::i;:::-;10075:63;;10030:118;9681:474;;;;;:::o;10161:166::-;10301:18;10297:1;10289:6;10285:14;10278:42;10161:166;:::o;10333:366::-;10475:3;10496:67;10560:2;10555:3;10496:67;:::i;:::-;10489:74;;10572:93;10661:3;10572:93;:::i;:::-;10690:2;10685:3;10681:12;10674:19;;10333:366;;;:::o;10705:419::-;10871:4;10909:2;10898:9;10894:18;10886:26;;10958:9;10952:4;10948:20;10944:1;10933:9;10929:17;10922:47;10986:131;11112:4;10986:131;:::i;:::-;10978:139;;10705:419;;;:::o;11130:180::-;11178:77;11175:1;11168:88;11275:4;11272:1;11265:15;11299:4;11296:1;11289:15;11316:320;11360:6;11397:1;11391:4;11387:12;11377:22;;11444:1;11438:4;11434:12;11465:18;11455:81;;11521:4;11513:6;11509:17;11499:27;;11455:81;11583:2;11575:6;11572:14;11552:18;11549:38;11546:84;;11602:18;;:::i;:::-;11546:84;11367:269;11316:320;;;:::o;11642:180::-;11690:77;11687:1;11680:88;11787:4;11784:1;11777:15;11811:4;11808:1;11801:15;11828:194;11868:4;11888:20;11906:1;11888:20;:::i;:::-;11883:25;;11922:20;11940:1;11922:20;:::i;:::-;11917:25;;11966:1;11963;11959:9;11951:17;;11990:1;11984:4;11981:11;11978:37;;;11995:18;;:::i;:::-;11978:37;11828:194;;;;:::o;12028:143::-;12085:5;12116:6;12110:13;12101:22;;12132:33;12159:5;12132:33;:::i;:::-;12028:143;;;;:::o;12177:351::-;12247:6;12296:2;12284:9;12275:7;12271:23;12267:32;12264:119;;;12302:79;;:::i;:::-;12264:119;12422:1;12447:64;12503:7;12494:6;12483:9;12479:22;12447:64;:::i;:::-;12437:74;;12393:128;12177:351;;;;:::o;12534:332::-;12655:4;12693:2;12682:9;12678:18;12670:26;;12706:71;12774:1;12763:9;12759:17;12750:6;12706:71;:::i;:::-;12787:72;12855:2;12844:9;12840:18;12831:6;12787:72;:::i;:::-;12534:332;;;;;:::o;12872:137::-;12926:5;12957:6;12951:13;12942:22;;12973:30;12997:5;12973:30;:::i;:::-;12872:137;;;;:::o;13015:345::-;13082:6;13131:2;13119:9;13110:7;13106:23;13102:32;13099:119;;;13137:79;;:::i;:::-;13099:119;13257:1;13282:61;13335:7;13326:6;13315:9;13311:22;13282:61;:::i;:::-;13272:71;;13228:125;13015:345;;;;:::o;13366:191::-;13406:3;13425:20;13443:1;13425:20;:::i;:::-;13420:25;;13459:20;13477:1;13459:20;:::i;:::-;13454:25;;13502:1;13499;13495:9;13488:16;;13523:3;13520:1;13517:10;13514:36;;;13530:18;;:::i;:::-;13514:36;13366:191;;;;:::o;13563:169::-;13703:21;13699:1;13691:6;13687:14;13680:45;13563:169;:::o;13738:366::-;13880:3;13901:67;13965:2;13960:3;13901:67;:::i;:::-;13894:74;;13977:93;14066:3;13977:93;:::i;:::-;14095:2;14090:3;14086:12;14079:19;;13738:366;;;:::o;14110:419::-;14276:4;14314:2;14303:9;14299:18;14291:26;;14363:9;14357:4;14353:20;14349:1;14338:9;14334:17;14327:47;14391:131;14517:4;14391:131;:::i;:::-;14383:139;;14110:419;;;:::o;14535:332::-;14656:4;14694:2;14683:9;14679:18;14671:26;;14707:71;14775:1;14764:9;14760:17;14751:6;14707:71;:::i;:::-;14788:72;14856:2;14845:9;14841:18;14832:6;14788:72;:::i;:::-;14535:332;;;;;:::o;14873:143::-;14930:5;14961:6;14955:13;14946:22;;14977:33;15004:5;14977:33;:::i;:::-;14873:143;;;;:::o;15022:351::-;15092:6;15141:2;15129:9;15120:7;15116:23;15112:32;15109:119;;;15147:79;;:::i;:::-;15109:119;15267:1;15292:64;15348:7;15339:6;15328:9;15324:22;15292:64;:::i;:::-;15282:74;;15238:128;15022:351;;;;:::o;15379:224::-;15519:34;15515:1;15507:6;15503:14;15496:58;15588:7;15583:2;15575:6;15571:15;15564:32;15379:224;:::o;15609:366::-;15751:3;15772:67;15836:2;15831:3;15772:67;:::i;:::-;15765:74;;15848:93;15937:3;15848:93;:::i;:::-;15966:2;15961:3;15957:12;15950:19;;15609:366;;;:::o;15981:419::-;16147:4;16185:2;16174:9;16170:18;16162:26;;16234:9;16228:4;16224:20;16220:1;16209:9;16205:17;16198:47;16262:131;16388:4;16262:131;:::i;:::-;16254:139;;15981:419;;;:::o;16406:174::-;16546:26;16542:1;16534:6;16530:14;16523:50;16406:174;:::o;16586:366::-;16728:3;16749:67;16813:2;16808:3;16749:67;:::i;:::-;16742:74;;16825:93;16914:3;16825:93;:::i;:::-;16943:2;16938:3;16934:12;16927:19;;16586:366;;;:::o;16958:419::-;17124:4;17162:2;17151:9;17147:18;17139:26;;17211:9;17205:4;17201:20;17197:1;17186:9;17182:17;17175:47;17239:131;17365:4;17239:131;:::i;:::-;17231:139;;16958:419;;;:::o;17383:169::-;17523:21;17519:1;17511:6;17507:14;17500:45;17383:169;:::o;17558:366::-;17700:3;17721:67;17785:2;17780:3;17721:67;:::i;:::-;17714:74;;17797:93;17886:3;17797:93;:::i;:::-;17915:2;17910:3;17906:12;17899:19;;17558:366;;;:::o;17930:419::-;18096:4;18134:2;18123:9;18119:18;18111:26;;18183:9;18177:4;18173:20;18169:1;18158:9;18154:17;18147:47;18211:131;18337:4;18211:131;:::i;:::-;18203:139;;17930:419;;;:::o;18355:180::-;18403:77;18400:1;18393:88;18500:4;18497:1;18490:15;18524:4;18521:1;18514:15;18541:98;18592:6;18626:5;18620:12;18610:22;;18541:98;;;:::o;18645:147::-;18746:11;18783:3;18768:18;;18645:147;;;;:::o;18798:386::-;18902:3;18930:38;18962:5;18930:38;:::i;:::-;18984:88;19065:6;19060:3;18984:88;:::i;:::-;18977:95;;19081:65;19139:6;19134:3;19127:4;19120:5;19116:16;19081:65;:::i;:::-;19171:6;19166:3;19162:16;19155:23;;18906:278;18798:386;;;;:::o;19190:271::-;19320:3;19342:93;19431:3;19422:6;19342:93;:::i;:::-;19335:100;;19452:3;19445:10;;19190:271;;;;:::o;19467:176::-;19607:28;19603:1;19595:6;19591:14;19584:52;19467:176;:::o;19649:366::-;19791:3;19812:67;19876:2;19871:3;19812:67;:::i;:::-;19805:74;;19888:93;19977:3;19888:93;:::i;:::-;20006:2;20001:3;19997:12;19990:19;;19649:366;;;:::o;20021:419::-;20187:4;20225:2;20214:9;20210:18;20202:26;;20274:9;20268:4;20264:20;20260:1;20249:9;20245:17;20238:47;20302:131;20428:4;20302:131;:::i;:::-;20294:139;;20021:419;;;:::o;20446:225::-;20586:34;20582:1;20574:6;20570:14;20563:58;20655:8;20650:2;20642:6;20638:15;20631:33;20446:225;:::o;20677:366::-;20819:3;20840:67;20904:2;20899:3;20840:67;:::i;:::-;20833:74;;20916:93;21005:3;20916:93;:::i;:::-;21034:2;21029:3;21025:12;21018:19;;20677:366;;;:::o;21049:419::-;21215:4;21253:2;21242:9;21238:18;21230:26;;21302:9;21296:4;21292:20;21288:1;21277:9;21273:17;21266:47;21330:131;21456:4;21330:131;:::i;:::-;21322:139;;21049:419;;;:::o;21474:182::-;21614:34;21610:1;21602:6;21598:14;21591:58;21474:182;:::o;21662:366::-;21804:3;21825:67;21889:2;21884:3;21825:67;:::i;:::-;21818:74;;21901:93;21990:3;21901:93;:::i;:::-;22019:2;22014:3;22010:12;22003:19;;21662:366;;;:::o;22034:419::-;22200:4;22238:2;22227:9;22223:18;22215:26;;22287:9;22281:4;22277:20;22273:1;22262:9;22258:17;22251:47;22315:131;22441:4;22315:131;:::i;:::-;22307:139;;22034:419;;;:::o;22459:223::-;22599:34;22595:1;22587:6;22583:14;22576:58;22668:6;22663:2;22655:6;22651:15;22644:31;22459:223;:::o;22688:366::-;22830:3;22851:67;22915:2;22910:3;22851:67;:::i;:::-;22844:74;;22927:93;23016:3;22927:93;:::i;:::-;23045:2;23040:3;23036:12;23029:19;;22688:366;;;:::o;23060:419::-;23226:4;23264:2;23253:9;23249:18;23241:26;;23313:9;23307:4;23303:20;23299:1;23288:9;23284:17;23277:47;23341:131;23467:4;23341:131;:::i;:::-;23333:139;;23060:419;;;:::o;23485:221::-;23625:34;23621:1;23613:6;23609:14;23602:58;23694:4;23689:2;23681:6;23677:15;23670:29;23485:221;:::o;23712:366::-;23854:3;23875:67;23939:2;23934:3;23875:67;:::i;:::-;23868:74;;23951:93;24040:3;23951:93;:::i;:::-;24069:2;24064:3;24060:12;24053:19;;23712:366;;;:::o;24084:419::-;24250:4;24288:2;24277:9;24273:18;24265:26;;24337:9;24331:4;24327:20;24323:1;24312:9;24308:17;24301:47;24365:131;24491:4;24365:131;:::i;:::-;24357:139;;24084:419;;;:::o;24509:179::-;24649:31;24645:1;24637:6;24633:14;24626:55;24509:179;:::o;24694:366::-;24836:3;24857:67;24921:2;24916:3;24857:67;:::i;:::-;24850:74;;24933:93;25022:3;24933:93;:::i;:::-;25051:2;25046:3;25042:12;25035:19;;24694:366;;;:::o;25066:419::-;25232:4;25270:2;25259:9;25255:18;25247:26;;25319:9;25313:4;25309:20;25305:1;25294:9;25290:17;25283:47;25347:131;25473:4;25347:131;:::i;:::-;25339:139;;25066:419;;;:::o;25491:170::-;25631:22;25627:1;25619:6;25615:14;25608:46;25491:170;:::o;25667:366::-;25809:3;25830:67;25894:2;25889:3;25830:67;:::i;:::-;25823:74;;25906:93;25995:3;25906:93;:::i;:::-;26024:2;26019:3;26015:12;26008:19;;25667:366;;;:::o;26039:419::-;26205:4;26243:2;26232:9;26228:18;26220:26;;26292:9;26286:4;26282:20;26278:1;26267:9;26263:17;26256:47;26320:131;26446:4;26320:131;:::i;:::-;26312:139;;26039:419;;;:::o;26464:775::-;26697:4;26735:3;26724:9;26720:19;26712:27;;26749:71;26817:1;26806:9;26802:17;26793:6;26749:71;:::i;:::-;26830:72;26898:2;26887:9;26883:18;26874:6;26830:72;:::i;:::-;26912;26980:2;26969:9;26965:18;26956:6;26912:72;:::i;:::-;26994;27062:2;27051:9;27047:18;27038:6;26994:72;:::i;:::-;27076:73;27144:3;27133:9;27129:19;27120:6;27076:73;:::i;:::-;27159;27227:3;27216:9;27212:19;27203:6;27159:73;:::i;:::-;26464:775;;;;;;;;;:::o;27245:410::-;27285:7;27308:20;27326:1;27308:20;:::i;:::-;27303:25;;27342:20;27360:1;27342:20;:::i;:::-;27337:25;;27397:1;27394;27390:9;27419:30;27437:11;27419:30;:::i;:::-;27408:41;;27598:1;27589:7;27585:15;27582:1;27579:22;27559:1;27552:9;27532:83;27509:139;;27628:18;;:::i;:::-;27509:139;27293:362;27245:410;;;;:::o;27661:180::-;27709:77;27706:1;27699:88;27806:4;27803:1;27796:15;27830:4;27827:1;27820:15;27847:185;27887:1;27904:20;27922:1;27904:20;:::i;:::-;27899:25;;27938:20;27956:1;27938:20;:::i;:::-;27933:25;;27977:1;27967:35;;27982:18;;:::i;:::-;27967:35;28024:1;28021;28017:9;28012:14;;27847:185;;;;:::o;28038:180::-;28086:77;28083:1;28076:88;28183:4;28180:1;28173:15;28207:4;28204:1;28197:15;28224:85;28269:7;28298:5;28287:16;;28224:85;;;:::o;28315:158::-;28373:9;28406:61;28424:42;28433:32;28459:5;28433:32;:::i;:::-;28424:42;:::i;:::-;28406:61;:::i;:::-;28393:74;;28315:158;;;:::o;28479:147::-;28574:45;28613:5;28574:45;:::i;:::-;28569:3;28562:58;28479:147;;:::o;28632:114::-;28699:6;28733:5;28727:12;28717:22;;28632:114;;;:::o;28752:184::-;28851:11;28885:6;28880:3;28873:19;28925:4;28920:3;28916:14;28901:29;;28752:184;;;;:::o;28942:132::-;29009:4;29032:3;29024:11;;29062:4;29057:3;29053:14;29045:22;;28942:132;;;:::o;29080:108::-;29157:24;29175:5;29157:24;:::i;:::-;29152:3;29145:37;29080:108;;:::o;29194:179::-;29263:10;29284:46;29326:3;29318:6;29284:46;:::i;:::-;29362:4;29357:3;29353:14;29339:28;;29194:179;;;;:::o;29379:113::-;29449:4;29481;29476:3;29472:14;29464:22;;29379:113;;;:::o;29528:732::-;29647:3;29676:54;29724:5;29676:54;:::i;:::-;29746:86;29825:6;29820:3;29746:86;:::i;:::-;29739:93;;29856:56;29906:5;29856:56;:::i;:::-;29935:7;29966:1;29951:284;29976:6;29973:1;29970:13;29951:284;;;30052:6;30046:13;30079:63;30138:3;30123:13;30079:63;:::i;:::-;30072:70;;30165:60;30218:6;30165:60;:::i;:::-;30155:70;;30011:224;29998:1;29995;29991:9;29986:14;;29951:284;;;29955:14;30251:3;30244:10;;29652:608;;;29528:732;;;;:::o;30266:942::-;30557:4;30595:3;30584:9;30580:19;30572:27;;30609:71;30677:1;30666:9;30662:17;30653:6;30609:71;:::i;:::-;30690:80;30766:2;30755:9;30751:18;30742:6;30690:80;:::i;:::-;30817:9;30811:4;30807:20;30802:2;30791:9;30787:18;30780:48;30845:108;30948:4;30939:6;30845:108;:::i;:::-;30837:116;;30963:72;31031:2;31020:9;31016:18;31007:6;30963:72;:::i;:::-;31045:73;31113:3;31102:9;31098:19;31089:6;31045:73;:::i;:::-;31128;31196:3;31185:9;31181:19;31172:6;31128:73;:::i;:::-;30266:942;;;;;;;;;:::o;31214:831::-;31477:4;31515:3;31504:9;31500:19;31492:27;;31529:71;31597:1;31586:9;31582:17;31573:6;31529:71;:::i;:::-;31610:80;31686:2;31675:9;31671:18;31662:6;31610:80;:::i;:::-;31737:9;31731:4;31727:20;31722:2;31711:9;31707:18;31700:48;31765:108;31868:4;31859:6;31765:108;:::i;:::-;31757:116;;31883:72;31951:2;31940:9;31936:18;31927:6;31883:72;:::i;:::-;31965:73;32033:3;32022:9;32018:19;32009:6;31965:73;:::i;:::-;31214:831;;;;;;;;:::o;32051:886::-;32312:4;32350:3;32339:9;32335:19;32327:27;;32364:71;32432:1;32421:9;32417:17;32408:6;32364:71;:::i;:::-;32445:72;32513:2;32502:9;32498:18;32489:6;32445:72;:::i;:::-;32527;32595:2;32584:9;32580:18;32571:6;32527:72;:::i;:::-;32609;32677:2;32666:9;32662:18;32653:6;32609:72;:::i;:::-;32691:73;32759:3;32748:9;32744:19;32735:6;32691:73;:::i;:::-;32774;32842:3;32831:9;32827:19;32818:6;32774:73;:::i;:::-;32857;32925:3;32914:9;32910:19;32901:6;32857:73;:::i;:::-;32051:886;;;;;;;;;;:::o;32943:224::-;33083:34;33079:1;33071:6;33067:14;33060:58;33152:7;33147:2;33139:6;33135:15;33128:32;32943:224;:::o;33173:366::-;33315:3;33336:67;33400:2;33395:3;33336:67;:::i;:::-;33329:74;;33412:93;33501:3;33412:93;:::i;:::-;33530:2;33525:3;33521:12;33514:19;;33173:366;;;:::o;33545:419::-;33711:4;33749:2;33738:9;33734:18;33726:26;;33798:9;33792:4;33788:20;33784:1;33773:9;33769:17;33762:47;33826:131;33952:4;33826:131;:::i;:::-;33818:139;;33545:419;;;:::o;33970:222::-;34110:34;34106:1;34098:6;34094:14;34087:58;34179:5;34174:2;34166:6;34162:15;34155:30;33970:222;:::o;34198:366::-;34340:3;34361:67;34425:2;34420:3;34361:67;:::i;:::-;34354:74;;34437:93;34526:3;34437:93;:::i;:::-;34555:2;34550:3;34546:12;34539:19;;34198:366;;;:::o;34570:419::-;34736:4;34774:2;34763:9;34759:18;34751:26;;34823:9;34817:4;34813:20;34809:1;34798:9;34794:17;34787:47;34851:131;34977:4;34851:131;:::i;:::-;34843:139;;34570:419;;;:::o;34995:225::-;35135:34;35131:1;35123:6;35119:14;35112:58;35204:8;35199:2;35191:6;35187:15;35180:33;34995:225;:::o;35226:366::-;35368:3;35389:67;35453:2;35448:3;35389:67;:::i;:::-;35382:74;;35465:93;35554:3;35465:93;:::i;:::-;35583:2;35578:3;35574:12;35567:19;;35226:366;;;:::o;35598:419::-;35764:4;35802:2;35791:9;35787:18;35779:26;;35851:9;35845:4;35841:20;35837:1;35826:9;35822:17;35815:47;35879:131;36005:4;35879:131;:::i;:::-;35871:139;;35598:419;;;:::o;36023:229::-;36163:34;36159:1;36151:6;36147:14;36140:58;36232:12;36227:2;36219:6;36215:15;36208:37;36023:229;:::o;36258:366::-;36400:3;36421:67;36485:2;36480:3;36421:67;:::i;:::-;36414:74;;36497:93;36586:3;36497:93;:::i;:::-;36615:2;36610:3;36606:12;36599:19;;36258:366;;;:::o;36630:419::-;36796:4;36834:2;36823:9;36819:18;36811:26;;36883:9;36877:4;36873:20;36869:1;36858:9;36854:17;36847:47;36911:131;37037:4;36911:131;:::i;:::-;36903:139;;36630:419;;;:::o;37055:180::-;37103:77;37100:1;37093:88;37200:4;37197:1;37190:15;37224:4;37221:1;37214:15;37241:807;37490:4;37528:3;37517:9;37513:19;37505:27;;37542:71;37610:1;37599:9;37595:17;37586:6;37542:71;:::i;:::-;37623:72;37691:2;37680:9;37676:18;37667:6;37623:72;:::i;:::-;37705:80;37781:2;37770:9;37766:18;37757:6;37705:80;:::i;:::-;37795;37871:2;37860:9;37856:18;37847:6;37795:80;:::i;:::-;37885:73;37953:3;37942:9;37938:19;37929:6;37885:73;:::i;:::-;37968;38036:3;38025:9;38021:19;38012:6;37968:73;:::i;:::-;37241:807;;;;;;;;;:::o;38054:663::-;38142:6;38150;38158;38207:2;38195:9;38186:7;38182:23;38178:32;38175:119;;;38213:79;;:::i;:::-;38175:119;38333:1;38358:64;38414:7;38405:6;38394:9;38390:22;38358:64;:::i;:::-;38348:74;;38304:128;38471:2;38497:64;38553:7;38544:6;38533:9;38529:22;38497:64;:::i;:::-;38487:74;;38442:129;38610:2;38636:64;38692:7;38683:6;38672:9;38668:22;38636:64;:::i;:::-;38626:74;;38581:129;38054:663;;;;;:::o;38723:442::-;38872:4;38910:2;38899:9;38895:18;38887:26;;38923:71;38991:1;38980:9;38976:17;38967:6;38923:71;:::i;:::-;39004:72;39072:2;39061:9;39057:18;39048:6;39004:72;:::i;:::-;39086;39154:2;39143:9;39139:18;39130:6;39086:72;:::i;:::-;38723:442;;;;;;:::o;39171:225::-;39311:34;39307:1;39299:6;39295:14;39288:58;39380:8;39375:2;39367:6;39363:15;39356:33;39171:225;:::o;39402:366::-;39544:3;39565:67;39629:2;39624:3;39565:67;:::i;:::-;39558:74;;39641:93;39730:3;39641:93;:::i;:::-;39759:2;39754:3;39750:12;39743:19;;39402:366;;;:::o;39774:419::-;39940:4;39978:2;39967:9;39963:18;39955:26;;40027:9;40021:4;40017:20;40013:1;40002:9;39998:17;39991:47;40055:131;40181:4;40055:131;:::i;:::-;40047:139;;39774:419;;;:::o;40199:179::-;40339:31;40335:1;40327:6;40323:14;40316:55;40199:179;:::o;40384:366::-;40526:3;40547:67;40611:2;40606:3;40547:67;:::i;:::-;40540:74;;40623:93;40712:3;40623:93;:::i;:::-;40741:2;40736:3;40732:12;40725:19;;40384:366;;;:::o;40756:419::-;40922:4;40960:2;40949:9;40945:18;40937:26;;41009:9;41003:4;40999:20;40995:1;40984:9;40980:17;40973:47;41037:131;41163:4;41037:131;:::i;:::-;41029:139;;40756:419;;;:::o

Swarm Source

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