Token

 

Overview ERC-1155

Total Supply:
0 N/A

Holders:
11 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MWSWORDS1155

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-20
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;




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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


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

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );

        _burnBatch(account, ids, values);
    }
}

// File: contracts/1_Storage.sol


pragma solidity ^0.8.4;









contract MWSWORDS1155 is ERC1155, Ownable, Pausable, ERC1155Burnable, ERC1155Supply, ReentrancyGuard {
            uint256 public cost = 50 ether;
            uint256 public swordv1 = 10001;
            uint256 public swordv1value = 50 ether;
            uint256 public swordv2 = 10002;
            uint256 public swordv2value = 100 ether;
            uint256 public swordv3 = 10003;
            uint256 public swordv3value = 150 ether;  
            uint256 public swordv4 = 10004;
            uint256 public swordv4value = 200 ether;       
            uint256 public swordv5 = 10005;
            uint256 public swordv5value = 250 ether;
            uint256 public swordv6 = 10006;
            uint256 public swordv6value = 300 ether;  
            uint256 public swordv7 = 10007;
            uint256 public swordv7value = 350 ether; 
            uint256 public swordv8 = 10008;
            uint256 public swordv8value = 400 ether;
            uint256 public swordv9 = 10009;
            uint256 public swordv9value = 400 ether;
            uint256 public swordv10 = 100011;
            uint256 public swordv10value = 450 ether;                                                 
            IERC20 public token;

    // Mapping for setting our string as URI
    mapping (uint256 => string) private _tokenUri;


    constructor(address _token) ERC1155("MWSWORDS, MWSRD") {token = IERC20(_token);}

        // Function to mint our NFTs
        function mint(address account, uint256 id, uint256 amount, bytes memory data) public nonReentrant()
         {
            address sender = _msgSender();
            uint256 _totalCost = cost;
            if (id == swordv1) {  _totalCost = swordv1value;  } 
            if (id == swordv2) {  _totalCost = swordv2value;  } 
            if (id == swordv3) {  _totalCost = swordv3value;  } 
            if (id == swordv4) {  _totalCost = swordv4value;  }     
            if (id == swordv5) {  _totalCost = swordv5value;  } 
            if (id == swordv6) {  _totalCost = swordv6value;  }
            if (id == swordv7) {  _totalCost = swordv7value;  }
            if (id == swordv8) {  _totalCost = swordv8value;  }   
            if (id == swordv9) {  _totalCost = swordv9value;  }
            if (id == swordv10) {  _totalCost = swordv10value;  }                    
            if (sender != owner()) {
            require(token.balanceOf(sender) >= _totalCost, "BAL TOO LOW");
            token.transferFrom(_msgSender(), address(this), _totalCost);
            _mint(account, id, amount, data);
         }

         }
        function uri (uint256 tokenId) override public view returns (string memory) {
            return (_tokenUri[tokenId]);
        }

        // We can use this function to manually set the URIs for NFTs
        function setTokenUri(uint256 tokenId, string memory uri) public onlyOwner {
            _tokenUri[tokenId] = uri;
        }

        function setSwordv1value(uint256 _newSwordv1value) public onlyOwner {
        swordv1value = _newSwordv1value;
        }

        function setSwordv2value(uint256 _newSwordv2value) public onlyOwner {
        swordv2value = _newSwordv2value;
        }

        function setSwordv3value(uint256 _newSwordv3value) public onlyOwner {
        swordv3value = _newSwordv3value;
        }

        function setSwordv4value(uint256 _newSwordv4value) public onlyOwner {
        swordv4value = _newSwordv4value;
        }        
        
        function setSwordv5value(uint256 _newSwordv5value) public onlyOwner {
        swordv5value = _newSwordv5value;
        }

        function setSwordv6value(uint256 _newSwordv6value) public onlyOwner {
        swordv6value = _newSwordv6value;
        }
                
        function setSwordv7value(uint256 _newSwordv7value) public onlyOwner {
        swordv7value = _newSwordv7value;
        }

        function setSwordv8value(uint256 _newSwordv8value) public onlyOwner {
        swordv8value = _newSwordv8value;
        }

        function setSwordv9value(uint256 _newSwordv9value) public onlyOwner {
        swordv9value = _newSwordv9value;
        }

        function setSwordv10value(uint256 _newSwordv10value) public onlyOwner {
        swordv10value = _newSwordv10value;
        }
        
        function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
        }

        function pause() public onlyOwner {
        _pause();
        }

        function withdrawTokens(
            IERC20 _token,
            uint256 _amount,
            address _to
        ) external onlyOwner {
            _token.transfer(_to, _amount);
        }

        function unpause() public onlyOwner {
        _unpause();
        }

        function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        internal
        whenNotPaused
        override(ERC1155, ERC1155Supply)
        {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
        }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSwordv10value","type":"uint256"}],"name":"setSwordv10value","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSwordv1value","type":"uint256"}],"name":"setSwordv1value","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSwordv2value","type":"uint256"}],"name":"setSwordv2value","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSwordv3value","type":"uint256"}],"name":"setSwordv3value","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSwordv4value","type":"uint256"}],"name":"setSwordv4value","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSwordv5value","type":"uint256"}],"name":"setSwordv5value","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSwordv6value","type":"uint256"}],"name":"setSwordv6value","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSwordv7value","type":"uint256"}],"name":"setSwordv7value","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSwordv8value","type":"uint256"}],"name":"setSwordv8value","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSwordv9value","type":"uint256"}],"name":"setSwordv9value","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv10value","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv1value","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv2value","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv3value","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv4value","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv5value","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv6","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv6value","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv7","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv7value","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv8","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv8value","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv9","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swordv9value","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526802b5e3af16b18800006006556127116007556802b5e3af16b188000060085561271260095568056bc75e2d63100000600a55612713600b55680821ab0d4414980000600c55612714600d55680ad78ebc5ac6200000600e55612715600f55680d8d726b7177a80000601055612716601155681043561a88293000006012556127176013556812f939c99edab800006014556127186015556815af1d78b58c4000006016556127196017556815af1d78b58c400000601855620186ab6019556818650127cc3dc80000601a55348015620000dd57600080fd5b5060405162002c2538038062002c258339810160408190526200010091620001d9565b60408051808201909152600f81526e1355d4d5d3d49114cb081355d4d491608a1b6020820152620001318162000175565b506200013d3362000187565b6003805460ff60a01b191690556001600555601b80546001600160a01b0319166001600160a01b03929092169190911790556200037c565b6002620001838282620002b0565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208284031215620001ec57600080fd5b81516001600160a01b03811681146200020457600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200023657607f821691505b6020821081036200025757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002ab57600081815260208120601f850160051c81016020861015620002865750805b601f850160051c820191505b81811015620002a75782815560010162000292565b5050505b505050565b81516001600160401b03811115620002cc57620002cc6200020b565b620002e481620002dd845462000221565b846200025d565b602080601f8311600181146200031c5760008415620003035750858301515b600019600386901b1c1916600185901b178555620002a7565b600085815260208120601f198616915b828110156200034d578886015182559484019460019091019084016200032c565b50858210156200036c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612899806200038c6000396000f3fe608060405234801561001057600080fd5b50600436106103415760003560e01c806392514db8116101b8578063d4af8d7c11610104578063f242432a116100a2578063f5298aca1161007c578063f5298aca146106b2578063f6ece17b146106c5578063f7b2674f146106ce578063fc0c546a146106d757600080fd5b8063f242432a14610683578063f2fde38b14610696578063f41838ca146106a957600080fd5b8063e84e08a6116100de578063e84e08a614610622578063e9795bed1461062b578063e985e9c514610634578063eeb142dc1461067057600080fd5b8063d4af8d7c146105fd578063dc2756f714610610578063e73110821461061957600080fd5b8063a22cb46511610171578063bbffdb1d1161014b578063bbffdb1d146105b8578063bd85b039146105c1578063cec4c3b7146105e1578063cfc294fd146105ea57600080fd5b8063a22cb46514610589578063ab8a14ba1461059c578063b439a53e146105af57600080fd5b806392514db81461052157806393de738d146105345780639a43d81f1461053d5780639bc5c509146105505780639e2a4a1f14610563578063a0a62dfb1461057657600080fd5b80634f558e791161029257806371133e9d1161023057806380049c251161020a57806380049c25146104e25780638456cb59146104eb5780638ced8f49146104f35780638da5cb5b146104fc57600080fd5b806371133e9d146104b4578063715018a6146104c7578063731133e9146104cf57600080fd5b806357f7789e1161026c57806357f7789e146104735780635c82a35b146104865780635c975abb1461048f5780636b20c454146104a157600080fd5b80634f558e791461043557806353025d8114610457578063542ccb011461046a57600080fd5b806328a64f2b116102ff5780633f4ba83a116102d95780633f4ba83a146103f157806341832410146103f957806344a0d68a146104025780634e1273f41461041557600080fd5b806328a64f2b146103ca5780632eb2c2d6146103d35780633428261c146103e857600080fd5b8062fdd58e1461034657806301ffc9a71461036c5780630e89341c1461038f57806313faede6146103af57806314b22a64146103b85780631f45419c146103c1575b600080fd5b610359610354366004611c7a565b6106ea565b6040519081526020015b60405180910390f35b61037f61037a366004611cbc565b610783565b6040519015158152602001610363565b6103a261039d366004611ce0565b6107d3565b6040516103639190611d3f565b61035960065481565b610359600d5481565b610359600e5481565b61035960095481565b6103e66103e1366004611ea8565b610875565b005b61035960085481565b6103e66108c1565b610359600f5481565b6103e6610410366004611ce0565b6108d3565b610428610423366004611f56565b6108e0565b604051610363919061205e565b61037f610443366004611ce0565b600090815260046020526040902054151590565b6103e6610465366004611ce0565b610a0a565b610359600b5481565b6103e6610481366004612071565b610a17565b61035960155481565b600354600160a01b900460ff1661037f565b6103e66104af3660046120c2565b610a3c565b6103e66104c2366004611ce0565b610a7f565b6103e6610a8c565b6103e66104dd366004612138565b610a9e565b61035960185481565b6103e6610c9f565b61035960105481565b6003546001600160a01b03165b6040516001600160a01b039091168152602001610363565b6103e661052f366004611ce0565b610caf565b61035960075481565b6103e661054b366004611ce0565b610cbc565b6103e661055e36600461219b565b610cc9565b6103e6610571366004611ce0565b610d44565b6103e6610584366004611ce0565b610d51565b6103e66105973660046121eb565b610d5e565b6103e66105aa366004611ce0565b610d6d565b610359600c5481565b610359600a5481565b6103596105cf366004611ce0565b60009081526004602052604090205490565b61035960145481565b6103e66105f8366004611ce0565b610d7a565b6103e661060b366004611ce0565b610d87565b61035960125481565b61035960165481565b610359601a5481565b61035960195481565b61037f610642366004612224565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6103e661067e366004611ce0565b610d94565b6103e6610691366004612252565b610da1565b6103e66106a43660046122bb565b610de6565b61035960175481565b6103e66106c03660046122d8565b610e5f565b61035960135481565b61035960115481565b601b54610509906001600160a01b031681565b60006001600160a01b03831661075a5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b14806107b457506001600160e01b031982166303a24d0760e21b145b8061077d57506301ffc9a760e01b6001600160e01b031983161461077d565b6000818152601c602052604090208054606091906107f09061230d565b80601f016020809104026020016040519081016040528092919081815260200182805461081c9061230d565b80156108695780601f1061083e57610100808354040283529160200191610869565b820191906000526020600020905b81548152906001019060200180831161084c57829003601f168201915b50505050509050919050565b6001600160a01b03851633148061089157506108918533610642565b6108ad5760405162461bcd60e51b815260040161075190612347565b6108ba8585858585610ea2565b5050505050565b6108c961104c565b6108d16110a6565b565b6108db61104c565b600655565b606081518351146109455760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610751565b6000835167ffffffffffffffff81111561096157610961611d52565b60405190808252806020026020018201604052801561098a578160200160208202803683370190505b50905060005b8451811015610a02576109d58582815181106109ae576109ae612395565b60200260200101518583815181106109c8576109c8612395565b60200260200101516106ea565b8282815181106109e7576109e7612395565b60209081029190910101526109fb816123c1565b9050610990565b509392505050565b610a1261104c565b601055565b610a1f61104c565b6000828152601c60205260409020610a378282612420565b505050565b6001600160a01b038316331480610a585750610a588333610642565b610a745760405162461bcd60e51b815260040161075190612347565b610a378383836110fb565b610a8761104c565b601455565b610a9461104c565b6108d16000611297565b610aa66112e9565b6006546007543391908503610aba57506008545b6009548503610ac85750600a545b600b548503610ad65750600c545b600d548503610ae45750600e545b600f548503610af257506010545b6011548503610b0057506012545b6013548503610b0e57506014545b6015548503610b1c57506016545b6017548503610b2a57506018545b6019548503610b385750601a545b6003546001600160a01b03838116911614610c8d57601b546040516370a0823160e01b81526001600160a01b038481166004830152839216906370a0823190602401602060405180830381865afa158015610b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbb91906124e0565b1015610bf75760405162461bcd60e51b815260206004820152600b60248201526a42414c20544f4f204c4f5760a81b6044820152606401610751565b601b546001600160a01b03166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018490526064016020604051808303816000875af1158015610c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8091906124f9565b50610c8d86868686611342565b5050610c996001600555565b50505050565b610ca761104c565b6108d1611465565b610cb761104c565b600e55565b610cc461104c565b600c55565b610cd161104c565b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284169063a9059cbb906044016020604051808303816000875af1158015610d20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9991906124f9565b610d4c61104c565b600855565b610d5961104c565b601855565b610d693383836114a8565b5050565b610d7561104c565b600a55565b610d8261104c565b601a55565b610d8f61104c565b601255565b610d9c61104c565b601655565b6001600160a01b038516331480610dbd5750610dbd8533610642565b610dd95760405162461bcd60e51b815260040161075190612347565b6108ba8585858585611588565b610dee61104c565b6001600160a01b038116610e535760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610751565b610e5c81611297565b50565b6001600160a01b038316331480610e7b5750610e7b8333610642565b610e975760405162461bcd60e51b815260040161075190612347565b610a378383836116c0565b8151835114610ec35760405162461bcd60e51b815260040161075190612516565b6001600160a01b038416610ee95760405162461bcd60e51b81526004016107519061255e565b33610ef88187878787876117d8565b60005b8451811015610fde576000858281518110610f1857610f18612395565b602002602001015190506000858381518110610f3657610f36612395565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610f865760405162461bcd60e51b8152600401610751906125a3565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610fc39084906125ed565b9250508190555050505080610fd7906123c1565b9050610efb565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161102e929190612600565b60405180910390a46110448187878787876117ee565b505050505050565b6003546001600160a01b031633146108d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610751565b6110ae611949565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166111215760405162461bcd60e51b81526004016107519061262e565b80518251146111425760405162461bcd60e51b815260040161075190612516565b6000339050611165818560008686604051806020016040528060008152506117d8565b60005b835181101561122a57600084828151811061118557611185612395565b6020026020010151905060008483815181106111a3576111a3612395565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156111f35760405162461bcd60e51b815260040161075190612671565b6000928352602083815260408085206001600160a01b038b1686529091529092209103905580611222816123c1565b915050611168565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161127b929190612600565b60405180910390a4604080516020810190915260009052610c99565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60026005540361133b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610751565b6002600555565b6001600160a01b0384166113a25760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610751565b3360006113ae85611999565b905060006113bb85611999565b90506113cc836000898585896117d8565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906113fc9084906125ed565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461145c836000898989896119e4565b50505050505050565b61146d611a9f565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586110de3390565b816001600160a01b0316836001600160a01b03160361151b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610751565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166115ae5760405162461bcd60e51b81526004016107519061255e565b3360006115ba85611999565b905060006115c785611999565b90506115d78389898585896117d8565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156116185760405162461bcd60e51b8152600401610751906125a3565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906116559084906125ed565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46116b5848a8a8a8a8a6119e4565b505050505050505050565b6001600160a01b0383166116e65760405162461bcd60e51b81526004016107519061262e565b3360006116f284611999565b905060006116ff84611999565b905061171f838760008585604051806020016040528060008152506117d8565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156117605760405162461bcd60e51b815260040161075190612671565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091526000905261145c565b6117e0611a9f565b611044868686868686611aec565b6001600160a01b0384163b156110445760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061183290899089908890889088906004016126b5565b6020604051808303816000875af192505050801561186d575060408051601f3d908101601f1916820190925261186a91810190612713565b60015b61191957611879612730565b806308c379a0036118b2575061188d61274c565b8061189857506118b4565b8060405162461bcd60e51b81526004016107519190611d3f565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610751565b6001600160e01b0319811663bc197c8160e01b1461145c5760405162461bcd60e51b8152600401610751906127d6565b600354600160a01b900460ff166108d15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610751565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106119d3576119d3612395565b602090810291909101015292915050565b6001600160a01b0384163b156110445760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611a28908990899088908890889060040161281e565b6020604051808303816000875af1925050508015611a63575060408051601f3d908101601f19168201909252611a6091810190612713565b60015b611a6f57611879612730565b6001600160e01b0319811663f23a6e6160e01b1461145c5760405162461bcd60e51b8152600401610751906127d6565b600354600160a01b900460ff16156108d15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610751565b6001600160a01b038516611b735760005b8351811015611b7157828181518110611b1857611b18612395565b602002602001015160046000868481518110611b3657611b36612395565b602002602001015181526020019081526020016000206000828254611b5b91906125ed565b90915550611b6a9050816123c1565b9050611afd565b505b6001600160a01b0384166110445760005b835181101561145c576000848281518110611ba157611ba1612395565b602002602001015190506000848381518110611bbf57611bbf612395565b6020026020010151905060006004600084815260200190815260200160002054905081811015611c425760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610751565b60009283526004602052604090922091039055611c5e816123c1565b9050611b84565b6001600160a01b0381168114610e5c57600080fd5b60008060408385031215611c8d57600080fd5b8235611c9881611c65565b946020939093013593505050565b6001600160e01b031981168114610e5c57600080fd5b600060208284031215611cce57600080fd5b8135611cd981611ca6565b9392505050565b600060208284031215611cf257600080fd5b5035919050565b6000815180845260005b81811015611d1f57602081850181015186830182015201611d03565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611cd96020830184611cf9565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611d8e57611d8e611d52565b6040525050565b600067ffffffffffffffff821115611daf57611daf611d52565b5060051b60200190565b600082601f830112611dca57600080fd5b81356020611dd782611d95565b604051611de48282611d68565b83815260059390931b8501820192828101915086841115611e0457600080fd5b8286015b84811015611e1f5780358352918301918301611e08565b509695505050505050565b600067ffffffffffffffff831115611e4457611e44611d52565b604051611e5b601f8501601f191660200182611d68565b809150838152848484011115611e7057600080fd5b83836020830137600060208583010152509392505050565b600082601f830112611e9957600080fd5b611cd983833560208501611e2a565b600080600080600060a08688031215611ec057600080fd5b8535611ecb81611c65565b94506020860135611edb81611c65565b9350604086013567ffffffffffffffff80821115611ef857600080fd5b611f0489838a01611db9565b94506060880135915080821115611f1a57600080fd5b611f2689838a01611db9565b93506080880135915080821115611f3c57600080fd5b50611f4988828901611e88565b9150509295509295909350565b60008060408385031215611f6957600080fd5b823567ffffffffffffffff80821115611f8157600080fd5b818501915085601f830112611f9557600080fd5b81356020611fa282611d95565b604051611faf8282611d68565b83815260059390931b8501820192828101915089841115611fcf57600080fd5b948201945b83861015611ff6578535611fe781611c65565b82529482019490820190611fd4565b9650508601359250508082111561200c57600080fd5b5061201985828601611db9565b9150509250929050565b600081518084526020808501945080840160005b8381101561205357815187529582019590820190600101612037565b509495945050505050565b602081526000611cd96020830184612023565b6000806040838503121561208457600080fd5b82359150602083013567ffffffffffffffff8111156120a257600080fd5b8301601f810185136120b357600080fd5b61201985823560208401611e2a565b6000806000606084860312156120d757600080fd5b83356120e281611c65565b9250602084013567ffffffffffffffff808211156120ff57600080fd5b61210b87838801611db9565b9350604086013591508082111561212157600080fd5b5061212e86828701611db9565b9150509250925092565b6000806000806080858703121561214e57600080fd5b843561215981611c65565b93506020850135925060408501359150606085013567ffffffffffffffff81111561218357600080fd5b61218f87828801611e88565b91505092959194509250565b6000806000606084860312156121b057600080fd5b83356121bb81611c65565b92506020840135915060408401356121d281611c65565b809150509250925092565b8015158114610e5c57600080fd5b600080604083850312156121fe57600080fd5b823561220981611c65565b91506020830135612219816121dd565b809150509250929050565b6000806040838503121561223757600080fd5b823561224281611c65565b9150602083013561221981611c65565b600080600080600060a0868803121561226a57600080fd5b853561227581611c65565b9450602086013561228581611c65565b93506040860135925060608601359150608086013567ffffffffffffffff8111156122af57600080fd5b611f4988828901611e88565b6000602082840312156122cd57600080fd5b8135611cd981611c65565b6000806000606084860312156122ed57600080fd5b83356122f881611c65565b95602085013595506040909401359392505050565b600181811c9082168061232157607f821691505b60208210810361234157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016123d3576123d36123ab565b5060010190565b601f821115610a3757600081815260208120601f850160051c810160208610156124015750805b601f850160051c820191505b818110156110445782815560010161240d565b815167ffffffffffffffff81111561243a5761243a611d52565b61244e81612448845461230d565b846123da565b602080601f831160018114612483576000841561246b5750858301515b600019600386901b1c1916600185901b178555611044565b600085815260208120601f198616915b828110156124b257888601518255948401946001909101908401612493565b50858210156124d05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156124f257600080fd5b5051919050565b60006020828403121561250b57600080fd5b8151611cd9816121dd565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b8082018082111561077d5761077d6123ab565b6040815260006126136040830185612023565b82810360208401526126258185612023565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190526000906126e190830186612023565b82810360608401526126f38186612023565b905082810360808401526127078185611cf9565b98975050505050505050565b60006020828403121561272557600080fd5b8151611cd981611ca6565b600060033d11156127495760046000803e5060005160e01c5b90565b600060443d101561275a5790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561278a57505050505090565b82850191508151818111156127a25750505050505090565b843d87010160208285010111156127bc5750505050505090565b6127cb60208286010187611d68565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061285890830184611cf9565b97965050505050505056fea2646970667358221220bb4760c2f5f591240f1324fba3abf5b2cff6a0bf2190ed13f8e0dc8e5200799564736f6c6343000811003300000000000000000000000087a5c9b60a3aaf1064006fe64285018e50e0d020

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

00000000000000000000000087a5c9b60a3aaf1064006fe64285018e50e0d020

-----Decoded View---------------
Arg [0] : _token (address): 0x87a5c9b60a3aaf1064006fe64285018e50e0d020

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000087a5c9b60a3aaf1064006fe64285018e50e0d020


Deployed ByteCode Sourcemap

65883:5149:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47046:230;;;;;;:::i;:::-;;:::i;:::-;;;616:25:1;;;604:2;589:18;47046:230:0;;;;;;;;46069:310;;;;;;:::i;:::-;;:::i;:::-;;;1203:14:1;;1196:22;1178:41;;1166:2;1151:18;46069:310:0;1038:187:1;68507:130:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;65999:30::-;;;;;;66342;;;;;;66387:39;;;;;;66142:30;;;;;;48989:438;;;;;;:::i;:::-;;:::i;:::-;;66089:38;;;;;;70626:69;;;:::i;66448:30::-;;;;;;70241:90;;;;;;:::i;:::-;;:::i;47442:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63522:122::-;;;;;;:::i;:::-;63579:4;63400:16;;;:12;:16;;;;;;-1:-1:-1;;;63522:122:0;69409;;;;;;:::i;:::-;;:::i;66241:30::-;;;;;;68720:125;;;;;;:::i;:::-;;:::i;66748:30::-;;;;;;9126:86;9197:7;;-1:-1:-1;;;9197:7:0;;;;9126:86;;65437:358;;;;;;:::i;:::-;;:::i;69693:122::-;;;;;;:::i;:::-;;:::i;11991:103::-;;;:::i;67357:1140::-;;;;;;:::i;:::-;;:::i;66892:39::-;;;;;;70343:65;;;:::i;66493:39::-;;;;;;11343:87;11416:6;;-1:-1:-1;;;;;11416:6:0;11343:87;;;-1:-1:-1;;;;;9152:32:1;;;9134:51;;9122:2;9107:18;11343:87:0;8988:203:1;69259:122:0;;;;;;:::i;:::-;;:::i;66044:30::-;;;;;;69125:122;;;;;;:::i;:::-;;:::i;70420:194::-;;;;;;:::i;:::-;;:::i;68857:122::-;;;;;;:::i;:::-;;:::i;69961:::-;;;;;;:::i;:::-;;:::i;48039:155::-;;;;;;:::i;:::-;;:::i;68991:122::-;;;;;;:::i;:::-;;:::i;66286:39::-;;;;;;66187;;;;;;63311:113;;;;;;:::i;:::-;63373:7;63400:16;;;:12;:16;;;;;;;63311:113;66693:39;;;;;;70095:126;;;;;;:::i;:::-;;:::i;69543:122::-;;;;;;:::i;:::-;;:::i;66592:39::-;;;;;;66793;;;;;;66993:40;;;;;;66946:32;;;;;;48266:168;;;;;;:::i;:::-;-1:-1:-1;;;;;48389:27:0;;;48365:4;48389:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;48266:168;69827:122;;;;;;:::i;:::-;;:::i;48506:406::-;;;;;;:::i;:::-;;:::i;12249:201::-;;;;;;:::i;:::-;;:::i;66847:30::-;;;;;;65103:326;;;;;;:::i;:::-;;:::i;66648:30::-;;;;;;66547;;;;;;67097:19;;;;;-1:-1:-1;;;;;67097:19:0;;;47046:230;47132:7;-1:-1:-1;;;;;47160:21:0;;47152:76;;;;-1:-1:-1;;;47152:76:0;;12377:2:1;47152:76:0;;;12359:21:1;12416:2;12396:18;;;12389:30;12455:34;12435:18;;;12428:62;-1:-1:-1;;;12506:18:1;;;12499:40;12556:19;;47152:76:0;;;;;;;;;-1:-1:-1;47246:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;47246:22:0;;;;;;;;;;47046:230;;;;;:::o;46069:310::-;46171:4;-1:-1:-1;;;;;;46208:41:0;;-1:-1:-1;;;46208:41:0;;:110;;-1:-1:-1;;;;;;;46266:52:0;;-1:-1:-1;;;46266:52:0;46208:110;:163;;;-1:-1:-1;;;;;;;;;;37459:40:0;;;46335:36;37350:157;68507:130;68606:18;;;;:9;:18;;;;;68598:27;;68568:13;;68606:18;68598:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68507:130;;;:::o;48989:438::-;-1:-1:-1;;;;;49222:20:0;;7319:10;49222:20;;:60;;-1:-1:-1;49246:36:0;49263:4;7319:10;48266:168;:::i;49246:36::-;49200:156;;;;-1:-1:-1;;;49200:156:0;;;;;;;:::i;:::-;49367:52;49390:4;49396:2;49400:3;49405:7;49414:4;49367:22;:52::i;:::-;48989:438;;;;;:::o;70626:69::-;11229:13;:11;:13::i;:::-;70673:10:::1;:8;:10::i;:::-;70626:69::o:0;70241:90::-;11229:13;:11;:13::i;:::-;70304:4:::1;:15:::0;70241:90::o;47442:524::-;47598:16;47659:3;:10;47640:8;:15;:29;47632:83;;;;-1:-1:-1;;;47632:83:0;;13588:2:1;47632:83:0;;;13570:21:1;13627:2;13607:18;;;13600:30;13666:34;13646:18;;;13639:62;-1:-1:-1;;;13717:18:1;;;13710:39;13766:19;;47632:83:0;13386:405:1;47632:83:0;47728:30;47775:8;:15;47761:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47761:30:0;;47728:63;;47809:9;47804:122;47828:8;:15;47824:1;:19;47804:122;;;47884:30;47894:8;47903:1;47894:11;;;;;;;;:::i;:::-;;;;;;;47907:3;47911:1;47907:6;;;;;;;;:::i;:::-;;;;;;;47884:9;:30::i;:::-;47865:13;47879:1;47865:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;47845:3;;;:::i;:::-;;;47804:122;;;-1:-1:-1;47945:13:0;47442:524;-1:-1:-1;;;47442:524:0:o;69409:122::-;11229:13;:11;:13::i;:::-;69488:12:::1;:31:::0;69409:122::o;68720:125::-;11229:13;:11;:13::i;:::-;68809:18:::1;::::0;;;:9:::1;:18;::::0;;;;:24:::1;68830:3:::0;68809:18;:24:::1;:::i;:::-;;68720:125:::0;;:::o;65437:358::-;-1:-1:-1;;;;;65602:23:0;;7319:10;65602:23;;:66;;-1:-1:-1;65629:39:0;65646:7;7319:10;48266:168;:::i;65629:39::-;65580:162;;;;-1:-1:-1;;;65580:162:0;;;;;;;:::i;:::-;65755:32;65766:7;65775:3;65780:6;65755:10;:32::i;69693:122::-;11229:13;:11;:13::i;:::-;69772:12:::1;:31:::0;69693:122::o;11991:103::-;11229:13;:11;:13::i;:::-;12056:30:::1;12083:1;12056:18;:30::i;67357:1140::-:0;2345:21;:19;:21::i;:::-;67547:4:::1;::::0;67576:7:::1;::::0;7319:10;;67547:4;67570:13;;67566:51:::1;;-1:-1:-1::0;67601:12:0::1;::::0;67566:51:::1;67642:7;;67636:2;:13:::0;67632:51:::1;;-1:-1:-1::0;67667:12:0::1;::::0;67632:51:::1;67708:7;;67702:2;:13:::0;67698:51:::1;;-1:-1:-1::0;67733:12:0::1;::::0;67698:51:::1;67774:7;;67768:2;:13:::0;67764:51:::1;;-1:-1:-1::0;67799:12:0::1;::::0;67764:51:::1;67844:7;;67838:2;:13:::0;67834:51:::1;;-1:-1:-1::0;67869:12:0::1;::::0;67834:51:::1;67910:7;;67904:2;:13:::0;67900:51:::1;;-1:-1:-1::0;67935:12:0::1;::::0;67900:51:::1;67975:7;;67969:2;:13:::0;67965:51:::1;;-1:-1:-1::0;68000:12:0::1;::::0;67965:51:::1;68040:7;;68034:2;:13:::0;68030:51:::1;;-1:-1:-1::0;68065:12:0::1;::::0;68030:51:::1;68108:7;;68102:2;:13:::0;68098:51:::1;;-1:-1:-1::0;68133:12:0::1;::::0;68098:51:::1;68173:8;;68167:2;:14:::0;68163:53:::1;;-1:-1:-1::0;68199:13:0::1;::::0;68163:53:::1;11416:6:::0;;-1:-1:-1;;;;;68254:17:0;;::::1;11416:6:::0;;68254:17:::1;68250:233;;68296:5;::::0;:23:::1;::::0;-1:-1:-1;;;68296:23:0;;-1:-1:-1;;;;;9152:32:1;;;68296:23:0::1;::::0;::::1;9134:51:1::0;68323:10:0;;68296:5:::1;::::0;:15:::1;::::0;9107:18:1;;68296:23:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;68288:61;;;::::0;-1:-1:-1;;;68288:61:0;;16795:2:1;68288:61:0::1;::::0;::::1;16777:21:1::0;16834:2;16814:18;;;16807:30;-1:-1:-1;;;16853:18:1;;;16846:41;16904:18;;68288:61:0::1;16593:335:1::0;68288:61:0::1;68364:5;::::0;-1:-1:-1;;;;;68364:5:0::1;:18;7319:10:::0;68364:59:::1;::::0;-1:-1:-1;;;;;;68364:59:0::1;::::0;;;;;;-1:-1:-1;;;;;17191:15:1;;;68364:59:0::1;::::0;::::1;17173:34:1::0;68405:4:0::1;17223:18:1::0;;;17216:43;17275:18;;;17268:34;;;17108:18;;68364:59:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68438:32;68444:7;68453:2;68457:6;68465:4;68438:5;:32::i;:::-;67467:1030;;2389:20:::0;1783:1;2909:7;:22;2726:213;2389:20;67357:1140;;;;:::o;70343:65::-;11229:13;:11;:13::i;:::-;70388:8:::1;:6;:8::i;69259:122::-:0;11229:13;:11;:13::i;:::-;69338:12:::1;:31:::0;69259:122::o;69125:::-;11229:13;:11;:13::i;:::-;69204:12:::1;:31:::0;69125:122::o;70420:194::-;11229:13;:11;:13::i;:::-;70573:29:::1;::::0;-1:-1:-1;;;70573:29:0;;-1:-1:-1;;;;;17755:32:1;;;70573:29:0::1;::::0;::::1;17737:51:1::0;17804:18;;;17797:34;;;70573:15:0;::::1;::::0;::::1;::::0;17710:18:1;;70573:29:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;68857:122::-:0;11229:13;:11;:13::i;:::-;68936:12:::1;:31:::0;68857:122::o;69961:::-;11229:13;:11;:13::i;:::-;70040:12:::1;:31:::0;69961:122::o;48039:155::-;48134:52;7319:10;48167:8;48177;48134:18;:52::i;:::-;48039:155;;:::o;68991:122::-;11229:13;:11;:13::i;:::-;69070:12:::1;:31:::0;68991:122::o;70095:126::-;11229:13;:11;:13::i;:::-;70176::::1;:33:::0;70095:126::o;69543:122::-;11229:13;:11;:13::i;:::-;69622:12:::1;:31:::0;69543:122::o;69827:::-;11229:13;:11;:13::i;:::-;69906:12:::1;:31:::0;69827:122::o;48506:406::-;-1:-1:-1;;;;;48714:20:0;;7319:10;48714:20;;:60;;-1:-1:-1;48738:36:0;48755:4;7319:10;48266:168;:::i;48738:36::-;48692:156;;;;-1:-1:-1;;;48692:156:0;;;;;;;:::i;:::-;48859:45;48877:4;48883:2;48887;48891:6;48899:4;48859:17;:45::i;12249:201::-;11229:13;:11;:13::i;:::-;-1:-1:-1;;;;;12338:22:0;::::1;12330:73;;;::::0;-1:-1:-1;;;12330:73:0;;18044:2:1;12330:73:0::1;::::0;::::1;18026:21:1::0;18083:2;18063:18;;;18056:30;18122:34;18102:18;;;18095:62;-1:-1:-1;;;18173:18:1;;;18166:36;18219:19;;12330:73:0::1;17842:402:1::0;12330:73:0::1;12414:28;12433:8;12414:18;:28::i;:::-;12249:201:::0;:::o;65103:326::-;-1:-1:-1;;;;;65243:23:0;;7319:10;65243:23;;:66;;-1:-1:-1;65270:39:0;65287:7;7319:10;48266:168;:::i;65270:39::-;65221:162;;;;-1:-1:-1;;;65221:162:0;;;;;;;:::i;:::-;65396:25;65402:7;65411:2;65415:5;65396;:25::i;51223:1146::-;51450:7;:14;51436:3;:10;:28;51428:81;;;;-1:-1:-1;;;51428:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51528:16:0;;51520:66;;;;-1:-1:-1;;;51520:66:0;;;;;;;:::i;:::-;7319:10;51643:60;7319:10;51674:4;51680:2;51684:3;51689:7;51698:4;51643:20;:60::i;:::-;51721:9;51716:421;51740:3;:10;51736:1;:14;51716:421;;;51772:10;51785:3;51789:1;51785:6;;;;;;;;:::i;:::-;;;;;;;51772:19;;51806:14;51823:7;51831:1;51823:10;;;;;;;;:::i;:::-;;;;;;;;;;;;51850:19;51872:13;;;;;;;;;;-1:-1:-1;;;;;51872:19:0;;;;;;;;;;;;51823:10;;-1:-1:-1;51914:21:0;;;;51906:76;;;;-1:-1:-1;;;51906:76:0;;;;;;;:::i;:::-;52026:9;:13;;;;;;;;;;;-1:-1:-1;;;;;52026:19:0;;;;;;;;;;52048:20;;;52026:42;;52098:17;;;;;;;:27;;52048:20;;52026:9;52098:27;;52048:20;;52098:27;:::i;:::-;;;;;;;;51757:380;;;51752:3;;;;:::i;:::-;;;51716:421;;;;52184:2;-1:-1:-1;;;;;52154:47:0;52178:4;-1:-1:-1;;;;;52154:47:0;52168:8;-1:-1:-1;;;;;52154:47:0;;52188:3;52193:7;52154:47;;;;;;;:::i;:::-;;;;;;;;52286:75;52322:8;52332:4;52338:2;52342:3;52347:7;52356:4;52286:35;:75::i;:::-;51417:952;51223:1146;;;;;:::o;11508:132::-;11416:6;;-1:-1:-1;;;;;11416:6:0;7319:10;11572:23;11564:68;;;;-1:-1:-1;;;11564:68:0;;20277:2:1;11564:68:0;;;20259:21:1;;;20296:18;;;20289:30;20355:34;20335:18;;;20328:62;20407:18;;11564:68:0;20075:356:1;9981:120:0;8990:16;:14;:16::i;:::-;10040:7:::1;:15:::0;;-1:-1:-1;;;;10040:15:0::1;::::0;;10071:22:::1;7319:10:::0;10080:12:::1;10071:22;::::0;-1:-1:-1;;;;;9152:32:1;;;9134:51;;9122:2;9107:18;10071:22:0::1;;;;;;;9981:120::o:0;56988:969::-;-1:-1:-1;;;;;57140:18:0;;57132:66;;;;-1:-1:-1;;;57132:66:0;;;;;;;:::i;:::-;57231:7;:14;57217:3;:10;:28;57209:81;;;;-1:-1:-1;;;57209:81:0;;;;;;;:::i;:::-;57303:16;7319:10;57303:31;;57347:66;57368:8;57378:4;57392:1;57396:3;57401:7;57347:66;;;;;;;;;;;;:20;:66::i;:::-;57431:9;57426:373;57450:3;:10;57446:1;:14;57426:373;;;57482:10;57495:3;57499:1;57495:6;;;;;;;;:::i;:::-;;;;;;;57482:19;;57516:14;57533:7;57541:1;57533:10;;;;;;;;:::i;:::-;;;;;;;;;;;;57560:19;57582:13;;;;;;;;;;-1:-1:-1;;;;;57582:19:0;;;;;;;;;;;;57533:10;;-1:-1:-1;57624:21:0;;;;57616:70;;;;-1:-1:-1;;;57616:70:0;;;;;;;:::i;:::-;57730:9;:13;;;;;;;;;;;-1:-1:-1;;;;;57730:19:0;;;;;;;;;;57752:20;;57730:42;;57462:3;;;;:::i;:::-;;;;57426:373;;;;57854:1;-1:-1:-1;;;;;57816:55:0;57840:4;-1:-1:-1;;;;;57816:55:0;57830:8;-1:-1:-1;;;;;57816:55:0;;57858:3;57863:7;57816:55;;;;;;;:::i;:::-;;;;;;;;57884:65;;;;;;;;;57928:1;57884:65;;;51223:1146;12610:191;12703:6;;;-1:-1:-1;;;;;12720:17:0;;;-1:-1:-1;;;;;;12720:17:0;;;;;;;12753:40;;12703:6;;;12720:17;12703:6;;12753:40;;12684:16;;12753:40;12673:128;12610:191;:::o;2425:293::-;1827:1;2559:7;;:19;2551:63;;;;-1:-1:-1;;;2551:63:0;;21447:2:1;2551:63:0;;;21429:21:1;21486:2;21466:18;;;21459:30;21525:33;21505:18;;;21498:61;21576:18;;2551:63:0;21245:355:1;2551:63:0;1827:1;2692:7;:18;2425:293::o;53687:729::-;-1:-1:-1;;;;;53840:16:0;;53832:62;;;;-1:-1:-1;;;53832:62:0;;21807:2:1;53832:62:0;;;21789:21:1;21846:2;21826:18;;;21819:30;21885:34;21865:18;;;21858:62;-1:-1:-1;;;21936:18:1;;;21929:31;21977:19;;53832:62:0;21605:397:1;53832:62:0;7319:10;53907:16;53972:21;53990:2;53972:17;:21::i;:::-;53949:44;;54004:24;54031:25;54049:6;54031:17;:25::i;:::-;54004:52;;54069:66;54090:8;54108:1;54112:2;54116:3;54121:7;54130:4;54069:20;:66::i;:::-;54148:9;:13;;;;;;;;;;;-1:-1:-1;;;;;54148:17:0;;;;;;;;;:27;;54169:6;;54148:9;:27;;54169:6;;54148:27;:::i;:::-;;;;-1:-1:-1;;54191:52:0;;;22181:25:1;;;22237:2;22222:18;;22215:34;;;-1:-1:-1;;;;;54191:52:0;;;;54224:1;;54191:52;;;;;;22154:18:1;54191:52:0;;;;;;;54334:74;54365:8;54383:1;54387:2;54391;54395:6;54403:4;54334:30;:74::i;:::-;53821:595;;;53687:729;;;;:::o;9722:118::-;8731:19;:17;:19::i;:::-;9782:7:::1;:14:::0;;-1:-1:-1;;;;9782:14:0::1;-1:-1:-1::0;;;9782:14:0::1;::::0;;9812:20:::1;9819:12;7319:10:::0;;7239:98;58100:331;58255:8;-1:-1:-1;;;;;58246:17:0;:5;-1:-1:-1;;;;;58246:17:0;;58238:71;;;;-1:-1:-1;;;58238:71:0;;22462:2:1;58238:71:0;;;22444:21:1;22501:2;22481:18;;;22474:30;22540:34;22520:18;;;22513:62;-1:-1:-1;;;22591:18:1;;;22584:39;22640:19;;58238:71:0;22260:405:1;58238:71:0;-1:-1:-1;;;;;58320:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;58320:46:0;;;;;;;;;;58382:41;;1178::1;;;58382::0;;1151:18:1;58382:41:0;;;;;;;58100:331;;;:::o;49891:974::-;-1:-1:-1;;;;;50079:16:0;;50071:66;;;;-1:-1:-1;;;50071:66:0;;;;;;;:::i;:::-;7319:10;50150:16;50215:21;50233:2;50215:17;:21::i;:::-;50192:44;;50247:24;50274:25;50292:6;50274:17;:25::i;:::-;50247:52;;50312:60;50333:8;50343:4;50349:2;50353:3;50358:7;50367:4;50312:20;:60::i;:::-;50385:19;50407:13;;;;;;;;;;;-1:-1:-1;;;;;50407:19:0;;;;;;;;;;50445:21;;;;50437:76;;;;-1:-1:-1;;;50437:76:0;;;;;;;:::i;:::-;50549:9;:13;;;;;;;;;;;-1:-1:-1;;;;;50549:19:0;;;;;;;;;;50571:20;;;50549:42;;50613:17;;;;;;;:27;;50571:20;;50549:9;50613:27;;50571:20;;50613:27;:::i;:::-;;;;-1:-1:-1;;50658:46:0;;;22181:25:1;;;22237:2;22222:18;;22215:34;;;-1:-1:-1;;;;;50658:46:0;;;;;;;;;;;;;;22154:18:1;50658:46:0;;;;;;;50789:68;50820:8;50830:4;50836:2;50840;50844:6;50852:4;50789:30;:68::i;:::-;50060:805;;;;49891:974;;;;;:::o;55930:808::-;-1:-1:-1;;;;;56057:18:0;;56049:66;;;;-1:-1:-1;;;56049:66:0;;;;;;;:::i;:::-;7319:10;56128:16;56193:21;56211:2;56193:17;:21::i;:::-;56170:44;;56225:24;56252:25;56270:6;56252:17;:25::i;:::-;56225:52;;56290:66;56311:8;56321:4;56335:1;56339:3;56344:7;56290:66;;;;;;;;;;;;:20;:66::i;:::-;56369:19;56391:13;;;;;;;;;;;-1:-1:-1;;;;;56391:19:0;;;;;;;;;;56429:21;;;;56421:70;;;;-1:-1:-1;;;56421:70:0;;;;;;;:::i;:::-;56527:9;:13;;;;;;;;;;;-1:-1:-1;;;;;56527:19:0;;;;;;;;;;;;56549:20;;;56527:42;;56598:54;;22181:25:1;;;22222:18;;;22215:34;;;56527:19:0;;56598:54;;;;;;22154:18:1;56598:54:0;;;;;;;56665:65;;;;;;;;;56709:1;56665:65;;;51223:1146;70707:322;8731:19;:17;:19::i;:::-;70951:66:::1;70978:8;70988:4;70994:2;70998:3;71003:7;71012:4;70951:26;:66::i;61545:813::-:0;-1:-1:-1;;;;;61785:13:0;;27668:19;:23;61781:570;;61821:79;;-1:-1:-1;;;61821:79:0;;-1:-1:-1;;;;;61821:43:0;;;;;:79;;61865:8;;61875:4;;61881:3;;61886:7;;61895:4;;61821:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61821:79:0;;;;;;;;-1:-1:-1;;61821:79:0;;;;;;;;;;;;:::i;:::-;;;61817:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;62213:6;62206:14;;-1:-1:-1;;;62206:14:0;;;;;;;;:::i;61817:523::-;;;62262:62;;-1:-1:-1;;;62262:62:0;;24818:2:1;62262:62:0;;;24800:21:1;24857:2;24837:18;;;24830:30;24896:34;24876:18;;;24869:62;-1:-1:-1;;;24947:18:1;;;24940:50;25007:19;;62262:62:0;24616:416:1;61817:523:0;-1:-1:-1;;;;;;61982:60:0;;-1:-1:-1;;;61982:60:0;61978:159;;62067:50;;-1:-1:-1;;;62067:50:0;;;;;;;:::i;9470:108::-;9197:7;;-1:-1:-1;;;9197:7:0;;;;9529:41;;;;-1:-1:-1;;;9529:41:0;;25648:2:1;9529:41:0;;;25630:21:1;25687:2;25667:18;;;25660:30;-1:-1:-1;;;25706:18:1;;;25699:50;25766:18;;9529:41:0;25446:344:1;62366:198:0;62486:16;;;62500:1;62486:16;;;;;;;;;62432;;62461:22;;62486:16;;;;;;;;;;;;-1:-1:-1;62486:16:0;62461:41;;62524:7;62513:5;62519:1;62513:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;62551:5;62366:198;-1:-1:-1;;62366:198:0:o;60793:744::-;-1:-1:-1;;;;;61008:13:0;;27668:19;:23;61004:526;;61044:72;;-1:-1:-1;;;61044:72:0;;-1:-1:-1;;;;;61044:38:0;;;;;:72;;61083:8;;61093:4;;61099:2;;61103:6;;61111:4;;61044:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61044:72:0;;;;;;;;-1:-1:-1;;61044:72:0;;;;;;;;;;;;:::i;:::-;;;61040:479;;;;:::i;:::-;-1:-1:-1;;;;;;61166:55:0;;-1:-1:-1;;;61166:55:0;61162:154;;61246:50;;-1:-1:-1;;;61246:50:0;;;;;;;:::i;9285:108::-;9197:7;;-1:-1:-1;;;9197:7:0;;;;9355:9;9347:38;;;;-1:-1:-1;;;9347:38:0;;26563:2:1;9347:38:0;;;26545:21:1;26602:2;26582:18;;;26575:30;-1:-1:-1;;;26621:18:1;;;26614:46;26677:18;;9347:38:0;26361:340:1;63719:931:0;-1:-1:-1;;;;;64041:18:0;;64037:160;;64081:9;64076:110;64100:3;:10;64096:1;:14;64076:110;;;64160:7;64168:1;64160:10;;;;;;;;:::i;:::-;;;;;;;64136:12;:20;64149:3;64153:1;64149:6;;;;;;;;:::i;:::-;;;;;;;64136:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;64112:3:0;;-1:-1:-1;64112:3:0;;:::i;:::-;;;64076:110;;;;64037:160;-1:-1:-1;;;;;64213:16:0;;64209:434;;64251:9;64246:386;64270:3;:10;64266:1;:14;64246:386;;;64306:10;64319:3;64323:1;64319:6;;;;;;;;:::i;:::-;;;;;;;64306:19;;64344:14;64361:7;64369:1;64361:10;;;;;;;;:::i;:::-;;;;;;;64344:27;;64390:14;64407:12;:16;64420:2;64407:16;;;;;;;;;;;;64390:33;;64460:6;64450;:16;;64442:69;;;;-1:-1:-1;;;64442:69:0;;26908:2:1;64442:69:0;;;26890:21:1;26947:2;26927:18;;;26920:30;26986:34;26966:18;;;26959:62;-1:-1:-1;;;27037:18:1;;;27030:38;27085:19;;64442:69:0;26706:404:1;64442:69:0;64563:16;;;;:12;:16;;;;;;64582:15;;64563:34;;64282:3;;;:::i;:::-;;;64246:386;;14:131:1;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:1:o;652:131::-;-1:-1:-1;;;;;;726:32:1;;716:43;;706:71;;773:1;770;763:12;788:245;846:6;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;954:9;941:23;973:30;997:5;973:30;:::i;:::-;1022:5;788:245;-1:-1:-1;;;788:245:1:o;1230:180::-;1289:6;1342:2;1330:9;1321:7;1317:23;1313:32;1310:52;;;1358:1;1355;1348:12;1310:52;-1:-1:-1;1381:23:1;;1230:180;-1:-1:-1;1230:180:1:o;1415:423::-;1457:3;1495:5;1489:12;1522:6;1517:3;1510:19;1547:1;1557:162;1571:6;1568:1;1565:13;1557:162;;;1633:4;1689:13;;;1685:22;;1679:29;1661:11;;;1657:20;;1650:59;1586:12;1557:162;;;1561:3;1764:1;1757:4;1748:6;1743:3;1739:16;1735:27;1728:38;1827:4;1820:2;1816:7;1811:2;1803:6;1799:15;1795:29;1790:3;1786:39;1782:50;1775:57;;;1415:423;;;;:::o;1843:220::-;1992:2;1981:9;1974:21;1955:4;2012:45;2053:2;2042:9;2038:18;2030:6;2012:45;:::i;2068:127::-;2129:10;2124:3;2120:20;2117:1;2110:31;2160:4;2157:1;2150:15;2184:4;2181:1;2174:15;2200:249;2310:2;2291:13;;-1:-1:-1;;2287:27:1;2275:40;;2345:18;2330:34;;2366:22;;;2327:62;2324:88;;;2392:18;;:::i;:::-;2428:2;2421:22;-1:-1:-1;;2200:249:1:o;2454:183::-;2514:4;2547:18;2539:6;2536:30;2533:56;;;2569:18;;:::i;:::-;-1:-1:-1;2614:1:1;2610:14;2626:4;2606:25;;2454:183::o;2642:724::-;2696:5;2749:3;2742:4;2734:6;2730:17;2726:27;2716:55;;2767:1;2764;2757:12;2716:55;2803:6;2790:20;2829:4;2852:43;2892:2;2852:43;:::i;:::-;2924:2;2918:9;2936:31;2964:2;2956:6;2936:31;:::i;:::-;3002:18;;;3094:1;3090:10;;;;3078:23;;3074:32;;;3036:15;;;;-1:-1:-1;3118:15:1;;;3115:35;;;3146:1;3143;3136:12;3115:35;3182:2;3174:6;3170:15;3194:142;3210:6;3205:3;3202:15;3194:142;;;3276:17;;3264:30;;3314:12;;;;3227;;3194:142;;;-1:-1:-1;3354:6:1;2642:724;-1:-1:-1;;;;;;2642:724:1:o;3371:468::-;3435:5;3469:18;3461:6;3458:30;3455:56;;;3491:18;;:::i;:::-;3540:2;3534:9;3552:69;3609:2;3588:15;;-1:-1:-1;;3584:29:1;3615:4;3580:40;3534:9;3552:69;:::i;:::-;3639:6;3630:15;;3669:6;3661;3654:22;3709:3;3700:6;3695:3;3691:16;3688:25;3685:45;;;3726:1;3723;3716:12;3685:45;3776:6;3771:3;3764:4;3756:6;3752:17;3739:44;3831:1;3824:4;3815:6;3807;3803:19;3799:30;3792:41;;3371:468;;;;;:::o;3844:220::-;3886:5;3939:3;3932:4;3924:6;3920:17;3916:27;3906:55;;3957:1;3954;3947:12;3906:55;3979:79;4054:3;4045:6;4032:20;4025:4;4017:6;4013:17;3979:79;:::i;4069:1071::-;4223:6;4231;4239;4247;4255;4308:3;4296:9;4287:7;4283:23;4279:33;4276:53;;;4325:1;4322;4315:12;4276:53;4364:9;4351:23;4383:31;4408:5;4383:31;:::i;:::-;4433:5;-1:-1:-1;4490:2:1;4475:18;;4462:32;4503:33;4462:32;4503:33;:::i;:::-;4555:7;-1:-1:-1;4613:2:1;4598:18;;4585:32;4636:18;4666:14;;;4663:34;;;4693:1;4690;4683:12;4663:34;4716:61;4769:7;4760:6;4749:9;4745:22;4716:61;:::i;:::-;4706:71;;4830:2;4819:9;4815:18;4802:32;4786:48;;4859:2;4849:8;4846:16;4843:36;;;4875:1;4872;4865:12;4843:36;4898:63;4953:7;4942:8;4931:9;4927:24;4898:63;:::i;:::-;4888:73;;5014:3;5003:9;4999:19;4986:33;4970:49;;5044:2;5034:8;5031:16;5028:36;;;5060:1;5057;5050:12;5028:36;;5083:51;5126:7;5115:8;5104:9;5100:24;5083:51;:::i;:::-;5073:61;;;4069:1071;;;;;;;;:::o;5145:1277::-;5263:6;5271;5324:2;5312:9;5303:7;5299:23;5295:32;5292:52;;;5340:1;5337;5330:12;5292:52;5380:9;5367:23;5409:18;5450:2;5442:6;5439:14;5436:34;;;5466:1;5463;5456:12;5436:34;5504:6;5493:9;5489:22;5479:32;;5549:7;5542:4;5538:2;5534:13;5530:27;5520:55;;5571:1;5568;5561:12;5520:55;5607:2;5594:16;5629:4;5652:43;5692:2;5652:43;:::i;:::-;5724:2;5718:9;5736:31;5764:2;5756:6;5736:31;:::i;:::-;5802:18;;;5890:1;5886:10;;;;5878:19;;5874:28;;;5836:15;;;;-1:-1:-1;5914:19:1;;;5911:39;;;5946:1;5943;5936:12;5911:39;5970:11;;;;5990:217;6006:6;6001:3;5998:15;5990:217;;;6086:3;6073:17;6103:31;6128:5;6103:31;:::i;:::-;6147:18;;6023:12;;;;6185;;;;5990:217;;;6226:6;-1:-1:-1;;6270:18:1;;6257:32;;-1:-1:-1;;6301:16:1;;;6298:36;;;6330:1;6327;6320:12;6298:36;;6353:63;6408:7;6397:8;6386:9;6382:24;6353:63;:::i;:::-;6343:73;;;5145:1277;;;;;:::o;6427:435::-;6480:3;6518:5;6512:12;6545:6;6540:3;6533:19;6571:4;6600:2;6595:3;6591:12;6584:19;;6637:2;6630:5;6626:14;6658:1;6668:169;6682:6;6679:1;6676:13;6668:169;;;6743:13;;6731:26;;6777:12;;;;6812:15;;;;6704:1;6697:9;6668:169;;;-1:-1:-1;6853:3:1;;6427:435;-1:-1:-1;;;;;6427:435:1:o;6867:261::-;7046:2;7035:9;7028:21;7009:4;7066:56;7118:2;7107:9;7103:18;7095:6;7066:56;:::i;7133:518::-;7211:6;7219;7272:2;7260:9;7251:7;7247:23;7243:32;7240:52;;;7288:1;7285;7278:12;7240:52;7324:9;7311:23;7301:33;;7385:2;7374:9;7370:18;7357:32;7412:18;7404:6;7401:30;7398:50;;;7444:1;7441;7434:12;7398:50;7467:22;;7520:4;7512:13;;7508:27;-1:-1:-1;7498:55:1;;7549:1;7546;7539:12;7498:55;7572:73;7637:7;7632:2;7619:16;7614:2;7610;7606:11;7572:73;:::i;7656:730::-;7783:6;7791;7799;7852:2;7840:9;7831:7;7827:23;7823:32;7820:52;;;7868:1;7865;7858:12;7820:52;7907:9;7894:23;7926:31;7951:5;7926:31;:::i;:::-;7976:5;-1:-1:-1;8032:2:1;8017:18;;8004:32;8055:18;8085:14;;;8082:34;;;8112:1;8109;8102:12;8082:34;8135:61;8188:7;8179:6;8168:9;8164:22;8135:61;:::i;:::-;8125:71;;8249:2;8238:9;8234:18;8221:32;8205:48;;8278:2;8268:8;8265:16;8262:36;;;8294:1;8291;8284:12;8262:36;;8317:63;8372:7;8361:8;8350:9;8346:24;8317:63;:::i;:::-;8307:73;;;7656:730;;;;;:::o;8391:592::-;8486:6;8494;8502;8510;8563:3;8551:9;8542:7;8538:23;8534:33;8531:53;;;8580:1;8577;8570:12;8531:53;8619:9;8606:23;8638:31;8663:5;8638:31;:::i;:::-;8688:5;-1:-1:-1;8740:2:1;8725:18;;8712:32;;-1:-1:-1;8791:2:1;8776:18;;8763:32;;-1:-1:-1;8846:2:1;8831:18;;8818:32;8873:18;8862:30;;8859:50;;;8905:1;8902;8895:12;8859:50;8928:49;8969:7;8960:6;8949:9;8945:22;8928:49;:::i;:::-;8918:59;;;8391:592;;;;;;;:::o;9196:470::-;9287:6;9295;9303;9356:2;9344:9;9335:7;9331:23;9327:32;9324:52;;;9372:1;9369;9362:12;9324:52;9411:9;9398:23;9430:31;9455:5;9430:31;:::i;:::-;9480:5;-1:-1:-1;9532:2:1;9517:18;;9504:32;;-1:-1:-1;9588:2:1;9573:18;;9560:32;9601:33;9560:32;9601:33;:::i;:::-;9653:7;9643:17;;;9196:470;;;;;:::o;9671:118::-;9757:5;9750:13;9743:21;9736:5;9733:32;9723:60;;9779:1;9776;9769:12;9794:382;9859:6;9867;9920:2;9908:9;9899:7;9895:23;9891:32;9888:52;;;9936:1;9933;9926:12;9888:52;9975:9;9962:23;9994:31;10019:5;9994:31;:::i;:::-;10044:5;-1:-1:-1;10101:2:1;10086:18;;10073:32;10114:30;10073:32;10114:30;:::i;:::-;10163:7;10153:17;;;9794:382;;;;;:::o;10181:388::-;10249:6;10257;10310:2;10298:9;10289:7;10285:23;10281:32;10278:52;;;10326:1;10323;10316:12;10278:52;10365:9;10352:23;10384:31;10409:5;10384:31;:::i;:::-;10434:5;-1:-1:-1;10491:2:1;10476:18;;10463:32;10504:33;10463:32;10504:33;:::i;10574:734::-;10678:6;10686;10694;10702;10710;10763:3;10751:9;10742:7;10738:23;10734:33;10731:53;;;10780:1;10777;10770:12;10731:53;10819:9;10806:23;10838:31;10863:5;10838:31;:::i;:::-;10888:5;-1:-1:-1;10945:2:1;10930:18;;10917:32;10958:33;10917:32;10958:33;:::i;:::-;11010:7;-1:-1:-1;11064:2:1;11049:18;;11036:32;;-1:-1:-1;11115:2:1;11100:18;;11087:32;;-1:-1:-1;11170:3:1;11155:19;;11142:33;11198:18;11187:30;;11184:50;;;11230:1;11227;11220:12;11184:50;11253:49;11294:7;11285:6;11274:9;11270:22;11253:49;:::i;11313:247::-;11372:6;11425:2;11413:9;11404:7;11400:23;11396:32;11393:52;;;11441:1;11438;11431:12;11393:52;11480:9;11467:23;11499:31;11524:5;11499:31;:::i;11565:383::-;11642:6;11650;11658;11711:2;11699:9;11690:7;11686:23;11682:32;11679:52;;;11727:1;11724;11717:12;11679:52;11766:9;11753:23;11785:31;11810:5;11785:31;:::i;:::-;11835:5;11887:2;11872:18;;11859:32;;-1:-1:-1;11938:2:1;11923:18;;;11910:32;;11565:383;-1:-1:-1;;;11565:383:1:o;12586:380::-;12665:1;12661:12;;;;12708;;;12729:61;;12783:4;12775:6;12771:17;12761:27;;12729:61;12836:2;12828:6;12825:14;12805:18;12802:38;12799:161;;12882:10;12877:3;12873:20;12870:1;12863:31;12917:4;12914:1;12907:15;12945:4;12942:1;12935:15;12799:161;;12586:380;;;:::o;12971:410::-;13173:2;13155:21;;;13212:2;13192:18;;;13185:30;13251:34;13246:2;13231:18;;13224:62;-1:-1:-1;;;13317:2:1;13302:18;;13295:44;13371:3;13356:19;;12971:410::o;13796:127::-;13857:10;13852:3;13848:20;13845:1;13838:31;13888:4;13885:1;13878:15;13912:4;13909:1;13902:15;13928:127;13989:10;13984:3;13980:20;13977:1;13970:31;14020:4;14017:1;14010:15;14044:4;14041:1;14034:15;14060:135;14099:3;14120:17;;;14117:43;;14140:18;;:::i;:::-;-1:-1:-1;14187:1:1;14176:13;;14060:135::o;14326:545::-;14428:2;14423:3;14420:11;14417:448;;;14464:1;14489:5;14485:2;14478:17;14534:4;14530:2;14520:19;14604:2;14592:10;14588:19;14585:1;14581:27;14575:4;14571:38;14640:4;14628:10;14625:20;14622:47;;;-1:-1:-1;14663:4:1;14622:47;14718:2;14713:3;14709:12;14706:1;14702:20;14696:4;14692:31;14682:41;;14773:82;14791:2;14784:5;14781:13;14773:82;;;14836:17;;;14817:1;14806:13;14773:82;;15047:1352;15173:3;15167:10;15200:18;15192:6;15189:30;15186:56;;;15222:18;;:::i;:::-;15251:97;15341:6;15301:38;15333:4;15327:11;15301:38;:::i;:::-;15295:4;15251:97;:::i;:::-;15403:4;;15467:2;15456:14;;15484:1;15479:663;;;;16186:1;16203:6;16200:89;;;-1:-1:-1;16255:19:1;;;16249:26;16200:89;-1:-1:-1;;15004:1:1;15000:11;;;14996:24;14992:29;14982:40;15028:1;15024:11;;;14979:57;16302:81;;15449:944;;15479:663;14273:1;14266:14;;;14310:4;14297:18;;-1:-1:-1;;15515:20:1;;;15633:236;15647:7;15644:1;15641:14;15633:236;;;15736:19;;;15730:26;15715:42;;15828:27;;;;15796:1;15784:14;;;;15663:19;;15633:236;;;15637:3;15897:6;15888:7;15885:19;15882:201;;;15958:19;;;15952:26;-1:-1:-1;;16041:1:1;16037:14;;;16053:3;16033:24;16029:37;16025:42;16010:58;15995:74;;15882:201;-1:-1:-1;;;;;16129:1:1;16113:14;;;16109:22;16096:36;;-1:-1:-1;15047:1352:1:o;16404:184::-;16474:6;16527:2;16515:9;16506:7;16502:23;16498:32;16495:52;;;16543:1;16540;16533:12;16495:52;-1:-1:-1;16566:16:1;;16404:184;-1:-1:-1;16404:184:1:o;17313:245::-;17380:6;17433:2;17421:9;17412:7;17408:23;17404:32;17401:52;;;17449:1;17446;17439:12;17401:52;17481:9;17475:16;17500:28;17522:5;17500:28;:::i;18249:404::-;18451:2;18433:21;;;18490:2;18470:18;;;18463:30;18529:34;18524:2;18509:18;;18502:62;-1:-1:-1;;;18595:2:1;18580:18;;18573:38;18643:3;18628:19;;18249:404::o;18658:401::-;18860:2;18842:21;;;18899:2;18879:18;;;18872:30;18938:34;18933:2;18918:18;;18911:62;-1:-1:-1;;;19004:2:1;18989:18;;18982:35;19049:3;19034:19;;18658:401::o;19064:406::-;19266:2;19248:21;;;19305:2;19285:18;;;19278:30;19344:34;19339:2;19324:18;;19317:62;-1:-1:-1;;;19410:2:1;19395:18;;19388:40;19460:3;19445:19;;19064:406::o;19475:125::-;19540:9;;;19561:10;;;19558:36;;;19574:18;;:::i;19605:465::-;19862:2;19851:9;19844:21;19825:4;19888:56;19940:2;19929:9;19925:18;19917:6;19888:56;:::i;:::-;19992:9;19984:6;19980:22;19975:2;19964:9;19960:18;19953:50;20020:44;20057:6;20049;20020:44;:::i;:::-;20012:52;19605:465;-1:-1:-1;;;;;19605:465:1:o;20436:399::-;20638:2;20620:21;;;20677:2;20657:18;;;20650:30;20716:34;20711:2;20696:18;;20689:62;-1:-1:-1;;;20782:2:1;20767:18;;20760:33;20825:3;20810:19;;20436:399::o;20840:400::-;21042:2;21024:21;;;21081:2;21061:18;;;21054:30;21120:34;21115:2;21100:18;;21093:62;-1:-1:-1;;;21186:2:1;21171:18;;21164:34;21230:3;21215:19;;20840:400::o;22670:827::-;-1:-1:-1;;;;;23067:15:1;;;23049:34;;23119:15;;23114:2;23099:18;;23092:43;23029:3;23166:2;23151:18;;23144:31;;;22992:4;;23198:57;;23235:19;;23227:6;23198:57;:::i;:::-;23303:9;23295:6;23291:22;23286:2;23275:9;23271:18;23264:50;23337:44;23374:6;23366;23337:44;:::i;:::-;23323:58;;23430:9;23422:6;23418:22;23412:3;23401:9;23397:19;23390:51;23458:33;23484:6;23476;23458:33;:::i;:::-;23450:41;22670:827;-1:-1:-1;;;;;;;;22670:827:1:o;23502:249::-;23571:6;23624:2;23612:9;23603:7;23599:23;23595:32;23592:52;;;23640:1;23637;23630:12;23592:52;23672:9;23666:16;23691:30;23715:5;23691:30;:::i;23756:179::-;23791:3;23833:1;23815:16;23812:23;23809:120;;;23879:1;23876;23873;23858:23;-1:-1:-1;23916:1:1;23910:8;23905:3;23901:18;23809:120;23756:179;:::o;23940:671::-;23979:3;24021:4;24003:16;24000:26;23997:39;;;23940:671;:::o;23997:39::-;24063:2;24057:9;-1:-1:-1;;24128:16:1;24124:25;;24121:1;24057:9;24100:50;24179:4;24173:11;24203:16;24238:18;24309:2;24302:4;24294:6;24290:17;24287:25;24282:2;24274:6;24271:14;24268:45;24265:58;;;24316:5;;;;;23940:671;:::o;24265:58::-;24353:6;24347:4;24343:17;24332:28;;24389:3;24383:10;24416:2;24408:6;24405:14;24402:27;;;24422:5;;;;;;23940:671;:::o;24402:27::-;24506:2;24487:16;24481:4;24477:27;24473:36;24466:4;24457:6;24452:3;24448:16;24444:27;24441:69;24438:82;;;24513:5;;;;;;23940:671;:::o;24438:82::-;24529:57;24580:4;24571:6;24563;24559:19;24555:30;24549:4;24529:57;:::i;:::-;-1:-1:-1;24602:3:1;;23940:671;-1:-1:-1;;;;;23940:671:1:o;25037:404::-;25239:2;25221:21;;;25278:2;25258:18;;;25251:30;25317:34;25312:2;25297:18;;25290:62;-1:-1:-1;;;25383:2:1;25368:18;;25361:38;25431:3;25416:19;;25037:404::o;25795:561::-;-1:-1:-1;;;;;26092:15:1;;;26074:34;;26144:15;;26139:2;26124:18;;26117:43;26191:2;26176:18;;26169:34;;;26234:2;26219:18;;26212:34;;;26054:3;26277;26262:19;;26255:32;;;26017:4;;26304:46;;26330:19;;26322:6;26304:46;:::i;:::-;26296:54;25795:561;-1:-1:-1;;;;;;;25795:561:1:o

Swarm Source

ipfs://bb4760c2f5f591240f1324fba3abf5b2cff6a0bf2190ed13f8e0dc8e52007995
Loading