ETH Price: $2,054.87 (+5.32%)
 

Overview

Max Total Supply

1 LOOT

Holders

7

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LOOTBOX

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2025-05-24
*/

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

/*───────────────────────────────────────────────────────────────────────────*\
│ LOOTBOX ─ community-first reflection token                                 │
│  • 2 % reflections                                                         │
│  • 1 % auto-liquidity (adds LP & locks it)                                 │
│  • 1 % marketing wallet                                                    │
│  • Anti-whale & sniper-guard                                               │
\*───────────────────────────────────────────────────────────────────────────*/

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */

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

pragma solidity ^0.8.0;

// OpenZeppelin Contracts (last updated v4.9.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);
}

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

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

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

// 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.
 */


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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}
// OpenZeppelin Contracts (last updated v4.9.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
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [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://consensys.net/diligence/blog/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.8.0/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);
        }
    }
}

/* ───── Uniswap interfaces ─────────────────────────────────────────────── */
interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
	

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

    function factory() external view returns (address);
    function WETH()    external view returns (address);
}

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

/* ───── Main contract ──────────────────────────────────────────────────── */
contract LOOTBOX is ERC20, Ownable, ReentrancyGuard {
    using Address for address;

    /* ── Parameters ───────────────────────────────────────────────────── */
    uint8   private constant _DECIMALS       = 9;
    uint256 private constant _INITIAL_SUPPLY = 1_000_000_000 * 10**_DECIMALS; // 1 B
    uint256 public  maxTxAmount   = _INITIAL_SUPPLY / 100;  // 1 %
    uint256 public  maxWalletSize = _INITIAL_SUPPLY / 50;   // 2 %

    /* fees (basis-points, 1 bp = 0.01 %) */
    uint256 public reflectionFee = 200;  // 2.00 %
    uint256 public liquidityFee  = 100;  // 1.00 %
    uint256 public marketingFee  = 100;  // 1.00 %
    uint256 private constant _FEE_DENOM = 10_000;

    address public immutable marketingWallet;
    IUniswapV2Router02 public immutable router;
    address public immutable pair;

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

    /* ── Reflection state ─────────────────────────────────────────────── */
    mapping(address => uint256) private _reflectionBalance;
    uint256 private _reflectionTotal =
        type(uint256).max - (type(uint256).max % _INITIAL_SUPPLY);
    uint256 private _reflectionFees;

    /* ── Constructor ──────────────────────────────────────────────────── */
    constructor(address router_, address marketing_) ERC20("LOOTBOX", "LOOT") {
        require(marketing_ != address(0), "marketing = zero");

        _mint(msg.sender, _INITIAL_SUPPLY);          // triggers _afterTokenTransfer

        router          = IUniswapV2Router02(router_);
        marketingWallet = marketing_;

        pair = IUniswapV2Factory(router.factory())
               .createPair(address(this), router.WETH());
    }

    /* ── Owner controls ──────────────────────────────────────────────── */
    function enableTrading() external onlyOwner  { tradingEnabled = true; }
    function setMaxTx(uint256 v) external onlyOwner   { maxTxAmount   = v; }
    function setMaxWallet(uint256 v) external onlyOwner { maxWalletSize = v; }

    function setFees(uint256 r, uint256 l, uint256 m) external onlyOwner {
        require(r<=1000 && l<=1000 && m<=1000, "fee > cap");
        reflectionFee = r; liquidityFee = l; marketingFee = m;
        emit FeesUpdated(r,l,m);
    }



    /* ── Core transfer override ──────────────────────────────────────── */
	function _transfer(address from, address to, uint256 amount)
		internal
		override                              // 👍 now matches OZ 4.x
		nonReentrant
	{
		/* anti-whale / trading guard */
		if (from != owner() && to != owner()) {
			require(tradingEnabled, "trading disabled");
			require(amount <= maxTxAmount, "tx > limit");
			if (to != pair)
				require(balanceOf(to) + amount <= maxWalletSize, "wallet > limit");
		}

		/* swap & liquify when selling */
		if (!inSwap && from != pair && (liquidityFee + marketingFee) > 0) {
			uint256 contractBal = balanceOf(address(this));
			if (contractBal > 0) _swapBack(contractBal);
		}

		/* take fees */
		if (!inSwap && from != owner() && to != owner()) {
			uint256 totalFee = reflectionFee + liquidityFee + marketingFee;
			uint256 feeAmt   = amount * totalFee / _FEE_DENOM;

			// send fees to the contract itself
			super._transfer(from, address(this), feeAmt);
			amount -= feeAmt;
		}

		/* normal transfer */
		super._transfer(from, to, amount);
	}
	
	function _path() private view returns (address[] memory arr) {
		arr = new address[](2);
		arr[0] = address(this);
		arr[1] = router.WETH();
	}

    /* ── Reflection accounting (OZ-4 hook) ───────────────────────────── */
    function _afterTokenTransfer(address from, address to, uint256 amount)
        internal
        override
    {
        uint256 rate    = _getRate();
        uint256 rAmount = amount * rate;

        if (from == address(0)) {                       // mint
            _reflectionBalance[to] += rAmount;
            return;
        }
        if (to == address(0)) {                         // burn
            _reflectionBalance[from] -= rAmount;
            _reflectionTotal         -= rAmount;
            return;
        }
        /* regular transfer */
        _reflectionBalance[from] -= rAmount;
        _reflectionBalance[to]   += rAmount;

        /* reflection fee */
        uint256 rFee = (amount * reflectionFee / _FEE_DENOM) * rate;
        _reflectionTotal -= rFee;
        _reflectionFees  += amount * reflectionFee / _FEE_DENOM;
    }

    function _getRate() private view returns (uint256) {
        return _reflectionTotal / totalSupply();
    }

    /* view helpers */
    function reflectionFromToken(uint256 t) external view returns (uint256) {
        return t * _getRate();
    }
    function tokenFromReflection(uint256 r) public view returns (uint256) {
        return r / _getRate();
    }

    /* ── Swap & liquify ──────────────────────────────────────────────── */
    function _swapBack(uint256 tokens) private swapping {
        uint256 totalSwapFee = liquidityFee + marketingFee;      // >0
        uint256 tokensForLP  = tokens * liquidityFee / totalSwapFee / 2;
        uint256 tokensToSwap = tokens - tokensForLP;

        uint256 startETH = address(this).balance;
        _approve(address(this), address(router), tokensToSwap);



        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokensToSwap, 0, _path(), address(this), block.timestamp
        );

        uint256 gainedETH = address(this).balance - startETH;
        uint256 ethForLP  = gainedETH * liquidityFee / totalSwapFee / 2;
        uint256 ethForMk  = gainedETH - ethForLP;

        /* add liquidity */
        if (ethForLP > 0 && tokensForLP > 0) {
            _approve(address(this), address(router), tokensForLP);
            router.addLiquidityETH{value: ethForLP}(
                address(this),
                tokensForLP,
                0, 0,
                owner(),
                block.timestamp
            );
        }
        /* marketing payout */
        if (ethForMk > 0) payable(marketingWallet).transfer(ethForMk);
    }

    /* ── House-keeping ──────────────────────────────────────────────── */
    receive() external payable {}
    function withdrawStuckETH() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    /* ── Events ─────────────────────────────────────────────────────── */
    event FeesUpdated(uint256 reflection, uint256 liquidity, uint256 marketing);
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"router_","type":"address"},{"internalType":"address","name":"marketing_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reflection","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSize","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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"t","type":"uint256"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"r","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"},{"internalType":"uint256","name":"m","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"v","type":"uint256"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"v","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"r","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e060405260646009600a62000016919062000b2a565b633b9aca0062000027919062000b7a565b62000033919062000bf1565b60075560326009600a62000048919062000b2a565b633b9aca0062000059919062000b7a565b62000065919062000bf1565b60085560c86009556064600a556064600b555f600c5f6101000a81548160ff0219169083151502179055506009600a620000a0919062000b2a565b633b9aca00620000b1919062000b7a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff620000de919062000c28565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200010b919062000c5f565b600e553480156200011a575f80fd5b5060405162003fb638038062003fb6833981810160405281019062000140919062000cfe565b6040518060400160405280600781526020017f4c4f4f54424f58000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4c4f4f54000000000000000000000000000000000000000000000000000000008152508160039081620001bd919062000f9e565b508060049081620001cf919062000f9e565b505050620001f2620001e6620004a260201b60201c565b620004a960201b60201c565b60016006819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200026b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026290620010e0565b60405180910390fd5b6200029d336009600a62000280919062000b2a565b633b9aca0062000291919062000b7a565b6200056c60201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060a05173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000351573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000377919062001100565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060a05173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003df573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000405919062001100565b6040518363ffffffff1660e01b81526004016200042492919062001141565b6020604051808303815f875af115801562000441573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000467919062001100565b73ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050505062001240565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620005dd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005d490620011ba565b60405180910390fd5b620005f05f8383620006d160201b60201c565b8060025f828254620006039190620011da565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620006b2919062001225565b60405180910390a3620006cd5f8383620006d660201b60201c565b5050565b505050565b5f620006e76200096a60201b60201c565b90505f8183620006f8919062000b7a565b90505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036200078b5780600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546200077c9190620011da565b92505081905550505062000965565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603620008365780600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546200080d919062000c5f565b9250508190555080600e5f82825462000827919062000c5f565b92505081905550505062000965565b80600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825462000884919062000c5f565b9250508190555080600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254620008d99190620011da565b925050819055505f8261271060095486620008f5919062000b7a565b62000901919062000bf1565b6200090d919062000b7a565b905080600e5f82825462000922919062000c5f565b92505081905550612710600954856200093c919062000b7a565b62000948919062000bf1565b600f5f8282546200095a9190620011da565b925050819055505050505b505050565b5f6200097b6200098f60201b60201c565b600e546200098a919062000bf1565b905090565b5f600254905090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562000a2257808604811115620009fa57620009f962000998565b5b600185161562000a0a5780820291505b808102905062000a1a85620009c5565b9450620009da565b94509492505050565b5f8262000a3c576001905062000b0e565b8162000a4b575f905062000b0e565b816001811462000a64576002811462000a6f5762000aa5565b600191505062000b0e565b60ff84111562000a845762000a8362000998565b5b8360020a91508482111562000a9e5762000a9d62000998565b5b5062000b0e565b5060208310610133831016604e8410600b841016171562000adf5782820a90508381111562000ad95762000ad862000998565b5b62000b0e565b62000aee8484846001620009d1565b9250905081840481111562000b085762000b0762000998565b5b81810290505b9392505050565b5f819050919050565b5f60ff82169050919050565b5f62000b368262000b15565b915062000b438362000b1e565b925062000b727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000a2b565b905092915050565b5f62000b868262000b15565b915062000b938362000b15565b925082820262000ba38162000b15565b9150828204841483151762000bbd5762000bbc62000998565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f62000bfd8262000b15565b915062000c0a8362000b15565b92508262000c1d5762000c1c62000bc4565b5b828204905092915050565b5f62000c348262000b15565b915062000c418362000b15565b92508262000c545762000c5362000bc4565b5b828206905092915050565b5f62000c6b8262000b15565b915062000c788362000b15565b925082820390508181111562000c935762000c9262000998565b5b92915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000cc88262000c9d565b9050919050565b62000cda8162000cbc565b811462000ce5575f80fd5b50565b5f8151905062000cf88162000ccf565b92915050565b5f806040838503121562000d175762000d1662000c99565b5b5f62000d268582860162000ce8565b925050602062000d398582860162000ce8565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000dbf57607f821691505b60208210810362000dd55762000dd462000d7a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000e397fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000dfc565b62000e45868362000dfc565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62000e8662000e8062000e7a8462000b15565b62000e5d565b62000b15565b9050919050565b5f819050919050565b62000ea18362000e66565b62000eb962000eb08262000e8d565b84845462000e08565b825550505050565b5f90565b62000ecf62000ec1565b62000edc81848462000e96565b505050565b5b8181101562000f035762000ef75f8262000ec5565b60018101905062000ee2565b5050565b601f82111562000f525762000f1c8162000ddb565b62000f278462000ded565b8101602085101562000f37578190505b62000f4f62000f468562000ded565b83018262000ee1565b50505b505050565b5f82821c905092915050565b5f62000f745f198460080262000f57565b1980831691505092915050565b5f62000f8e838362000f63565b9150826002028217905092915050565b62000fa98262000d43565b67ffffffffffffffff81111562000fc55762000fc462000d4d565b5b62000fd1825462000da7565b62000fde82828562000f07565b5f60209050601f83116001811462001014575f841562000fff578287015190505b6200100b858262000f81565b8655506200107a565b601f198416620010248662000ddb565b5f5b828110156200104d5784890151825560018201915060208501945060208101905062001026565b868310156200106d578489015162001069601f89168262000f63565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f6d61726b6574696e67203d207a65726f000000000000000000000000000000005f82015250565b5f620010c860108362001082565b9150620010d58262001092565b602082019050919050565b5f6020820190508181035f830152620010f981620010ba565b9050919050565b5f6020828403121562001118576200111762000c99565b5b5f620011278482850162000ce8565b91505092915050565b6200113b8162000cbc565b82525050565b5f604082019050620011565f83018562001130565b62001165602083018462001130565b9392505050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f620011a2601f8362001082565b9150620011af826200116c565b602082019050919050565b5f6020820190508181035f830152620011d38162001194565b9050919050565b5f620011e68262000b15565b9150620011f38362000b15565b92508282019050808211156200120e576200120d62000998565b5b92915050565b6200121f8162000b15565b82525050565b5f6020820190506200123a5f83018462001214565b92915050565b60805160a05160c051612d13620012a35f395f8181610a93015281816110ac015261117101525f8181610d0201528181611502015281816115290152818161161b015281816116420152611a9501525f818161090601526116fa0152612d135ff3fe6080604052600436106101d0575f3560e01c80638a8c523c116100f6578063a8aa1b3111610094578063dd62ed3e11610063578063dd62ed3e14610681578063f2fde38b146106bd578063f5648a4f146106e5578063f887ea40146106fb576101d7565b8063a8aa1b31146105cb578063a9059cbb146105f5578063bc33718214610631578063cec10c1114610659576101d7565b80638f3fa860116100d05780638f3fa8601461051157806395d89b411461053b57806398118cb414610565578063a457c2d71461058f576101d7565b80638a8c523c146104a75780638c0b5e22146104bd5780638da5cb5b146104e7576101d7565b8063395093511161016e57806370a082311161013d57806370a0823114610401578063715018a61461043d57806375f0a8741461045357806383ad79941461047d576101d7565b806339509351146103495780634ada218b146103855780635d0044ca146103af5780636b67c4df146103d7576101d7565b806318160ddd116101aa57806318160ddd1461027d57806323b872dd146102a75780632d838119146102e3578063313ce5671461031f576101d7565b806306fdde03146101db578063095ea7b3146102055780631392c08614610241576101d7565b366101d757005b5f80fd5b3480156101e6575f80fd5b506101ef610725565b6040516101fc9190611e6e565b60405180910390f35b348015610210575f80fd5b5061022b60048036038101906102269190611f1f565b6107b5565b6040516102389190611f77565b60405180910390f35b34801561024c575f80fd5b5061026760048036038101906102629190611f90565b6107d7565b6040516102749190611fca565b60405180910390f35b348015610288575f80fd5b506102916107f2565b60405161029e9190611fca565b60405180910390f35b3480156102b2575f80fd5b506102cd60048036038101906102c89190611fe3565b6107fb565b6040516102da9190611f77565b60405180910390f35b3480156102ee575f80fd5b5061030960048036038101906103049190611f90565b610829565b6040516103169190611fca565b60405180910390f35b34801561032a575f80fd5b50610333610844565b604051610340919061204e565b60405180910390f35b348015610354575f80fd5b5061036f600480360381019061036a9190611f1f565b61084c565b60405161037c9190611f77565b60405180910390f35b348015610390575f80fd5b50610399610882565b6040516103a69190611f77565b60405180910390f35b3480156103ba575f80fd5b506103d560048036038101906103d09190611f90565b610894565b005b3480156103e2575f80fd5b506103eb6108a6565b6040516103f89190611fca565b60405180910390f35b34801561040c575f80fd5b5061042760048036038101906104229190612067565b6108ac565b6040516104349190611fca565b60405180910390f35b348015610448575f80fd5b506104516108f1565b005b34801561045e575f80fd5b50610467610904565b60405161047491906120a1565b60405180910390f35b348015610488575f80fd5b50610491610928565b60405161049e9190611fca565b60405180910390f35b3480156104b2575f80fd5b506104bb61092e565b005b3480156104c8575f80fd5b506104d1610952565b6040516104de9190611fca565b60405180910390f35b3480156104f2575f80fd5b506104fb610958565b60405161050891906120a1565b60405180910390f35b34801561051c575f80fd5b50610525610980565b6040516105329190611fca565b60405180910390f35b348015610546575f80fd5b5061054f610986565b60405161055c9190611e6e565b60405180910390f35b348015610570575f80fd5b50610579610a16565b6040516105869190611fca565b60405180910390f35b34801561059a575f80fd5b506105b560048036038101906105b09190611f1f565b610a1c565b6040516105c29190611f77565b60405180910390f35b3480156105d6575f80fd5b506105df610a91565b6040516105ec91906120a1565b60405180910390f35b348015610600575f80fd5b5061061b60048036038101906106169190611f1f565b610ab5565b6040516106289190611f77565b60405180910390f35b34801561063c575f80fd5b5061065760048036038101906106529190611f90565b610ad7565b005b348015610664575f80fd5b5061067f600480360381019061067a91906120ba565b610ae9565b005b34801561068c575f80fd5b506106a760048036038101906106a2919061210a565b610ba7565b6040516106b49190611fca565b60405180910390f35b3480156106c8575f80fd5b506106e360048036038101906106de9190612067565b610c29565b005b3480156106f0575f80fd5b506106f9610cab565b005b348015610706575f80fd5b5061070f610d00565b60405161071c91906121a3565b60405180910390f35b606060038054610734906121e9565b80601f0160208091040260200160405190810160405280929190818152602001828054610760906121e9565b80156107ab5780601f10610782576101008083540402835291602001916107ab565b820191905f5260205f20905b81548152906001019060200180831161078e57829003601f168201915b5050505050905090565b5f806107bf610d24565b90506107cc818585610d2b565b600191505092915050565b5f6107e0610eee565b826107eb9190612246565b9050919050565b5f600254905090565b5f80610805610d24565b9050610812858285610f09565b61081d858585610f94565b60019150509392505050565b5f610832610eee565b8261083d91906122b4565b9050919050565b5f6012905090565b5f80610856610d24565b90506108778185856108688589610ba7565b61087291906122e4565b610d2b565b600191505092915050565b600c5f9054906101000a900460ff1681565b61089c611303565b8060088190555050565b600b5481565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6108f9611303565b6109025f611381565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60095481565b610936611303565b6001600c5f6101000a81548160ff021916908315150217905550565b60075481565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60085481565b606060048054610995906121e9565b80601f01602080910402602001604051908101604052809291908181526020018280546109c1906121e9565b8015610a0c5780601f106109e357610100808354040283529160200191610a0c565b820191905f5260205f20905b8154815290600101906020018083116109ef57829003601f168201915b5050505050905090565b600a5481565b5f80610a26610d24565b90505f610a338286610ba7565b905083811015610a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6f90612387565b60405180910390fd5b610a858286868403610d2b565b60019250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80610abf610d24565b9050610acc818585610f94565b600191505092915050565b610adf611303565b8060078190555050565b610af1611303565b6103e88311158015610b0557506103e88211155b8015610b1357506103e88111155b610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906123ef565b60405180910390fd5b8260098190555081600a8190555080600b819055507fcf8a1e1d5f09cf3c97dbb653cd9a4d7aace9292fbc1bb8211febf2d400febbdd838383604051610b9a9392919061240d565b60405180910390a1505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610c31611303565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c96906124b2565b60405180910390fd5b610ca881611381565b50565b610cb3611303565b610cbb610958565b73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610cfd573d5f803e3d5ffd5b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9090612540565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe906125ce565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610ee19190611fca565b60405180910390a3505050565b5f610ef76107f2565b600e54610f0491906122b4565b905090565b5f610f148484610ba7565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610f8e5781811015610f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7790612636565b60405180910390fd5b610f8d8484848403610d2b565b5b50505050565b610f9c611444565b610fa4610958565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156110125750610fe2610958565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561115757600c5f9054906101000a900460ff16611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c9061269e565b60405180910390fd5b6007548111156110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190612706565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611156576008548161110a846108ac565b61111491906122e4565b1115611155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c9061276e565b60405180910390fd5b5b5b600c60019054906101000a900460ff161580156111c057507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156111da57505f600b54600a546111d891906122e4565b115b156111ff575f6111e9306108ac565b90505f8111156111fd576111fc81611493565b5b505b600c60019054906101000a900460ff1615801561124f575061121f610958565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561128e575061125e610958565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156112eb575f600b54600a546009546112a791906122e4565b6112b191906122e4565b90505f61271082846112c39190612246565b6112cd91906122b4565b90506112da853083611781565b80836112e6919061278c565b925050505b6112f6838383611781565b6112fe6119ed565b505050565b61130b610d24565b73ffffffffffffffffffffffffffffffffffffffff16611329610958565b73ffffffffffffffffffffffffffffffffffffffff161461137f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137690612809565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600260065403611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148090612871565b60405180910390fd5b6002600681905550565b6001600c60016101000a81548160ff0219169083151502179055505f600b54600a546114bf91906122e4565b90505f600282600a54856114d39190612246565b6114dd91906122b4565b6114e791906122b4565b90505f81846114f6919061278c565b90505f479050611527307f000000000000000000000000000000000000000000000000000000000000000084610d2b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f61156d6119f7565b30426040518663ffffffff1660e01b815260040161158f95949392919061297f565b5f604051808303815f87803b1580156115a6575f80fd5b505af11580156115b8573d5f803e3d5ffd5b505050505f81476115c9919061278c565b90505f600286600a54846115dd9190612246565b6115e791906122b4565b6115f191906122b4565b90505f8183611600919061278c565b90505f8211801561161057505f86115b156116f057611640307f000000000000000000000000000000000000000000000000000000000000000088610d2b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198330895f80611689610958565b426040518863ffffffff1660e01b81526004016116ab969594939291906129d7565b60606040518083038185885af11580156116c7573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906116ec9190612a4a565b5050505b5f81111561175d577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801561175b573d5f803e3d5ffd5b505b505050505050505f600c60016101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e690612b0a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490612b98565b60405180910390fd5b611868838383611b71565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e290612c26565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119d49190611fca565b60405180910390a36119e7848484611b76565b50505050565b6001600681905550565b6060600267ffffffffffffffff811115611a1457611a13612c44565b5b604051908082528060200260200182016040528015611a425781602001602082028036833780820191505090505b50905030815f81518110611a5957611a58612c71565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611afc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b209190612cb2565b81600181518110611b3457611b33612c71565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b505050565b5f611b7f610eee565b90505f8183611b8e9190612246565b90505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611c1d5780600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611c0f91906122e4565b925050819055505050611ddf565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611cc25780600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611c9c919061278c565b9250508190555080600e5f828254611cb4919061278c565b925050819055505050611ddf565b80600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611d0e919061278c565b9250508190555080600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611d6191906122e4565b925050819055505f8261271060095486611d7b9190612246565b611d8591906122b4565b611d8f9190612246565b905080600e5f828254611da2919061278c565b9250508190555061271060095485611dba9190612246565b611dc491906122b4565b600f5f828254611dd491906122e4565b925050819055505050505b505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611e1b578082015181840152602081019050611e00565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611e4082611de4565b611e4a8185611dee565b9350611e5a818560208601611dfe565b611e6381611e26565b840191505092915050565b5f6020820190508181035f830152611e868184611e36565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611ebb82611e92565b9050919050565b611ecb81611eb1565b8114611ed5575f80fd5b50565b5f81359050611ee681611ec2565b92915050565b5f819050919050565b611efe81611eec565b8114611f08575f80fd5b50565b5f81359050611f1981611ef5565b92915050565b5f8060408385031215611f3557611f34611e8e565b5b5f611f4285828601611ed8565b9250506020611f5385828601611f0b565b9150509250929050565b5f8115159050919050565b611f7181611f5d565b82525050565b5f602082019050611f8a5f830184611f68565b92915050565b5f60208284031215611fa557611fa4611e8e565b5b5f611fb284828501611f0b565b91505092915050565b611fc481611eec565b82525050565b5f602082019050611fdd5f830184611fbb565b92915050565b5f805f60608486031215611ffa57611ff9611e8e565b5b5f61200786828701611ed8565b935050602061201886828701611ed8565b925050604061202986828701611f0b565b9150509250925092565b5f60ff82169050919050565b61204881612033565b82525050565b5f6020820190506120615f83018461203f565b92915050565b5f6020828403121561207c5761207b611e8e565b5b5f61208984828501611ed8565b91505092915050565b61209b81611eb1565b82525050565b5f6020820190506120b45f830184612092565b92915050565b5f805f606084860312156120d1576120d0611e8e565b5b5f6120de86828701611f0b565b93505060206120ef86828701611f0b565b925050604061210086828701611f0b565b9150509250925092565b5f80604083850312156121205761211f611e8e565b5b5f61212d85828601611ed8565b925050602061213e85828601611ed8565b9150509250929050565b5f819050919050565b5f61216b61216661216184611e92565b612148565b611e92565b9050919050565b5f61217c82612151565b9050919050565b5f61218d82612172565b9050919050565b61219d81612183565b82525050565b5f6020820190506121b65f830184612194565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061220057607f821691505b602082108103612213576122126121bc565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61225082611eec565b915061225b83611eec565b925082820261226981611eec565b915082820484148315176122805761227f612219565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6122be82611eec565b91506122c983611eec565b9250826122d9576122d8612287565b5b828204905092915050565b5f6122ee82611eec565b91506122f983611eec565b925082820190508082111561231157612310612219565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f612371602583611dee565b915061237c82612317565b604082019050919050565b5f6020820190508181035f83015261239e81612365565b9050919050565b7f666565203e2063617000000000000000000000000000000000000000000000005f82015250565b5f6123d9600983611dee565b91506123e4826123a5565b602082019050919050565b5f6020820190508181035f830152612406816123cd565b9050919050565b5f6060820190506124205f830186611fbb565b61242d6020830185611fbb565b61243a6040830184611fbb565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61249c602683611dee565b91506124a782612442565b604082019050919050565b5f6020820190508181035f8301526124c981612490565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61252a602483611dee565b9150612535826124d0565b604082019050919050565b5f6020820190508181035f8301526125578161251e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125b8602283611dee565b91506125c38261255e565b604082019050919050565b5f6020820190508181035f8301526125e5816125ac565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f612620601d83611dee565b915061262b826125ec565b602082019050919050565b5f6020820190508181035f83015261264d81612614565b9050919050565b7f74726164696e672064697361626c6564000000000000000000000000000000005f82015250565b5f612688601083611dee565b915061269382612654565b602082019050919050565b5f6020820190508181035f8301526126b58161267c565b9050919050565b7f7478203e206c696d6974000000000000000000000000000000000000000000005f82015250565b5f6126f0600a83611dee565b91506126fb826126bc565b602082019050919050565b5f6020820190508181035f83015261271d816126e4565b9050919050565b7f77616c6c6574203e206c696d69740000000000000000000000000000000000005f82015250565b5f612758600e83611dee565b915061276382612724565b602082019050919050565b5f6020820190508181035f8301526127858161274c565b9050919050565b5f61279682611eec565b91506127a183611eec565b92508282039050818111156127b9576127b8612219565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6127f3602083611dee565b91506127fe826127bf565b602082019050919050565b5f6020820190508181035f830152612820816127e7565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f61285b601f83611dee565b915061286682612827565b602082019050919050565b5f6020820190508181035f8301526128888161284f565b9050919050565b5f819050919050565b5f6128b26128ad6128a88461288f565b612148565b611eec565b9050919050565b6128c281612898565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6128fa81611eb1565b82525050565b5f61290b83836128f1565b60208301905092915050565b5f602082019050919050565b5f61292d826128c8565b61293781856128d2565b9350612942836128e2565b805f5b838110156129725781516129598882612900565b975061296483612917565b925050600181019050612945565b5085935050505092915050565b5f60a0820190506129925f830188611fbb565b61299f60208301876128b9565b81810360408301526129b18186612923565b90506129c06060830185612092565b6129cd6080830184611fbb565b9695505050505050565b5f60c0820190506129ea5f830189612092565b6129f76020830188611fbb565b612a0460408301876128b9565b612a1160608301866128b9565b612a1e6080830185612092565b612a2b60a0830184611fbb565b979650505050505050565b5f81519050612a4481611ef5565b92915050565b5f805f60608486031215612a6157612a60611e8e565b5b5f612a6e86828701612a36565b9350506020612a7f86828701612a36565b9250506040612a9086828701612a36565b9150509250925092565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f612af4602583611dee565b9150612aff82612a9a565b604082019050919050565b5f6020820190508181035f830152612b2181612ae8565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612b82602383611dee565b9150612b8d82612b28565b604082019050919050565b5f6020820190508181035f830152612baf81612b76565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612c10602683611dee565b9150612c1b82612bb6565b604082019050919050565b5f6020820190508181035f830152612c3d81612c04565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050612cac81611ec2565b92915050565b5f60208284031215612cc757612cc6611e8e565b5b5f612cd484828501612c9e565b9150509291505056fea2646970667358221220e52c6f4d2394f9534ccaf66149d98a5b424a2f32a2fc989d536b0ea1e196138664736f6c634300081400330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000007c43d84e9649de3183e2889571e7bd687ca4a45f

Deployed Bytecode

0x6080604052600436106101d0575f3560e01c80638a8c523c116100f6578063a8aa1b3111610094578063dd62ed3e11610063578063dd62ed3e14610681578063f2fde38b146106bd578063f5648a4f146106e5578063f887ea40146106fb576101d7565b8063a8aa1b31146105cb578063a9059cbb146105f5578063bc33718214610631578063cec10c1114610659576101d7565b80638f3fa860116100d05780638f3fa8601461051157806395d89b411461053b57806398118cb414610565578063a457c2d71461058f576101d7565b80638a8c523c146104a75780638c0b5e22146104bd5780638da5cb5b146104e7576101d7565b8063395093511161016e57806370a082311161013d57806370a0823114610401578063715018a61461043d57806375f0a8741461045357806383ad79941461047d576101d7565b806339509351146103495780634ada218b146103855780635d0044ca146103af5780636b67c4df146103d7576101d7565b806318160ddd116101aa57806318160ddd1461027d57806323b872dd146102a75780632d838119146102e3578063313ce5671461031f576101d7565b806306fdde03146101db578063095ea7b3146102055780631392c08614610241576101d7565b366101d757005b5f80fd5b3480156101e6575f80fd5b506101ef610725565b6040516101fc9190611e6e565b60405180910390f35b348015610210575f80fd5b5061022b60048036038101906102269190611f1f565b6107b5565b6040516102389190611f77565b60405180910390f35b34801561024c575f80fd5b5061026760048036038101906102629190611f90565b6107d7565b6040516102749190611fca565b60405180910390f35b348015610288575f80fd5b506102916107f2565b60405161029e9190611fca565b60405180910390f35b3480156102b2575f80fd5b506102cd60048036038101906102c89190611fe3565b6107fb565b6040516102da9190611f77565b60405180910390f35b3480156102ee575f80fd5b5061030960048036038101906103049190611f90565b610829565b6040516103169190611fca565b60405180910390f35b34801561032a575f80fd5b50610333610844565b604051610340919061204e565b60405180910390f35b348015610354575f80fd5b5061036f600480360381019061036a9190611f1f565b61084c565b60405161037c9190611f77565b60405180910390f35b348015610390575f80fd5b50610399610882565b6040516103a69190611f77565b60405180910390f35b3480156103ba575f80fd5b506103d560048036038101906103d09190611f90565b610894565b005b3480156103e2575f80fd5b506103eb6108a6565b6040516103f89190611fca565b60405180910390f35b34801561040c575f80fd5b5061042760048036038101906104229190612067565b6108ac565b6040516104349190611fca565b60405180910390f35b348015610448575f80fd5b506104516108f1565b005b34801561045e575f80fd5b50610467610904565b60405161047491906120a1565b60405180910390f35b348015610488575f80fd5b50610491610928565b60405161049e9190611fca565b60405180910390f35b3480156104b2575f80fd5b506104bb61092e565b005b3480156104c8575f80fd5b506104d1610952565b6040516104de9190611fca565b60405180910390f35b3480156104f2575f80fd5b506104fb610958565b60405161050891906120a1565b60405180910390f35b34801561051c575f80fd5b50610525610980565b6040516105329190611fca565b60405180910390f35b348015610546575f80fd5b5061054f610986565b60405161055c9190611e6e565b60405180910390f35b348015610570575f80fd5b50610579610a16565b6040516105869190611fca565b60405180910390f35b34801561059a575f80fd5b506105b560048036038101906105b09190611f1f565b610a1c565b6040516105c29190611f77565b60405180910390f35b3480156105d6575f80fd5b506105df610a91565b6040516105ec91906120a1565b60405180910390f35b348015610600575f80fd5b5061061b60048036038101906106169190611f1f565b610ab5565b6040516106289190611f77565b60405180910390f35b34801561063c575f80fd5b5061065760048036038101906106529190611f90565b610ad7565b005b348015610664575f80fd5b5061067f600480360381019061067a91906120ba565b610ae9565b005b34801561068c575f80fd5b506106a760048036038101906106a2919061210a565b610ba7565b6040516106b49190611fca565b60405180910390f35b3480156106c8575f80fd5b506106e360048036038101906106de9190612067565b610c29565b005b3480156106f0575f80fd5b506106f9610cab565b005b348015610706575f80fd5b5061070f610d00565b60405161071c91906121a3565b60405180910390f35b606060038054610734906121e9565b80601f0160208091040260200160405190810160405280929190818152602001828054610760906121e9565b80156107ab5780601f10610782576101008083540402835291602001916107ab565b820191905f5260205f20905b81548152906001019060200180831161078e57829003601f168201915b5050505050905090565b5f806107bf610d24565b90506107cc818585610d2b565b600191505092915050565b5f6107e0610eee565b826107eb9190612246565b9050919050565b5f600254905090565b5f80610805610d24565b9050610812858285610f09565b61081d858585610f94565b60019150509392505050565b5f610832610eee565b8261083d91906122b4565b9050919050565b5f6012905090565b5f80610856610d24565b90506108778185856108688589610ba7565b61087291906122e4565b610d2b565b600191505092915050565b600c5f9054906101000a900460ff1681565b61089c611303565b8060088190555050565b600b5481565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6108f9611303565b6109025f611381565b565b7f0000000000000000000000007c43d84e9649de3183e2889571e7bd687ca4a45f81565b60095481565b610936611303565b6001600c5f6101000a81548160ff021916908315150217905550565b60075481565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60085481565b606060048054610995906121e9565b80601f01602080910402602001604051908101604052809291908181526020018280546109c1906121e9565b8015610a0c5780601f106109e357610100808354040283529160200191610a0c565b820191905f5260205f20905b8154815290600101906020018083116109ef57829003601f168201915b5050505050905090565b600a5481565b5f80610a26610d24565b90505f610a338286610ba7565b905083811015610a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6f90612387565b60405180910390fd5b610a858286868403610d2b565b60019250505092915050565b7f0000000000000000000000006a681dfb08dfa4ce4e9e1461ad74da9872845ee281565b5f80610abf610d24565b9050610acc818585610f94565b600191505092915050565b610adf611303565b8060078190555050565b610af1611303565b6103e88311158015610b0557506103e88211155b8015610b1357506103e88111155b610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906123ef565b60405180910390fd5b8260098190555081600a8190555080600b819055507fcf8a1e1d5f09cf3c97dbb653cd9a4d7aace9292fbc1bb8211febf2d400febbdd838383604051610b9a9392919061240d565b60405180910390a1505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610c31611303565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c96906124b2565b60405180910390fd5b610ca881611381565b50565b610cb3611303565b610cbb610958565b73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610cfd573d5f803e3d5ffd5b50565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9090612540565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe906125ce565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610ee19190611fca565b60405180910390a3505050565b5f610ef76107f2565b600e54610f0491906122b4565b905090565b5f610f148484610ba7565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610f8e5781811015610f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7790612636565b60405180910390fd5b610f8d8484848403610d2b565b5b50505050565b610f9c611444565b610fa4610958565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156110125750610fe2610958565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561115757600c5f9054906101000a900460ff16611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c9061269e565b60405180910390fd5b6007548111156110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190612706565b60405180910390fd5b7f0000000000000000000000006a681dfb08dfa4ce4e9e1461ad74da9872845ee273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611156576008548161110a846108ac565b61111491906122e4565b1115611155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c9061276e565b60405180910390fd5b5b5b600c60019054906101000a900460ff161580156111c057507f0000000000000000000000006a681dfb08dfa4ce4e9e1461ad74da9872845ee273ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156111da57505f600b54600a546111d891906122e4565b115b156111ff575f6111e9306108ac565b90505f8111156111fd576111fc81611493565b5b505b600c60019054906101000a900460ff1615801561124f575061121f610958565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561128e575061125e610958565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156112eb575f600b54600a546009546112a791906122e4565b6112b191906122e4565b90505f61271082846112c39190612246565b6112cd91906122b4565b90506112da853083611781565b80836112e6919061278c565b925050505b6112f6838383611781565b6112fe6119ed565b505050565b61130b610d24565b73ffffffffffffffffffffffffffffffffffffffff16611329610958565b73ffffffffffffffffffffffffffffffffffffffff161461137f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137690612809565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600260065403611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148090612871565b60405180910390fd5b6002600681905550565b6001600c60016101000a81548160ff0219169083151502179055505f600b54600a546114bf91906122e4565b90505f600282600a54856114d39190612246565b6114dd91906122b4565b6114e791906122b4565b90505f81846114f6919061278c565b90505f479050611527307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84610d2b565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f61156d6119f7565b30426040518663ffffffff1660e01b815260040161158f95949392919061297f565b5f604051808303815f87803b1580156115a6575f80fd5b505af11580156115b8573d5f803e3d5ffd5b505050505f81476115c9919061278c565b90505f600286600a54846115dd9190612246565b6115e791906122b4565b6115f191906122b4565b90505f8183611600919061278c565b90505f8211801561161057505f86115b156116f057611640307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d88610d2b565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d7198330895f80611689610958565b426040518863ffffffff1660e01b81526004016116ab969594939291906129d7565b60606040518083038185885af11580156116c7573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906116ec9190612a4a565b5050505b5f81111561175d577f0000000000000000000000007c43d84e9649de3183e2889571e7bd687ca4a45f73ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801561175b573d5f803e3d5ffd5b505b505050505050505f600c60016101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e690612b0a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490612b98565b60405180910390fd5b611868838383611b71565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e290612c26565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119d49190611fca565b60405180910390a36119e7848484611b76565b50505050565b6001600681905550565b6060600267ffffffffffffffff811115611a1457611a13612c44565b5b604051908082528060200260200182016040528015611a425781602001602082028036833780820191505090505b50905030815f81518110611a5957611a58612c71565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611afc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b209190612cb2565b81600181518110611b3457611b33612c71565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b505050565b5f611b7f610eee565b90505f8183611b8e9190612246565b90505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611c1d5780600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611c0f91906122e4565b925050819055505050611ddf565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611cc25780600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611c9c919061278c565b9250508190555080600e5f828254611cb4919061278c565b925050819055505050611ddf565b80600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611d0e919061278c565b9250508190555080600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611d6191906122e4565b925050819055505f8261271060095486611d7b9190612246565b611d8591906122b4565b611d8f9190612246565b905080600e5f828254611da2919061278c565b9250508190555061271060095485611dba9190612246565b611dc491906122b4565b600f5f828254611dd491906122e4565b925050819055505050505b505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611e1b578082015181840152602081019050611e00565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611e4082611de4565b611e4a8185611dee565b9350611e5a818560208601611dfe565b611e6381611e26565b840191505092915050565b5f6020820190508181035f830152611e868184611e36565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611ebb82611e92565b9050919050565b611ecb81611eb1565b8114611ed5575f80fd5b50565b5f81359050611ee681611ec2565b92915050565b5f819050919050565b611efe81611eec565b8114611f08575f80fd5b50565b5f81359050611f1981611ef5565b92915050565b5f8060408385031215611f3557611f34611e8e565b5b5f611f4285828601611ed8565b9250506020611f5385828601611f0b565b9150509250929050565b5f8115159050919050565b611f7181611f5d565b82525050565b5f602082019050611f8a5f830184611f68565b92915050565b5f60208284031215611fa557611fa4611e8e565b5b5f611fb284828501611f0b565b91505092915050565b611fc481611eec565b82525050565b5f602082019050611fdd5f830184611fbb565b92915050565b5f805f60608486031215611ffa57611ff9611e8e565b5b5f61200786828701611ed8565b935050602061201886828701611ed8565b925050604061202986828701611f0b565b9150509250925092565b5f60ff82169050919050565b61204881612033565b82525050565b5f6020820190506120615f83018461203f565b92915050565b5f6020828403121561207c5761207b611e8e565b5b5f61208984828501611ed8565b91505092915050565b61209b81611eb1565b82525050565b5f6020820190506120b45f830184612092565b92915050565b5f805f606084860312156120d1576120d0611e8e565b5b5f6120de86828701611f0b565b93505060206120ef86828701611f0b565b925050604061210086828701611f0b565b9150509250925092565b5f80604083850312156121205761211f611e8e565b5b5f61212d85828601611ed8565b925050602061213e85828601611ed8565b9150509250929050565b5f819050919050565b5f61216b61216661216184611e92565b612148565b611e92565b9050919050565b5f61217c82612151565b9050919050565b5f61218d82612172565b9050919050565b61219d81612183565b82525050565b5f6020820190506121b65f830184612194565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061220057607f821691505b602082108103612213576122126121bc565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61225082611eec565b915061225b83611eec565b925082820261226981611eec565b915082820484148315176122805761227f612219565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6122be82611eec565b91506122c983611eec565b9250826122d9576122d8612287565b5b828204905092915050565b5f6122ee82611eec565b91506122f983611eec565b925082820190508082111561231157612310612219565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f612371602583611dee565b915061237c82612317565b604082019050919050565b5f6020820190508181035f83015261239e81612365565b9050919050565b7f666565203e2063617000000000000000000000000000000000000000000000005f82015250565b5f6123d9600983611dee565b91506123e4826123a5565b602082019050919050565b5f6020820190508181035f830152612406816123cd565b9050919050565b5f6060820190506124205f830186611fbb565b61242d6020830185611fbb565b61243a6040830184611fbb565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61249c602683611dee565b91506124a782612442565b604082019050919050565b5f6020820190508181035f8301526124c981612490565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61252a602483611dee565b9150612535826124d0565b604082019050919050565b5f6020820190508181035f8301526125578161251e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125b8602283611dee565b91506125c38261255e565b604082019050919050565b5f6020820190508181035f8301526125e5816125ac565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f612620601d83611dee565b915061262b826125ec565b602082019050919050565b5f6020820190508181035f83015261264d81612614565b9050919050565b7f74726164696e672064697361626c6564000000000000000000000000000000005f82015250565b5f612688601083611dee565b915061269382612654565b602082019050919050565b5f6020820190508181035f8301526126b58161267c565b9050919050565b7f7478203e206c696d6974000000000000000000000000000000000000000000005f82015250565b5f6126f0600a83611dee565b91506126fb826126bc565b602082019050919050565b5f6020820190508181035f83015261271d816126e4565b9050919050565b7f77616c6c6574203e206c696d69740000000000000000000000000000000000005f82015250565b5f612758600e83611dee565b915061276382612724565b602082019050919050565b5f6020820190508181035f8301526127858161274c565b9050919050565b5f61279682611eec565b91506127a183611eec565b92508282039050818111156127b9576127b8612219565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6127f3602083611dee565b91506127fe826127bf565b602082019050919050565b5f6020820190508181035f830152612820816127e7565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f61285b601f83611dee565b915061286682612827565b602082019050919050565b5f6020820190508181035f8301526128888161284f565b9050919050565b5f819050919050565b5f6128b26128ad6128a88461288f565b612148565b611eec565b9050919050565b6128c281612898565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6128fa81611eb1565b82525050565b5f61290b83836128f1565b60208301905092915050565b5f602082019050919050565b5f61292d826128c8565b61293781856128d2565b9350612942836128e2565b805f5b838110156129725781516129598882612900565b975061296483612917565b925050600181019050612945565b5085935050505092915050565b5f60a0820190506129925f830188611fbb565b61299f60208301876128b9565b81810360408301526129b18186612923565b90506129c06060830185612092565b6129cd6080830184611fbb565b9695505050505050565b5f60c0820190506129ea5f830189612092565b6129f76020830188611fbb565b612a0460408301876128b9565b612a1160608301866128b9565b612a1e6080830185612092565b612a2b60a0830184611fbb565b979650505050505050565b5f81519050612a4481611ef5565b92915050565b5f805f60608486031215612a6157612a60611e8e565b5b5f612a6e86828701612a36565b9350506020612a7f86828701612a36565b9250506040612a9086828701612a36565b9150509250925092565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f612af4602583611dee565b9150612aff82612a9a565b604082019050919050565b5f6020820190508181035f830152612b2181612ae8565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612b82602383611dee565b9150612b8d82612b28565b604082019050919050565b5f6020820190508181035f830152612baf81612b76565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612c10602683611dee565b9150612c1b82612bb6565b604082019050919050565b5f6020820190508181035f830152612c3d81612c04565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050612cac81611ec2565b92915050565b5f60208284031215612cc757612cc6611e8e565b5b5f612cd484828501612c9e565b9150509291505056fea2646970667358221220e52c6f4d2394f9534ccaf66149d98a5b424a2f32a2fc989d536b0ea1e196138664736f6c63430008140033

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

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000007c43d84e9649de3183e2889571e7bd687ca4a45f

-----Decoded View---------------
Arg [0] : router_ (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : marketing_ (address): 0x7c43D84e9649DE3183e2889571e7Bd687Ca4a45F

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 0000000000000000000000007c43d84e9649de3183e2889571e7bd687ca4a45f


Deployed Bytecode Sourcemap

35651:7512:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7488:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9848:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40937:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8617:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10629:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41055:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8459:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11299:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36597:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38087:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36358:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8788:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20890:103;;;;;;;;;;;;;:::i;:::-;;36463:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36254:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37932:71;;;;;;;;;;;;;:::i;:::-;;36070:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20249:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36138:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7707:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36306:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12040:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36559:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9121:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38009:72;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38169:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9377:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21148:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42771:114;;;;;;;;;;;;;:::i;:::-;;36510:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7488:100;7542:13;7575:5;7568:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7488:100;:::o;9848:201::-;9931:4;9948:13;9964:12;:10;:12::i;:::-;9948:28;;9987:32;9996:5;10003:7;10012:6;9987:8;:32::i;:::-;10037:4;10030:11;;;9848:201;;;;:::o;40937:112::-;41000:7;41031:10;:8;:10::i;:::-;41027:1;:14;;;;:::i;:::-;41020:21;;40937:112;;;:::o;8617:108::-;8678:7;8705:12;;8698:19;;8617:108;:::o;10629:261::-;10726:4;10743:15;10761:12;:10;:12::i;:::-;10743:30;;10784:38;10800:4;10806:7;10815:6;10784:15;:38::i;:::-;10833:27;10843:4;10849:2;10853:6;10833:9;:27::i;:::-;10878:4;10871:11;;;10629:261;;;;;:::o;41055:110::-;41116:7;41147:10;:8;:10::i;:::-;41143:1;:14;;;;:::i;:::-;41136:21;;41055:110;;;:::o;8459:93::-;8517:5;8542:2;8535:9;;8459:93;:::o;11299:238::-;11387:4;11404:13;11420:12;:10;:12::i;:::-;11404:28;;11443:64;11452:5;11459:7;11496:10;11468:25;11478:5;11485:7;11468:9;:25::i;:::-;:38;;;;:::i;:::-;11443:8;:64::i;:::-;11525:4;11518:11;;;11299:238;;;;:::o;36597:34::-;;;;;;;;;;;;;:::o;38087:74::-;20135:13;:11;:13::i;:::-;38157:1:::1;38141:13;:17;;;;38087:74:::0;:::o;36358:34::-;;;;:::o;8788:127::-;8862:7;8889:9;:18;8899:7;8889:18;;;;;;;;;;;;;;;;8882:25;;8788:127;;;:::o;20890:103::-;20135:13;:11;:13::i;:::-;20955:30:::1;20982:1;20955:18;:30::i;:::-;20890:103::o:0;36463:40::-;;;:::o;36254:34::-;;;;:::o;37932:71::-;20135:13;:11;:13::i;:::-;37996:4:::1;37979:14;;:21;;;;;;;;;;;;;;;;;;37932:71::o:0;36070:53::-;;;;:::o;20249:87::-;20295:7;20322:6;;;;;;;;;;;20315:13;;20249:87;:::o;36138:52::-;;;;:::o;7707:104::-;7763:13;7796:7;7789:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7707:104;:::o;36306:34::-;;;;:::o;12040:436::-;12133:4;12150:13;12166:12;:10;:12::i;:::-;12150:28;;12189:24;12216:25;12226:5;12233:7;12216:9;:25::i;:::-;12189:52;;12280:15;12260:16;:35;;12252:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;12373:60;12382:5;12389:7;12417:15;12398:16;:34;12373:8;:60::i;:::-;12464:4;12457:11;;;;12040:436;;;;:::o;36559:29::-;;;:::o;9121:193::-;9200:4;9217:13;9233:12;:10;:12::i;:::-;9217:28;;9256;9266:5;9273:2;9277:6;9256:9;:28::i;:::-;9302:4;9295:11;;;9121:193;;;;:::o;38009:72::-;20135:13;:11;:13::i;:::-;38077:1:::1;38061:11;:17;;;;38009:72:::0;:::o;38169:237::-;20135:13;:11;:13::i;:::-;38260:4:::1;38257:1;:7;;:18;;;;;38271:4;38268:1;:7;;38257:18;:29;;;;;38282:4;38279:1;:7;;38257:29;38249:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;38327:1;38311:13;:17;;;;38345:1;38330:12;:16;;;;38363:1;38348:12;:16;;;;38380:18;38392:1;38394;38396;38380:18;;;;;;;;:::i;:::-;;;;;;;;38169:237:::0;;;:::o;9377:151::-;9466:7;9493:11;:18;9505:5;9493:18;;;;;;;;;;;;;;;:27;9512:7;9493:27;;;;;;;;;;;;;;;;9486:34;;9377:151;;;;:::o;21148:201::-;20135:13;:11;:13::i;:::-;21257:1:::1;21237:22;;:8;:22;;::::0;21229:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21313:28;21332:8;21313:18;:28::i;:::-;21148:201:::0;:::o;42771:114::-;20135:13;:11;:13::i;:::-;42837:7:::1;:5;:7::i;:::-;42829:25;;:48;42855:21;42829:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;42771:114::o:0;36510:42::-;;;:::o;5294:98::-;5347:7;5374:10;5367:17;;5294:98;:::o;16033:346::-;16152:1;16135:19;;:5;:19;;;16127:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16233:1;16214:21;;:7;:21;;;16206:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16317:6;16287:11;:18;16299:5;16287:18;;;;;;;;;;;;;;;:27;16306:7;16287:27;;;;;;;;;;;;;;;:36;;;;16355:7;16339:32;;16348:5;16339:32;;;16364:6;16339:32;;;;;;:::i;:::-;;;;;;;;16033:346;;;:::o;40796:109::-;40838:7;40884:13;:11;:13::i;:::-;40865:16;;:32;;;;:::i;:::-;40858:39;;40796:109;:::o;16670:419::-;16771:24;16798:25;16808:5;16815:7;16798:9;:25::i;:::-;16771:52;;16858:17;16838:16;:37;16834:248;;16920:6;16900:16;:26;;16892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17004:51;17013:5;17020:7;17048:6;17029:16;:25;17004:8;:51::i;:::-;16834:248;16760:329;16670:419;;;:::o;38577:1038::-;23983:21;:19;:21::i;:::-;38789:7:::1;:5;:7::i;:::-;38781:15;;:4;:15;;;;:32;;;;;38806:7;:5;:7::i;:::-;38800:13;;:2;:13;;;;38781:32;38777:236;;;38829:14;;;;;;;;;;;38821:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;38888:11;;38878:6;:21;;38870:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;38930:4;38924:10;;:2;:10;;;38920:87;;38975:13;;38965:6;38949:13;38959:2;38949:9;:13::i;:::-;:22;;;;:::i;:::-;:39;;38941:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;38920:87;38777:236;39061:6;;;;;;;;;;;39060:7;:23;;;;;39079:4;39071:12;;:4;:12;;;;39060:23;:60;;;;;39119:1;39103:12;;39088;;:27;;;;:::i;:::-;39087:33;39060:60;39056:173;;;39128:19;39150:24;39168:4;39150:9;:24::i;:::-;39128:46;;39198:1;39184:11;:15;39180:43;;;39201:22;39211:11;39201:9;:22::i;:::-;39180:43;39122:107;39056:173;39259:6;;;;;;;;;;;39258:7;:26;;;;;39277:7;:5;:7::i;:::-;39269:15;;:4;:15;;;;39258:26;:43;;;;;39294:7;:5;:7::i;:::-;39288:13;;:2;:13;;;;39258:43;39254:292;;;39309:16;39359:12;;39344;;39328:13;;:28;;;;:::i;:::-;:43;;;;:::i;:::-;39309:62;;39377:14;36448:6;39405:8;39396:6;:17;;;;:::i;:::-;:30;;;;:::i;:::-;39377:49;;39474:44;39490:4;39504;39511:6;39474:15;:44::i;:::-;39534:6;39524:16;;;;;:::i;:::-;;;39303:243;;39254:292;39577:33;39593:4;39599:2;39603:6;39577:15;:33::i;:::-;24027:20:::0;:18;:20::i;:::-;38577:1038;;;:::o;20414:132::-;20489:12;:10;:12::i;:::-;20478:23;;:7;:5;:7::i;:::-;:23;;;20470:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20414:132::o;21509:191::-;21583:16;21602:6;;;;;;;;;;;21583:25;;21628:8;21619:6;;:17;;;;;;;;;;;;;;;;;;21683:8;21652:40;;21673:8;21652:40;;;;;;;;;;;;21572:128;21509:191;:::o;24063:293::-;23465:1;24197:7;;:19;24189:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23465:1;24330:7;:18;;;;24063:293::o;41351:1200::-;36695:4;36686:6;;:13;;;;;;;;;;;;;;;;;;41414:20:::1;41452:12;;41437;;:27;;;;:::i;:::-;41414:50;;41486:19;41548:1;41533:12;41518;;41509:6;:21;;;;:::i;:::-;:36;;;;:::i;:::-;:40;;;;:::i;:::-;41486:63;;41560:20;41592:11;41583:6;:20;;;;:::i;:::-;41560:43;;41616:16;41635:21;41616:40;;41667:54;41684:4;41699:6;41708:12;41667:8;:54::i;:::-;41738:6;:57;;;41810:12;41824:1;41827:7;:5;:7::i;:::-;41844:4;41851:15;41738:139;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41890:17;41934:8;41910:21;:32;;;;:::i;:::-;41890:52;;41953:16;42015:1;42000:12;41985;;41973:9;:24;;;;:::i;:::-;:39;;;;:::i;:::-;:43;;;;:::i;:::-;41953:63;;42027:16;42059:8;42047:9;:20;;;;:::i;:::-;42027:40;;42124:1;42113:8;:12;:31;;;;;42143:1;42129:11;:15;42113:31;42109:331;;;42161:53;42178:4;42193:6;42202:11;42161:8;:53::i;:::-;42229:6;:22;;;42259:8;42295:4;42319:11;42349:1;42352::::0;42372:7:::1;:5;:7::i;:::-;42398:15;42229:199;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;42109:331;42497:1;42486:8;:12;42482:61;;;42508:15;42500:33;;:43;42534:8;42500:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;42482:61;41403:1148;;;;;;;36713:5:::0;36704:6;;:14;;;;;;;;;;;;;;;;;;41351:1200;:::o;12946:806::-;13059:1;13043:18;;:4;:18;;;13035:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13136:1;13122:16;;:2;:16;;;13114:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;13191:38;13212:4;13218:2;13222:6;13191:20;:38::i;:::-;13242:19;13264:9;:15;13274:4;13264:15;;;;;;;;;;;;;;;;13242:37;;13313:6;13298:11;:21;;13290:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;13430:6;13416:11;:20;13398:9;:15;13408:4;13398:15;;;;;;;;;;;;;;;:38;;;;13633:6;13616:9;:13;13626:2;13616:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;13683:2;13668:26;;13677:4;13668:26;;;13687:6;13668:26;;;;;;:::i;:::-;;;;;;;;13707:37;13727:4;13733:2;13737:6;13707:19;:37::i;:::-;13024:728;12946:806;;;:::o;24364:213::-;23421:1;24547:7;:22;;;;24364:213::o;39621:147::-;39660:20;39707:1;39693:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39687:22;;39731:4;39714:3;39718:1;39714:6;;;;;;;;:::i;:::-;;;;;;;:22;;;;;;;;;;;39750:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39741:3;39745:1;39741:6;;;;;;;;:::i;:::-;;;;;;;:22;;;;;;;;;;;39621:147;:::o;17689:91::-;;;;:::o;39916:872::-;40039:12;40057:10;:8;:10::i;:::-;40039:28;;40078:15;40105:4;40096:6;:13;;;;:::i;:::-;40078:31;;40142:1;40126:18;;:4;:18;;;40122:135;;40217:7;40191:18;:22;40210:2;40191:22;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;40239:7;;;;40122:135;40285:1;40271:16;;:2;:16;;;40267:187;;40364:7;40336:18;:24;40355:4;40336:24;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;40414:7;40386:16;;:35;;;;;;;:::i;:::-;;;;;;;;40436:7;;;;40267:187;40524:7;40496:18;:24;40515:4;40496:24;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;40570:7;40542:18;:22;40561:2;40542:22;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;40620:12;40675:4;36448:6;40645:13;;40636:6;:22;;;;:::i;:::-;:35;;;;:::i;:::-;40635:44;;;;:::i;:::-;40620:59;;40710:4;40690:16;;:24;;;;;;;:::i;:::-;;;;;;;;36448:6;40754:13;;40745:6;:22;;;;:::i;:::-;:35;;;;:::i;:::-;40725:15;;:55;;;;;;;:::i;:::-;;;;;;;;40028:760;;;39916:872;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:329::-;3505:6;3554:2;3542:9;3533:7;3529:23;3525:32;3522:119;;;3560:79;;:::i;:::-;3522:119;3680:1;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3651:117;3446:329;;;;:::o;3781:118::-;3868:24;3886:5;3868:24;:::i;:::-;3863:3;3856:37;3781:118;;:::o;3905:222::-;3998:4;4036:2;4025:9;4021:18;4013:26;;4049:71;4117:1;4106:9;4102:17;4093:6;4049:71;:::i;:::-;3905:222;;;;:::o;4133:619::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:119;;;4281:79;;:::i;:::-;4243:119;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4656:2;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4627:118;4133:619;;;;;:::o;4758:86::-;4793:7;4833:4;4826:5;4822:16;4811:27;;4758:86;;;:::o;4850:112::-;4933:22;4949:5;4933:22;:::i;:::-;4928:3;4921:35;4850:112;;:::o;4968:214::-;5057:4;5095:2;5084:9;5080:18;5072:26;;5108:67;5172:1;5161:9;5157:17;5148:6;5108:67;:::i;:::-;4968:214;;;;:::o;5188:329::-;5247:6;5296:2;5284:9;5275:7;5271:23;5267:32;5264:119;;;5302:79;;:::i;:::-;5264:119;5422:1;5447:53;5492:7;5483:6;5472:9;5468:22;5447:53;:::i;:::-;5437:63;;5393:117;5188:329;;;;:::o;5523:118::-;5610:24;5628:5;5610:24;:::i;:::-;5605:3;5598:37;5523:118;;:::o;5647:222::-;5740:4;5778:2;5767:9;5763:18;5755:26;;5791:71;5859:1;5848:9;5844:17;5835:6;5791:71;:::i;:::-;5647:222;;;;:::o;5875:619::-;5952:6;5960;5968;6017:2;6005:9;5996:7;5992:23;5988:32;5985:119;;;6023:79;;:::i;:::-;5985:119;6143:1;6168:53;6213:7;6204:6;6193:9;6189:22;6168:53;:::i;:::-;6158:63;;6114:117;6270:2;6296:53;6341:7;6332:6;6321:9;6317:22;6296:53;:::i;:::-;6286:63;;6241:118;6398:2;6424:53;6469:7;6460:6;6449:9;6445:22;6424:53;:::i;:::-;6414:63;;6369:118;5875:619;;;;;:::o;6500:474::-;6568:6;6576;6625:2;6613:9;6604:7;6600:23;6596:32;6593:119;;;6631:79;;:::i;:::-;6593:119;6751:1;6776:53;6821:7;6812:6;6801:9;6797:22;6776:53;:::i;:::-;6766:63;;6722:117;6878:2;6904:53;6949:7;6940:6;6929:9;6925:22;6904:53;:::i;:::-;6894:63;;6849:118;6500:474;;;;;:::o;6980:60::-;7008:3;7029:5;7022:12;;6980:60;;;:::o;7046:142::-;7096:9;7129:53;7147:34;7156:24;7174:5;7156:24;:::i;:::-;7147:34;:::i;:::-;7129:53;:::i;:::-;7116:66;;7046:142;;;:::o;7194:126::-;7244:9;7277:37;7308:5;7277:37;:::i;:::-;7264:50;;7194:126;;;:::o;7326:153::-;7403:9;7436:37;7467:5;7436:37;:::i;:::-;7423:50;;7326:153;;;:::o;7485:185::-;7599:64;7657:5;7599:64;:::i;:::-;7594:3;7587:77;7485:185;;:::o;7676:276::-;7796:4;7834:2;7823:9;7819:18;7811:26;;7847:98;7942:1;7931:9;7927:17;7918:6;7847:98;:::i;:::-;7676:276;;;;:::o;7958:180::-;8006:77;8003:1;7996:88;8103:4;8100:1;8093:15;8127:4;8124:1;8117:15;8144:320;8188:6;8225:1;8219:4;8215:12;8205:22;;8272:1;8266:4;8262:12;8293:18;8283:81;;8349:4;8341:6;8337:17;8327:27;;8283:81;8411:2;8403:6;8400:14;8380:18;8377:38;8374:84;;8430:18;;:::i;:::-;8374:84;8195:269;8144:320;;;:::o;8470:180::-;8518:77;8515:1;8508:88;8615:4;8612:1;8605:15;8639:4;8636:1;8629:15;8656:410;8696:7;8719:20;8737:1;8719:20;:::i;:::-;8714:25;;8753:20;8771:1;8753:20;:::i;:::-;8748:25;;8808:1;8805;8801:9;8830:30;8848:11;8830:30;:::i;:::-;8819:41;;9009:1;9000:7;8996:15;8993:1;8990:22;8970:1;8963:9;8943:83;8920:139;;9039:18;;:::i;:::-;8920:139;8704:362;8656:410;;;;:::o;9072:180::-;9120:77;9117:1;9110:88;9217:4;9214:1;9207:15;9241:4;9238:1;9231:15;9258:185;9298:1;9315:20;9333:1;9315:20;:::i;:::-;9310:25;;9349:20;9367:1;9349:20;:::i;:::-;9344:25;;9388:1;9378:35;;9393:18;;:::i;:::-;9378:35;9435:1;9432;9428:9;9423:14;;9258:185;;;;:::o;9449:191::-;9489:3;9508:20;9526:1;9508:20;:::i;:::-;9503:25;;9542:20;9560:1;9542:20;:::i;:::-;9537:25;;9585:1;9582;9578:9;9571:16;;9606:3;9603:1;9600:10;9597:36;;;9613:18;;:::i;:::-;9597:36;9449:191;;;;:::o;9646:224::-;9786:34;9782:1;9774:6;9770:14;9763:58;9855:7;9850:2;9842:6;9838:15;9831:32;9646:224;:::o;9876:366::-;10018:3;10039:67;10103:2;10098:3;10039:67;:::i;:::-;10032:74;;10115:93;10204:3;10115:93;:::i;:::-;10233:2;10228:3;10224:12;10217:19;;9876:366;;;:::o;10248:419::-;10414:4;10452:2;10441:9;10437:18;10429:26;;10501:9;10495:4;10491:20;10487:1;10476:9;10472:17;10465:47;10529:131;10655:4;10529:131;:::i;:::-;10521:139;;10248:419;;;:::o;10673:159::-;10813:11;10809:1;10801:6;10797:14;10790:35;10673:159;:::o;10838:365::-;10980:3;11001:66;11065:1;11060:3;11001:66;:::i;:::-;10994:73;;11076:93;11165:3;11076:93;:::i;:::-;11194:2;11189:3;11185:12;11178:19;;10838:365;;;:::o;11209:419::-;11375:4;11413:2;11402:9;11398:18;11390:26;;11462:9;11456:4;11452:20;11448:1;11437:9;11433:17;11426:47;11490:131;11616:4;11490:131;:::i;:::-;11482:139;;11209:419;;;:::o;11634:442::-;11783:4;11821:2;11810:9;11806:18;11798:26;;11834:71;11902:1;11891:9;11887:17;11878:6;11834:71;:::i;:::-;11915:72;11983:2;11972:9;11968:18;11959:6;11915:72;:::i;:::-;11997;12065:2;12054:9;12050:18;12041:6;11997:72;:::i;:::-;11634:442;;;;;;:::o;12082:225::-;12222:34;12218:1;12210:6;12206:14;12199:58;12291:8;12286:2;12278:6;12274:15;12267:33;12082:225;:::o;12313:366::-;12455:3;12476:67;12540:2;12535:3;12476:67;:::i;:::-;12469:74;;12552:93;12641:3;12552:93;:::i;:::-;12670:2;12665:3;12661:12;12654:19;;12313:366;;;:::o;12685:419::-;12851:4;12889:2;12878:9;12874:18;12866:26;;12938:9;12932:4;12928:20;12924:1;12913:9;12909:17;12902:47;12966:131;13092:4;12966:131;:::i;:::-;12958:139;;12685:419;;;:::o;13110:223::-;13250:34;13246:1;13238:6;13234:14;13227:58;13319:6;13314:2;13306:6;13302:15;13295:31;13110:223;:::o;13339:366::-;13481:3;13502:67;13566:2;13561:3;13502:67;:::i;:::-;13495:74;;13578:93;13667:3;13578:93;:::i;:::-;13696:2;13691:3;13687:12;13680:19;;13339:366;;;:::o;13711:419::-;13877:4;13915:2;13904:9;13900:18;13892:26;;13964:9;13958:4;13954:20;13950:1;13939:9;13935:17;13928:47;13992:131;14118:4;13992:131;:::i;:::-;13984:139;;13711:419;;;:::o;14136:221::-;14276:34;14272:1;14264:6;14260:14;14253:58;14345:4;14340:2;14332:6;14328:15;14321:29;14136:221;:::o;14363:366::-;14505:3;14526:67;14590:2;14585:3;14526:67;:::i;:::-;14519:74;;14602:93;14691:3;14602:93;:::i;:::-;14720:2;14715:3;14711:12;14704:19;;14363:366;;;:::o;14735:419::-;14901:4;14939:2;14928:9;14924:18;14916:26;;14988:9;14982:4;14978:20;14974:1;14963:9;14959:17;14952:47;15016:131;15142:4;15016:131;:::i;:::-;15008:139;;14735:419;;;:::o;15160:179::-;15300:31;15296:1;15288:6;15284:14;15277:55;15160:179;:::o;15345:366::-;15487:3;15508:67;15572:2;15567:3;15508:67;:::i;:::-;15501:74;;15584:93;15673:3;15584:93;:::i;:::-;15702:2;15697:3;15693:12;15686:19;;15345:366;;;:::o;15717:419::-;15883:4;15921:2;15910:9;15906:18;15898:26;;15970:9;15964:4;15960:20;15956:1;15945:9;15941:17;15934:47;15998:131;16124:4;15998:131;:::i;:::-;15990:139;;15717:419;;;:::o;16142:166::-;16282:18;16278:1;16270:6;16266:14;16259:42;16142:166;:::o;16314:366::-;16456:3;16477:67;16541:2;16536:3;16477:67;:::i;:::-;16470:74;;16553:93;16642:3;16553:93;:::i;:::-;16671:2;16666:3;16662:12;16655:19;;16314:366;;;:::o;16686:419::-;16852:4;16890:2;16879:9;16875:18;16867:26;;16939:9;16933:4;16929:20;16925:1;16914:9;16910:17;16903:47;16967:131;17093:4;16967:131;:::i;:::-;16959:139;;16686:419;;;:::o;17111:160::-;17251:12;17247:1;17239:6;17235:14;17228:36;17111:160;:::o;17277:366::-;17419:3;17440:67;17504:2;17499:3;17440:67;:::i;:::-;17433:74;;17516:93;17605:3;17516:93;:::i;:::-;17634:2;17629:3;17625:12;17618:19;;17277:366;;;:::o;17649:419::-;17815:4;17853:2;17842:9;17838:18;17830:26;;17902:9;17896:4;17892:20;17888:1;17877:9;17873:17;17866:47;17930:131;18056:4;17930:131;:::i;:::-;17922:139;;17649:419;;;:::o;18074:164::-;18214:16;18210:1;18202:6;18198:14;18191:40;18074:164;:::o;18244:366::-;18386:3;18407:67;18471:2;18466:3;18407:67;:::i;:::-;18400:74;;18483:93;18572:3;18483:93;:::i;:::-;18601:2;18596:3;18592:12;18585:19;;18244:366;;;:::o;18616:419::-;18782:4;18820:2;18809:9;18805:18;18797:26;;18869:9;18863:4;18859:20;18855:1;18844:9;18840:17;18833:47;18897:131;19023:4;18897:131;:::i;:::-;18889:139;;18616:419;;;:::o;19041:194::-;19081:4;19101:20;19119:1;19101:20;:::i;:::-;19096:25;;19135:20;19153:1;19135:20;:::i;:::-;19130:25;;19179:1;19176;19172:9;19164:17;;19203:1;19197:4;19194:11;19191:37;;;19208:18;;:::i;:::-;19191:37;19041:194;;;;:::o;19241:182::-;19381:34;19377:1;19369:6;19365:14;19358:58;19241:182;:::o;19429:366::-;19571:3;19592:67;19656:2;19651:3;19592:67;:::i;:::-;19585:74;;19668:93;19757:3;19668:93;:::i;:::-;19786:2;19781:3;19777:12;19770:19;;19429:366;;;:::o;19801:419::-;19967:4;20005:2;19994:9;19990:18;19982:26;;20054:9;20048:4;20044:20;20040:1;20029:9;20025:17;20018:47;20082:131;20208:4;20082:131;:::i;:::-;20074:139;;19801:419;;;:::o;20226:181::-;20366:33;20362:1;20354:6;20350:14;20343:57;20226:181;:::o;20413:366::-;20555:3;20576:67;20640:2;20635:3;20576:67;:::i;:::-;20569:74;;20652:93;20741:3;20652:93;:::i;:::-;20770:2;20765:3;20761:12;20754:19;;20413:366;;;:::o;20785:419::-;20951:4;20989:2;20978:9;20974:18;20966:26;;21038:9;21032:4;21028:20;21024:1;21013:9;21009:17;21002:47;21066:131;21192:4;21066:131;:::i;:::-;21058:139;;20785:419;;;:::o;21210:85::-;21255:7;21284:5;21273:16;;21210:85;;;:::o;21301:158::-;21359:9;21392:61;21410:42;21419:32;21445:5;21419:32;:::i;:::-;21410:42;:::i;:::-;21392:61;:::i;:::-;21379:74;;21301:158;;;:::o;21465:147::-;21560:45;21599:5;21560:45;:::i;:::-;21555:3;21548:58;21465:147;;:::o;21618:114::-;21685:6;21719:5;21713:12;21703:22;;21618:114;;;:::o;21738:184::-;21837:11;21871:6;21866:3;21859:19;21911:4;21906:3;21902:14;21887:29;;21738:184;;;;:::o;21928:132::-;21995:4;22018:3;22010:11;;22048:4;22043:3;22039:14;22031:22;;21928:132;;;:::o;22066:108::-;22143:24;22161:5;22143:24;:::i;:::-;22138:3;22131:37;22066:108;;:::o;22180:179::-;22249:10;22270:46;22312:3;22304:6;22270:46;:::i;:::-;22348:4;22343:3;22339:14;22325:28;;22180:179;;;;:::o;22365:113::-;22435:4;22467;22462:3;22458:14;22450:22;;22365:113;;;:::o;22514:732::-;22633:3;22662:54;22710:5;22662:54;:::i;:::-;22732:86;22811:6;22806:3;22732:86;:::i;:::-;22725:93;;22842:56;22892:5;22842:56;:::i;:::-;22921:7;22952:1;22937:284;22962:6;22959:1;22956:13;22937:284;;;23038:6;23032:13;23065:63;23124:3;23109:13;23065:63;:::i;:::-;23058:70;;23151:60;23204:6;23151:60;:::i;:::-;23141:70;;22997:224;22984:1;22981;22977:9;22972:14;;22937:284;;;22941:14;23237:3;23230:10;;22638:608;;;22514:732;;;;:::o;23252:831::-;23515:4;23553:3;23542:9;23538:19;23530:27;;23567:71;23635:1;23624:9;23620:17;23611:6;23567:71;:::i;:::-;23648:80;23724:2;23713:9;23709:18;23700:6;23648:80;:::i;:::-;23775:9;23769:4;23765:20;23760:2;23749:9;23745:18;23738:48;23803:108;23906:4;23897:6;23803:108;:::i;:::-;23795:116;;23921:72;23989:2;23978:9;23974:18;23965:6;23921:72;:::i;:::-;24003:73;24071:3;24060:9;24056:19;24047:6;24003:73;:::i;:::-;23252:831;;;;;;;;:::o;24089:807::-;24338:4;24376:3;24365:9;24361:19;24353:27;;24390:71;24458:1;24447:9;24443:17;24434:6;24390:71;:::i;:::-;24471:72;24539:2;24528:9;24524:18;24515:6;24471:72;:::i;:::-;24553:80;24629:2;24618:9;24614:18;24605:6;24553:80;:::i;:::-;24643;24719:2;24708:9;24704:18;24695:6;24643:80;:::i;:::-;24733:73;24801:3;24790:9;24786:19;24777:6;24733:73;:::i;:::-;24816;24884:3;24873:9;24869:19;24860:6;24816:73;:::i;:::-;24089:807;;;;;;;;;:::o;24902:143::-;24959:5;24990:6;24984:13;24975:22;;25006:33;25033:5;25006:33;:::i;:::-;24902:143;;;;:::o;25051:663::-;25139:6;25147;25155;25204:2;25192:9;25183:7;25179:23;25175:32;25172:119;;;25210:79;;:::i;:::-;25172:119;25330:1;25355:64;25411:7;25402:6;25391:9;25387:22;25355:64;:::i;:::-;25345:74;;25301:128;25468:2;25494:64;25550:7;25541:6;25530:9;25526:22;25494:64;:::i;:::-;25484:74;;25439:129;25607:2;25633:64;25689:7;25680:6;25669:9;25665:22;25633:64;:::i;:::-;25623:74;;25578:129;25051:663;;;;;:::o;25720:224::-;25860:34;25856:1;25848:6;25844:14;25837:58;25929:7;25924:2;25916:6;25912:15;25905:32;25720:224;:::o;25950:366::-;26092:3;26113:67;26177:2;26172:3;26113:67;:::i;:::-;26106:74;;26189:93;26278:3;26189:93;:::i;:::-;26307:2;26302:3;26298:12;26291:19;;25950:366;;;:::o;26322:419::-;26488:4;26526:2;26515:9;26511:18;26503:26;;26575:9;26569:4;26565:20;26561:1;26550:9;26546:17;26539:47;26603:131;26729:4;26603:131;:::i;:::-;26595:139;;26322:419;;;:::o;26747:222::-;26887:34;26883:1;26875:6;26871:14;26864:58;26956:5;26951:2;26943:6;26939:15;26932:30;26747:222;:::o;26975:366::-;27117:3;27138:67;27202:2;27197:3;27138:67;:::i;:::-;27131:74;;27214:93;27303:3;27214:93;:::i;:::-;27332:2;27327:3;27323:12;27316:19;;26975:366;;;:::o;27347:419::-;27513:4;27551:2;27540:9;27536:18;27528:26;;27600:9;27594:4;27590:20;27586:1;27575:9;27571:17;27564:47;27628:131;27754:4;27628:131;:::i;:::-;27620:139;;27347:419;;;:::o;27772:225::-;27912:34;27908:1;27900:6;27896:14;27889:58;27981:8;27976:2;27968:6;27964:15;27957:33;27772:225;:::o;28003:366::-;28145:3;28166:67;28230:2;28225:3;28166:67;:::i;:::-;28159:74;;28242:93;28331:3;28242:93;:::i;:::-;28360:2;28355:3;28351:12;28344:19;;28003:366;;;:::o;28375:419::-;28541:4;28579:2;28568:9;28564:18;28556:26;;28628:9;28622:4;28618:20;28614:1;28603:9;28599:17;28592:47;28656:131;28782:4;28656:131;:::i;:::-;28648:139;;28375:419;;;:::o;28800:180::-;28848:77;28845:1;28838:88;28945:4;28942:1;28935:15;28969:4;28966:1;28959:15;28986:180;29034:77;29031:1;29024:88;29131:4;29128:1;29121:15;29155:4;29152:1;29145:15;29172:143;29229:5;29260:6;29254:13;29245:22;;29276:33;29303:5;29276:33;:::i;:::-;29172:143;;;;:::o;29321:351::-;29391:6;29440:2;29428:9;29419:7;29415:23;29411:32;29408:119;;;29446:79;;:::i;:::-;29408:119;29566:1;29591:64;29647:7;29638:6;29627:9;29623:22;29591:64;:::i;:::-;29581:74;;29537:128;29321:351;;;;:::o

Swarm Source

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