ETH Price: $3,390.55 (+1.82%)

Token

KIMINOTSUKI (KNT)
 

Overview

Max Total Supply

11 KNT

Holders

10

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x71feea315e5026c09db3e260cdaec14c3d990b75
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
KIMINOTSUKI

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-10-16
*/

// SPDX-License-Identifier: MIT

// 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/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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.9.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.9.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/utils/math/Math.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


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

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;



/**
 * @dev ERC1155 token with storage based token URI management.
 * Inspired by the ERC721URIStorage extension
 *
 * _Available since v4.6._
 */
abstract contract ERC1155URIStorage is ERC1155 {
    using Strings for uint256;

    // Optional base URI
    string private _baseURI = "";

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the concatenation of the `_baseURI`
     * and the token-specific uri if the latter is set
     *
     * This enables the following behaviors:
     *
     * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation
     *   of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI`
     *   is empty per default);
     *
     * - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()`
     *   which in most cases will contain `ERC1155._uri`;
     *
     * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a
     *   uri value set, then the result is empty.
     */
    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        string memory tokenURI = _tokenURIs[tokenId];

        // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked).
        return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId);
    }

    /**
     * @dev Sets `tokenURI` as the tokenURI of `tokenId`.
     */
    function _setURI(uint256 tokenId, string memory tokenURI) internal virtual {
        _tokenURIs[tokenId] = tokenURI;
        emit URI(uri(tokenId), tokenId);
    }

    /**
     * @dev Sets `baseURI` as the `_baseURI` for all tokens
     */
    function _setBaseURI(string memory baseURI) internal virtual {
        _baseURI = baseURI;
    }
}

// File: KIMINOTSUKI/kiminotsuki.sol


pragma solidity ^0.8.9;




pragma solidity ^0.8.9;




pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}




pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);
    bool public operatorFilteringEnabled = true;

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0 && operatorFilteringEnabled) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0 && operatorFilteringEnabled) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}



pragma solidity ^0.8.13;
/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

pragma solidity ^0.8.0;
/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}



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



pragma solidity ^0.8.9;
abstract contract Operable is Context {
    mapping(address => bool) _operators;
    modifier onlyOperator() {
        _checkOperatorRole(_msgSender());
        _;
    }
    function isOperator(address _operator) public view returns (bool) {
        return _operators[_operator];
    }
    function _grantOperatorRole(address _candidate) internal {
        require(
            !_operators[_candidate],
            string(
                abi.encodePacked(
                    "account ",
                    Strings.toHexString(uint160(_msgSender()), 20),
                    " is already has an operator role"
                )
            )
        );
        _operators[_candidate] = true;
    }
    function _revokeOperatorRole(address _candidate) internal {
        _checkOperatorRole(_candidate);
        delete _operators[_candidate];
    }
    function _checkOperatorRole(address _operator) internal view {
        require(
            _operators[_operator],
            string(
                abi.encodePacked(
                    "account ",
                    Strings.toHexString(uint160(_msgSender()), 20),
                    " is not an operator"
                )
            )
        );
    }
}

contract KIMINOTSUKI is ERC1155URIStorage, Ownable, Operable,ReentrancyGuard,DefaultOperatorFilterer,ERC2981 {
    using Strings for string;
    mapping(uint256 => uint256) public mintPrice;
    mapping(uint256 => uint256) public totalMinted;
    mapping(uint256 => mapping(address => uint256)) internal minted;
    address internal _withdrawWallet;
    address internal _aa;
    address internal _bb;
    address internal _cc;
    address internal _dd;
    address internal _ee;
    address internal _ff;

    uint256 internal _aaPerc;
    uint256 internal _bbPerc;
    uint256 internal _ccPerc;
    uint256 internal _ddPerc;
    uint256 internal _eePerc;
    uint256 internal _ffPerc;
    //flags
    mapping(uint256 => bool) public isSaleEnabled;

    string public name = "KIMINOTSUKI";
    string public symbol = "KNT";

    constructor(
    ) ERC1155('') {
        _grantOperatorRole(msg.sender);
        _setDefaultRoyalty(msg.sender,0);
        _setBaseURI("https://arweave.net/bMFfwlt1f7xv2qbc0Dyb5LZnKnKLhOfQVxzmkpZkEEw/");
        initializeNFT(0, "0.json");
        _withdrawWallet = 0xBc0f9D48Be2DA5a6942E31390a248F8ba329acC4;
        _aa = 0x2CF4515427CBd653a47A12B0066ac73A320F55Ea;
        _aaPerc = 1666;
        _bb = 0x684b894AeD5692029132C900Ba741729A311fE3D;
        _bbPerc = 1666;
        _cc = 0x637d25D0769f747B2742A04d249802dA85395970;
        _ccPerc = 1666;
    }

    function setBaseURI(string memory uri_) external onlyOperator {
        _setBaseURI(uri_);
    }

    function setTokenURI(uint256 tokenId, string memory _tokenURI)
        external
        onlyOperator
    {
        _setURI(tokenId, _tokenURI);
    }

    function initializeNFT(uint256 tokenId, string memory _tokenURI)
        public
        onlyOperator
    {
        require(bytes(uri(tokenId)).length == 0, 'NFT already exists');
        _mint(msg.sender, tokenId, 1, '');
        mintPrice[tokenId] = 0.006 ether;
        _setURI(tokenId, _tokenURI);
    }

    function ownerMint(
        address to,
        uint256 id,
        uint256 amount
    ) public onlyOperator {
        require(bytes(uri(id)).length != 0, 'Not initialized');
        _mint(to, id, amount, '');
    }

    function mint(
        uint256 id,
        uint256 _amount
    ) external payable virtual nonReentrant {
        require(bytes(uri(id)).length != 0, 'Not initialized');
        require(isSaleEnabled[id], "Mint is Paused");
        require(msg.value == mintPrice[id] * _amount, "ETH value is not correct");
        _mint(msg.sender,id, _amount, '');
        minted[id][msg.sender] += 1;
        totalMinted[id] += 1;
    }

    function isMinted(
        uint256 _id,
        address _address
    ) public view virtual returns (uint256) {
        return minted[_id][_address];
    }
    function totalSupply(
        uint256 _id
    ) public view virtual returns (uint256) {
        return bytes(uri(_id)).length;
    }

    function batchMintTo(
        address[] memory list,
        uint256 id,
        uint256[] memory amount
    ) public onlyOperator {
        for (uint256 i = 0; i < list.length; i++) {
            _mint(list[i], id, amount[i], '');
        }
    }

    function burnAdmin(
        address to,
        uint256 id,
        uint256 amount
    ) public onlyOperator {
        _burn(to, id, amount);
    }
    //SaleEnable
    function setSaleEnable(
        uint256 _id,
        bool bool_
    ) external virtual onlyOperator {
        isSaleEnabled[_id] = bool_;
    }

    // SET PRICES.
    //Price
    function setPrice(
        uint256 _id,
        uint256 newPrice
    ) external virtual onlyOperator {
        mintPrice[_id] = newPrice;
    }


        /** @dev receive. */
    function receiveToDeb() external payable virtual onlyOperator nonReentrant {
        require(msg.value > 0, "ETH value is not correct");
    }

    /**
    @dev set aa's wallet and fraction.withdraw to this wallet.only operator.
    */
    function setWallet__aa(
        address _owner,
        uint256 _perc
    ) external virtual onlyOperator {
        _aa = _owner;
        _aaPerc = _perc;
    }

    /**
    @dev set bb's wallet and fraction.withdraw to this wallet.only operator.
    */
    function setWallet__bb(
        address _owner,
        uint256 _perc
    ) external virtual onlyOperator {
        _bb = _owner;
        _bbPerc = _perc;
    }

    /**
    @dev set cc's wallet and fraction.withdraw to this wallet.only operator.
    */
    function setWallet__cc(
        address _owner,
        uint256 _perc
    ) external virtual onlyOperator {
        _cc = _owner;
        _ccPerc = _perc;
    }

    /**
    @dev set dd's wallet and fraction.withdraw to this wallet.only operator.
    */
    function setWallet__dd(
        address _owner,
        uint256 _perc
    ) external virtual onlyOperator {
        _dd = _owner;
        _ddPerc = _perc;
    }

    /**
    @dev set ee's wallet and fraction.withdraw to this wallet.only operator.
    */
    function setWallet__ee(
        address _owner,
        uint256 _perc
    ) external virtual onlyOperator {
        _ee = _owner;
        _eePerc = _perc;
    }

    /**
    @dev set ff's wallet and fraction.withdraw to this wallet.only operator.
    */
    function setWallet__ff(
        address _owner,
        uint256 _perc
    ) external virtual onlyOperator {
        _ff = _owner;
        _ffPerc = _perc;
    }

    /**
    @dev set withdraw's wallet.withdraw to this wallet.only operator.
    */
    function setWallet__ww(address _owner) external virtual onlyOperator {
        _withdrawWallet = _owner;
    }

    /** @dev widraw ETH from this contract.only operator. */
    function withdraw() external payable virtual onlyOperator nonReentrant {
        require(
            (_aa != address(0) && _aaPerc != 0) || _aa == address(0),
            "please set withdraw Address_aa and percentage."
        );
        require(
            (_bb != address(0) && _bbPerc != 0) || _bb == address(0),
            "please set withdraw Address_bb and percentage."
        );
        require(
            (_cc != address(0) && _ccPerc != 0) || _cc == address(0),
            "please set withdraw Address_cc and percentage."
        );
        require(
            (_dd != address(0) && _ddPerc != 0) || _dd == address(0),
            "please set withdraw Address_dd and percentage."
        );
        require(
            (_ee != address(0) && _eePerc != 0) || _ee == address(0),
            "please set withdraw Address_ee and percentage."
        );
        require(
            (_ff != address(0) && _ffPerc != 0) || _ff == address(0),
            "please set withdraw Address_ff and percentage."
        );
        uint256 _ethBalance = address(this).balance;
        bool os;
        if (_aa != address(0)) {
            //if _aa has.
            (os, ) = payable(_aa).call{
                value: ((_ethBalance * _aaPerc) / 10000)
            }("");
            require(os, "Failed to withdraw_aa Ether");
        }
        if (_bb != address(0)) {
            //if _bb has.
            (os, ) = payable(_bb).call{
                value: ((_ethBalance * _bbPerc) / 10000)
            }("");
            require(os, "Failed to withdraw_bb Ether");
        }
        if (_cc != address(0)) {
            //if _cc has.
            (os, ) = payable(_cc).call{
                value: ((_ethBalance * _ccPerc) / 10000)
            }("");
            require(os, "Failed to withdraw_cc Ether");
        }
        if (_dd != address(0)) {
            //if _dd has.
            (os, ) = payable(_dd).call{
                value: ((_ethBalance * _ddPerc) / 10000)
            }("");
            require(os, "Failed to withdraw_dd Ether");
        }
        if (_ee != address(0)) {
            //if _ee has.
            (os, ) = payable(_ee).call{
                value: ((_ethBalance * _eePerc) / 10000)
            }("");
            require(os, "Failed to withdraw_ee Ether");
        }
        if (_ff != address(0)) {
            //if _ff has.
            (os, ) = payable(_ff).call{
                value: ((_ethBalance * _ffPerc) / 10000)
            }("");
            require(os, "Failed to withdraw_ff Ether");
        }
        _ethBalance = address(this).balance;
        if (_withdrawWallet != address(0)) {
            //if _withdrawWallet has.
            (os, ) = payable(_withdrawWallet).call{value: (_ethBalance)}("");
        } else {
            (os, ) = payable(owner()).call{value: (_ethBalance)}("");
        }
        require(os, "Failed to withdraw Ether");
    }



  //set Default Royalty._feeNumerator 500 = 5% Royalty
  function setDefaultRoyalty(address _receiver, uint96 _feeNumerator) external virtual onlyOperator {
      _setDefaultRoyalty(_receiver, _feeNumerator);
  }
  //for ERC2981
  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, ERC2981) returns (bool) {
    return super.supportsInterface(interfaceId);
  }
  //for ERC2981 Opensea
  function contractURI() external view virtual returns (string memory) {
        return _formatContractURI();
  }
  //make contractURI
  function _formatContractURI() internal view returns (string memory) {
    (address receiver, uint256 royaltyFraction) = royaltyInfo(0,_feeDenominator());//tokenid=0
    return string(
      abi.encodePacked(
        "data:application/json;base64,",
        Base64.encode(
          bytes(
            abi.encodePacked(
                '{"seller_fee_basis_points":', Strings.toString(royaltyFraction),
                ', "fee_recipient":"', Strings.toHexString(uint256(uint160(receiver)), 20), '"}'
            )
          )
        )
      )
    );
  }

    //OPENSEA.OPERATORFilterer.START
    /**
     * @notice Set the state of the OpenSea operator filter
     * @param value Flag indicating if the operator filter should be applied to transfers and approvals
     */
    function setOperatorFilteringEnabled(bool value) external onlyOperator {
        operatorFilteringEnabled = value;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, uint256 amount, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    //OPENSEA.OPERATORFilterer.END
    /**
        @dev Operable.Role.ADD
     */
    function grantOperatorRole(address _candidate) external onlyOwner {
        _grantOperatorRole(_candidate);
    }
    /**
        @dev Operable.Role.REMOVE
     */
    function revokeOperatorRole(address _candidate) external onlyOwner {
        _revokeOperatorRole(_candidate);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":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"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"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":"list","type":"address[]"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"batchMintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"grantOperatorRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"initializeNFT","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"isMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"receiveToDeb","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"revokeOperatorRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"tokenId","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":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__aa","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__bb","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__cc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__dd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__ee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__ff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setWallet__ww","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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60a06040525f608090815260039062000019908262000d9b565b506008805460ff1916600117905560408051808201909152600b81526a4b494d494e4f5453554b4960a81b6020820152601c9062000058908262000d9b565b5060408051808201909152600381526212d39560ea1b6020820152601d9062000082908262000d9b565b503480156200008f575f80fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb6600160405180602001604052805f815250620000c7816200031c60201b60201c565b50620000d3336200032e565b60016007556daaeb6d7670e522a718067333cd4e3b15620002135780156200016657604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b5f604051808303815f87803b15801562000149575f80fd5b505af11580156200015c573d5f803e3d5ffd5b5050505062000213565b6001600160a01b03821615620001b75760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000131565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e486906024015f604051808303815f87803b158015620001fb575f80fd5b505af11580156200020e573d5f803e3d5ffd5b505050505b50620002219050336200037f565b6200022d335f62000421565b62000251604051806060016040528060408152602001620050856040913962000522565b620002815f6040518060400160405280600681526020016518173539b7b760d11b8152506200053060201b60201c565b600e80546001600160a01b031990811673bc0f9d48be2da5a6942e31390a248f8ba329acc417909155600f80548216732cf4515427cbd653a47a12b0066ac73a320f55ea179055610682601581905560108054831673684b894aed5692029132c900ba741729a311fe3d17905560168190556011805490921673637d25d0769f747b2742a04d249802da8539597017909155601755620011bb565b60026200032a828262000d9b565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0381165f9081526006602052604090205460ff1615620003b2335b6001600160a01b03166014620005d1565b604051602001620003c4919062000e87565b60405160208183030381529060405290620003fd5760405162461bcd60e51b8152600401620003f4919062000f0c565b60405180910390fd5b506001600160a01b03165f908152600660205260409020805460ff19166001179055565b6127106001600160601b0382161115620004915760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620003f4565b6001600160a01b038216620004e95760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620003f4565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600955565b60036200032a828262000d9b565b6200053b336200078d565b6200054682620007f5565b51156200058b5760405162461bcd60e51b81526020600482015260126024820152714e465420616c72656164792065786973747360701b6044820152606401620003f4565b620005ae3383600160405180602001604052805f815250620008df60201b60201c565b5f828152600b60205260409020661550f7dca7000090556200032a8282620009f8565b60605f620005e183600262000f34565b620005ee90600262000f4e565b6001600160401b0381111562000608576200060862000cff565b6040519080825280601f01601f19166020018201604052801562000633576020820181803683370190505b509050600360fc1b815f8151811062000650576200065062000f64565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811062000681576200068162000f64565b60200101906001600160f81b03191690815f1a9053505f620006a584600262000f34565b620006b290600162000f4e565b90505b600181111562000733576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620006ea57620006ea62000f64565b1a60f81b82828151811062000703576200070362000f64565b60200101906001600160f81b03191690815f1a90535060049490941c936200072b8162000f78565b9050620006b5565b508315620007845760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620003f4565b90505b92915050565b6001600160a01b0381165f9081526006602052604090205460ff16620007b333620003a1565b604051602001620007c5919062000f90565b604051602081830303815290604052906200032a5760405162461bcd60e51b8152600401620003f4919062000f0c565b5f81815260046020526040812080546060929190620008149062000d13565b80601f0160208091040260200160405190810160405280929190818152602001828054620008429062000d13565b8015620008915780601f10620008675761010080835404028352916020019162000891565b820191905f5260205f20905b8154815290600101906020018083116200087357829003601f168201915b505050505090505f815111620008b257620008ac8362000a5a565b620008d8565b600381604051602001620008c892919062000fe8565b6040516020818303038152906040525b9392505050565b6001600160a01b038416620009415760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401620003f4565b335f6200094e8562000af4565b90505f6200095c8562000af4565b90505f868152602081815260408083206001600160a01b038b168452909152812080548792906200098f90849062000f4e565b909155505060408051878152602081018790526001600160a01b03808a16925f92918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4620009ef835f8989898962000b48565b50505050505050565b5f82815260046020526040902062000a11828262000d9b565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b62000a3f82620007f5565b60405162000a4e919062000f0c565b60405180910390a25050565b60606002805462000a6b9062000d13565b80601f016020809104026020016040519081016040528092919081815260200182805462000a999062000d13565b801562000ae85780601f1062000abe5761010080835404028352916020019162000ae8565b820191905f5260205f20905b81548152906001019060200180831162000aca57829003601f168201915b50505050509050919050565b6040805160018082528183019092526060915f91906020808301908036833701905050905082815f8151811062000b2f5762000b2f62000f64565b602090810291909101015292915050565b505050505050565b6001600160a01b0384163b1562000b405760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619062000b8f908990899088908890889060040162001075565b6020604051808303815f875af192505050801562000bcc575060408051601f3d908101601f1916820190925262000bc991810190620010bb565b60015b62000c8c5762000bdb620010e4565b806308c379a00362000c1b575062000bf26200112d565b8062000bff575062000c1d565b8060405162461bcd60e51b8152600401620003f4919062000f0c565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401620003f4565b6001600160e01b0319811663f23a6e6160e01b14620009ef5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401620003f4565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168062000d2857607f821691505b60208210810362000d4757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000d96575f81815260208120601f850160051c8101602086101562000d755750805b601f850160051c820191505b8181101562000b405782815560010162000d81565b505050565b81516001600160401b0381111562000db75762000db762000cff565b62000dcf8162000dc8845462000d13565b8462000d4d565b602080601f83116001811462000e05575f841562000ded5750858301515b5f19600386901b1c1916600185901b17855562000b40565b5f85815260208120601f198616915b8281101562000e355788860151825594840194600190910190840162000e14565b508582101562000e5357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f5b8381101562000e7f57818101518382015260200162000e65565b50505f910152565b67030b1b1b7bab73a160c51b81525f825162000eab81600885016020870162000e63565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b5f815180845262000ef881602086016020860162000e63565b601f01601f19169290920160200192915050565b602081525f620008d8602083018462000edf565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141762000787576200078762000f20565b8082018082111562000787576200078762000f20565b634e487b7160e01b5f52603260045260245ffd5b5f8162000f895762000f8962000f20565b505f190190565b67030b1b1b7bab73a160c51b81525f825162000fb481600885016020870162000e63565b7f206973206e6f7420616e206f70657261746f72000000000000000000000000006008939091019283015250601b01919050565b5f80845462000ff78162000d13565b60018281168015620010125760018114620010285762001056565b60ff198416875282151583028701945062001056565b885f526020805f205f5b858110156200104d5781548a82015290840190820162001032565b50505082870194505b5050505083516200106c81836020880162000e63565b01949350505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f90620010b09083018462000edf565b979650505050505050565b5f60208284031215620010cc575f80fd5b81516001600160e01b03198116811462000784575f80fd5b5f60033d1115620010fb5760045f803e505f5160e01c5b90565b601f8201601f191681016001600160401b038111828210171562001126576200112662000cff565b6040525050565b5f60443d10156200113b5790565b6040516003193d81016004833e81513d6001600160401b0380831160248401831017156200116b57505050505090565b8285019150815181811115620011845750505050505090565b843d87010160208285010111156200119f5750505050505090565b620011b060208286010187620010fe565b509095945050505050565b613ebc80620011c95f395ff3fe608060405260043610610269575f3560e01c8063715018a61161014a578063a23baab0116100be578063e8a3d48511610078578063e8a3d485146107a2578063e985e9c5146107b6578063f242432a146107fd578063f2fde38b1461081c578063f7d975771461083b578063fb796e6c1461085a575f80fd5b8063a23baab0146106ba578063b219f7d7146106fb578063b7c0b8e81461071a578063bd85b03914610739578063c71c785914610758578063e6a72acf14610777575f80fd5b806395d89b411161010f57806395d89b4114610607578063962c167b1461061b57806398d2af031461063a5780639d7f4ebf146106685780639da9778c14610693578063a22cb4651461069b575f80fd5b8063715018a614610579578063872a28031461058d5780638bec5040146105ac5780638da5cb5b146105cb5780639324b42a146105e8575f80fd5b806327d22615116101e15780633ccfd60b116101a65780633ccfd60b1461049757806341f434341461049f5780634e1273f4146104d857806355f804b3146105045780635822768b146105235780636d70f7ae14610542575f80fd5b806327d22615146103dd5780632a55205a146103fc5780632cda91031461043a5780632eb2c2d614610459578063388b9fe014610478575f80fd5b80630e89341c116102325780630e89341c1461032f578063162094c41461034e57806319d580a81461036d5780631b2ef1ca1461038c578063235dfa501461039f57806327ac0c58146103be575f80fd5b8062fdd58e1461026d57806301ffc9a71461029f57806304634d8d146102ce57806306fdde03146102ef5780630b8cb10314610310575b5f80fd5b348015610278575f80fd5b5061028c61028736600461314d565b610873565b6040519081526020015b60405180910390f35b3480156102aa575f80fd5b506102be6102b936600461318a565b61090a565b6040519015158152602001610296565b3480156102d9575f80fd5b506102ed6102e83660046131a5565b610914565b005b3480156102fa575f80fd5b5061030361092b565b6040516102969190613232565b34801561031b575f80fd5b506102ed61032a366004613244565b6109b7565b34801561033a575f80fd5b5061030361034936600461325d565b6109e2565b348015610359575f80fd5b506102ed610368366004613323565b610abe565b348015610378575f80fd5b506102ed61038736600461314d565b610ad1565b6102ed61039a366004613366565b610b00565b3480156103aa575f80fd5b506102ed6103b936600461314d565b610c76565b3480156103c9575f80fd5b506102ed6103d8366004613244565b610ca5565b3480156103e8575f80fd5b506102ed6103f736600461314d565b610cb9565b348015610407575f80fd5b5061041b610416366004613366565b610ce8565b604080516001600160a01b039093168352602083019190915201610296565b348015610445575f80fd5b506102ed610454366004613323565b610d92565b348015610464575f80fd5b506102ed610473366004613416565b610e23565b348015610483575f80fd5b506102ed6104923660046134b8565b610f10565b6102ed610f82565b3480156104aa575f80fd5b506104c06daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b039091168152602001610296565b3480156104e3575f80fd5b506104f76104f2366004613552565b6118e9565b60405161029691906135e0565b34801561050f575f80fd5b506102ed61051e3660046135f2565b611a10565b34801561052e575f80fd5b506102ed61053d36600461314d565b611a22565b34801561054d575f80fd5b506102be61055c366004613244565b6001600160a01b03165f9081526006602052604090205460ff1690565b348015610584575f80fd5b506102ed611a51565b348015610598575f80fd5b506102ed6105a736600461362b565b611a62565b3480156105b7575f80fd5b506102ed6105c636600461314d565b611ada565b3480156105d6575f80fd5b506005546001600160a01b03166104c0565b3480156105f3575f80fd5b506102ed6106023660046134b8565b611b09565b348015610612575f80fd5b50610303611b1d565b348015610626575f80fd5b506102ed61063536600461314d565b611b2a565b348015610645575f80fd5b506102be61065436600461325d565b601b6020525f908152604090205460ff1681565b348015610673575f80fd5b5061028c61068236600461325d565b600c6020525f908152604090205481565b6102ed611b59565b3480156106a6575f80fd5b506102ed6106b536600461369f565b611bbe565b3480156106c5575f80fd5b5061028c6106d43660046136c9565b5f918252600d602090815260408084206001600160a01b0393909316845291905290205490565b348015610706575f80fd5b506102ed610715366004613244565b611c9b565b348015610725575f80fd5b506102ed6107343660046136f3565b611cac565b348015610744575f80fd5b5061028c61075336600461325d565b611cc8565b348015610763575f80fd5b506102ed61077236600461370e565b611cd9565b348015610782575f80fd5b5061028c61079136600461325d565b600b6020525f908152604090205481565b3480156107ad575f80fd5b50610303611d01565b3480156107c1575f80fd5b506102be6107d0366004613731565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205460ff1690565b348015610808575f80fd5b506102ed610817366004613759565b611d10565b348015610827575f80fd5b506102ed610836366004613244565b611df0565b348015610846575f80fd5b506102ed610855366004613366565b611e66565b348015610865575f80fd5b506008546102be9060ff1681565b5f6001600160a01b0383166108e25760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b505f818152602081815260408083206001600160a01b03861684529091529020545b92915050565b5f61090482611e80565b61091d33611ea4565b6109278282611f11565b5050565b601c8054610938906137b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610964906137b8565b80156109af5780601f10610986576101008083540402835291602001916109af565b820191905f5260205f20905b81548152906001019060200180831161099257829003601f168201915b505050505081565b6109c033611ea4565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b5f818152600460205260408120805460609291906109ff906137b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2b906137b8565b8015610a765780601f10610a4d57610100808354040283529160200191610a76565b820191905f5260205f20905b815481529060010190602001808311610a5957829003601f168201915b505050505090505f815111610a9357610a8e8361200e565b610ab7565b600381604051602001610aa79291906137f0565b6040516020818303038152906040525b9392505050565b610ac733611ea4565b61092782826120a0565b610ada33611ea4565b601180546001600160a01b0319166001600160a01b039390931692909217909155601755565b610b086120fc565b610b11826109e2565b515f03610b525760405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b9a5d1a585b1a5e9959608a1b60448201526064016108d9565b5f828152601b602052604090205460ff16610ba05760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d081a5cc814185d5cd95960921b60448201526064016108d9565b5f828152600b6020526040902054610bb9908290613887565b3414610c025760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b60448201526064016108d9565b610c1c33838360405180602001604052805f815250612155565b5f828152600d602090815260408083203384529091528120805460019290610c4590849061389e565b90915550505f828152600c60205260408120805460019290610c6890849061389e565b909155505060016007555050565b610c7f33611ea4565b601380546001600160a01b0319166001600160a01b039390931692909217909155601955565b610cad612264565b610cb6816122be565b50565b610cc233611ea4565b601080546001600160a01b0319166001600160a01b039390931692909217909155601655565b5f828152600a602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610d5c5750604080518082019091526009546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f9061271090610d7a906001600160601b031687613887565b610d8491906138b1565b915196919550909350505050565b610d9b33611ea4565b610da4826109e2565b5115610de75760405162461bcd60e51b81526020600482015260126024820152714e465420616c72656164792065786973747360701b60448201526064016108d9565b610e023383600160405180602001604052805f815250612155565b5f828152600b60205260409020661550f7dca70000905561092782826120a0565b846daaeb6d7670e522a718067333cd4e3b15801590610e44575060085460ff165b15610efb57336001600160a01b03821603610e6b57610e668686868686612344565b610f08565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610eb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edc91906138d0565b610efb57604051633b79c77360e21b81523360048201526024016108d9565b610f088686868686612344565b505050505050565b610f1933611ea4565b610f22826109e2565b515f03610f635760405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b9a5d1a585b1a5e9959608a1b60448201526064016108d9565b610f7d83838360405180602001604052805f815250612155565b505050565b610f8b33611ea4565b610f936120fc565b600f546001600160a01b031615801590610fae575060155415155b80610fc25750600f546001600160a01b0316155b6110255760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6161206160448201526d3732103832b931b2b73a30b3b29760911b60648201526084016108d9565b6010546001600160a01b031615801590611040575060165415155b8061105457506010546001600160a01b0316155b6110b75760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6262206160448201526d3732103832b931b2b73a30b3b29760911b60648201526084016108d9565b6011546001600160a01b0316158015906110d2575060175415155b806110e657506011546001600160a01b0316155b6111495760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6363206160448201526d3732103832b931b2b73a30b3b29760911b60648201526084016108d9565b6012546001600160a01b031615801590611164575060185415155b8061117857506012546001600160a01b0316155b6111db5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6464206160448201526d3732103832b931b2b73a30b3b29760911b60648201526084016108d9565b6013546001600160a01b0316158015906111f6575060195415155b8061120a57506013546001600160a01b0316155b61126d5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6565206160448201526d3732103832b931b2b73a30b3b29760911b60648201526084016108d9565b6014546001600160a01b0316158015906112885750601a5415155b8061129c57506014546001600160a01b0316155b6112ff5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6666206160448201526d3732103832b931b2b73a30b3b29760911b60648201526084016108d9565b600f5447905f906001600160a01b0316156113cf57600f546015546001600160a01b0390911690612710906113349085613887565b61133e91906138b1565b6040515f81818185875af1925050503d805f8114611377576040519150601f19603f3d011682016040523d82523d5f602084013e61137c565b606091505b505080915050806113cf5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f6161204574686572000000000060448201526064016108d9565b6010546001600160a01b03161561149b576010546016546001600160a01b0390911690612710906114009085613887565b61140a91906138b1565b6040515f81818185875af1925050503d805f8114611443576040519150601f19603f3d011682016040523d82523d5f602084013e611448565b606091505b5050809150508061149b5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f6262204574686572000000000060448201526064016108d9565b6011546001600160a01b031615611567576011546017546001600160a01b0390911690612710906114cc9085613887565b6114d691906138b1565b6040515f81818185875af1925050503d805f811461150f576040519150601f19603f3d011682016040523d82523d5f602084013e611514565b606091505b505080915050806115675760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f6363204574686572000000000060448201526064016108d9565b6012546001600160a01b031615611633576012546018546001600160a01b0390911690612710906115989085613887565b6115a291906138b1565b6040515f81818185875af1925050503d805f81146115db576040519150601f19603f3d011682016040523d82523d5f602084013e6115e0565b606091505b505080915050806116335760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f6464204574686572000000000060448201526064016108d9565b6013546001600160a01b0316156116ff576013546019546001600160a01b0390911690612710906116649085613887565b61166e91906138b1565b6040515f81818185875af1925050503d805f81146116a7576040519150601f19603f3d011682016040523d82523d5f602084013e6116ac565b606091505b505080915050806116ff5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f6565204574686572000000000060448201526064016108d9565b6014546001600160a01b0316156117cb57601454601a546001600160a01b0390911690612710906117309085613887565b61173a91906138b1565b6040515f81818185875af1925050503d805f8114611773576040519150601f19603f3d011682016040523d82523d5f602084013e611778565b606091505b505080915050806117cb5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f6666204574686572000000000060448201526064016108d9565b600e544792506001600160a01b03161561183957600e546040516001600160a01b039091169083905f81818185875af1925050503d805f8114611829576040519150601f19603f3d011682016040523d82523d5f602084013e61182e565b606091505b50508091505061188e565b6005546040516001600160a01b039091169083905f81818185875af1925050503d805f8114611883576040519150601f19603f3d011682016040523d82523d5f602084013e611888565b606091505b50909150505b806118db5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f207769746864726177204574686572000000000000000060448201526064016108d9565b50506118e76001600755565b565b6060815183511461194e5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016108d9565b5f83516001600160401b0381111561196857611968613274565b604051908082528060200260200182016040528015611991578160200160208202803683370190505b5090505f5b8451811015611a08576119db8582815181106119b4576119b46138eb565b60200260200101518583815181106119ce576119ce6138eb565b6020026020010151610873565b8282815181106119ed576119ed6138eb565b6020908102919091010152611a01816138ff565b9050611996565b509392505050565b611a1933611ea4565b610cb681612390565b611a2b33611ea4565b601280546001600160a01b0319166001600160a01b039390931692909217909155601855565b611a59612264565b6118e75f61239c565b611a6b33611ea4565b5f5b8351811015611ad457611ac2848281518110611a8b57611a8b6138eb565b602002602001015184848481518110611aa657611aa66138eb565b602002602001015160405180602001604052805f815250612155565b80611acc816138ff565b915050611a6d565b50505050565b611ae333611ea4565b600f80546001600160a01b0319166001600160a01b039390931692909217909155601555565b611b1233611ea4565b610f7d8383836123ed565b601d8054610938906137b8565b611b3333611ea4565b601480546001600160a01b0319166001600160a01b039390931692909217909155601a55565b611b6233611ea4565b611b6a6120fc565b5f3411611bb45760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b60448201526064016108d9565b6118e76001600755565b816daaeb6d7670e522a718067333cd4e3b15801590611bdf575060085460ff165b15611c8657604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611c3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c5e91906138d0565b611c8657604051633b79c77360e21b81526001600160a01b03821660048201526024016108d9565b611c908383612564565b610f7d33848461256b565b611ca3612264565b610cb68161264a565b611cb533611ea4565b6008805460ff1916911515919091179055565b5f611cd2826109e2565b5192915050565b611ce233611ea4565b5f918252601b6020526040909120805460ff1916911515919091179055565b6060611d0b612673565b905090565b846daaeb6d7670e522a718067333cd4e3b15801590611d31575060085460ff165b15611de357336001600160a01b03821603611d5357610e6686868686866126f2565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611da0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc491906138d0565b611de357604051633b79c77360e21b81523360048201526024016108d9565b610f0886868686866126f2565b611df8612264565b6001600160a01b038116611e5d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d9565b610cb68161239c565b611e6f33611ea4565b5f918252600b602052604090912055565b5f6001600160e01b0319821663152a902d60e11b1480610904575061090482612737565b6001600160a01b0381165f9081526006602052604090205460ff16611ed4335b6001600160a01b03166014612786565b604051602001611ee49190613917565b604051602081830303815290604052906109275760405162461bcd60e51b81526004016108d99190613232565b6127106001600160601b0382161115611f7f5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016108d9565b6001600160a01b038216611fd55760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016108d9565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600955565b60606002805461201d906137b8565b80601f0160208091040260200160405190810160405280929190818152602001828054612049906137b8565b80156120945780601f1061206b57610100808354040283529160200191612094565b820191905f5260205f20905b81548152906001019060200180831161207757829003601f168201915b50505050509050919050565b5f8281526004602052604090206120b782826139a8565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6120e3846109e2565b6040516120f09190613232565b60405180910390a25050565b60026007540361214e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108d9565b6002600755565b6001600160a01b0384166121b55760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016108d9565b335f6121c08561291b565b90505f6121cc8561291b565b90505f868152602081815260408083206001600160a01b038b168452909152812080548792906121fd90849061389e565b909155505060408051878152602081018790526001600160a01b03808a16925f92918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461225b835f89898989612964565b50505050505050565b6005546001600160a01b031633146118e75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108d9565b6001600160a01b0381165f9081526006602052604090205460ff16156122e333611ec4565b6040516020016122f39190613a63565b604051602081830303815290604052906123205760405162461bcd60e51b81526004016108d99190613232565b506001600160a01b03165f908152600660205260409020805460ff19166001179055565b6001600160a01b038516331480612360575061236085336107d0565b61237c5760405162461bcd60e51b81526004016108d990613ab9565b6123898585858585612abe565b5050505050565b600361092782826139a8565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b03831661244f5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016108d9565b335f61245a8461291b565b90505f6124668461291b565b60408051602080820183525f918290528882528181528282206001600160a01b038b16835290522054909150848110156124ee5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016108d9565b5f868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091525f905261225b565b6109273383835b816001600160a01b0316836001600160a01b0316036125de5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016108d9565b6001600160a01b038381165f81815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61265381611ea4565b6001600160a01b03165f908152600660205260409020805460ff19169055565b60605f8061268381612710610ce8565b915091506126cc61269382612c8e565b6126a7846001600160a01b03166014612786565b6040516020016126b8929190613b07565b604051602081830303815290604052612d1d565b6040516020016126dc9190613b8c565b6040516020818303038152906040529250505090565b6001600160a01b03851633148061270e575061270e85336107d0565b61272a5760405162461bcd60e51b81526004016108d990613ab9565b6123898585858585612e7b565b5f6001600160e01b03198216636cdb3d1360e11b148061276757506001600160e01b031982166303a24d0760e21b145b8061090457506301ffc9a760e01b6001600160e01b0319831614610904565b60605f612794836002613887565b61279f90600261389e565b6001600160401b038111156127b6576127b6613274565b6040519080825280601f01601f1916602001820160405280156127e0576020820181803683370190505b509050600360fc1b815f815181106127fa576127fa6138eb565b60200101906001600160f81b03191690815f1a905350600f60fb1b81600181518110612828576128286138eb565b60200101906001600160f81b03191690815f1a9053505f61284a846002613887565b61285590600161389e565b90505b60018111156128cc576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612889576128896138eb565b1a60f81b82828151811061289f5761289f6138eb565b60200101906001600160f81b03191690815f1a90535060049490941c936128c581613bd0565b9050612858565b508315610ab75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108d9565b6040805160018082528183019092526060915f91906020808301908036833701905050905082815f81518110612953576129536138eb565b602090810291909101015292915050565b6001600160a01b0384163b15610f085760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906129a89089908990889088908890600401613be5565b6020604051808303815f875af19250505080156129e2575060408051601f3d908101601f191682019092526129df91810190613c29565b60015b612a8e576129ee613c44565b806308c379a003612a275750612a02613c5d565b80612a0d5750612a29565b8060405162461bcd60e51b81526004016108d99190613232565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016108d9565b6001600160e01b0319811663f23a6e6160e01b1461225b5760405162461bcd60e51b81526004016108d990613ce5565b8151835114612b205760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016108d9565b6001600160a01b038416612b465760405162461bcd60e51b81526004016108d990613d2d565b335f5b8451811015612c28575f858281518110612b6557612b656138eb565b602002602001015190505f858381518110612b8257612b826138eb565b6020908102919091018101515f84815280835260408082206001600160a01b038e168352909352919091205490915081811015612bd15760405162461bcd60e51b81526004016108d990613d72565b5f838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612c0d90849061389e565b9250508190555050505080612c21906138ff565b9050612b49565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612c78929190613dbc565b60405180910390a4610f08818787878787612fa1565b60605f612c9a8361305b565b60010190505f816001600160401b03811115612cb857612cb8613274565b6040519080825280601f01601f191660200182016040528015612ce2576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612cec57509392505050565b606081515f03612d3a57505060408051602081019091525f815290565b5f604051806060016040528060408152602001613e476040913990505f600384516002612d67919061389e565b612d7191906138b1565b612d7c906004613887565b90505f612d8a82602061389e565b6001600160401b03811115612da157612da1613274565b6040519080825280601f01601f191660200182016040528015612dcb576020820181803683370190505b509050818152600183018586518101602084015b81831015612e37576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101612ddf565b600389510660018114612e515760028114612e6257612e6d565b613d3d60f01b600119830152612e6d565b603d60f81b5f198301525b509398975050505050505050565b6001600160a01b038416612ea15760405162461bcd60e51b81526004016108d990613d2d565b335f612eac8561291b565b90505f612eb88561291b565b90505f868152602081815260408083206001600160a01b038c16845290915290205485811015612efa5760405162461bcd60e51b81526004016108d990613d72565b5f878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612f3690849061389e565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612f96848a8a8a8a8a612964565b505050505050505050565b6001600160a01b0384163b15610f085760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612fe59089908990889088908890600401613de9565b6020604051808303815f875af192505050801561301f575060408051601f3d908101601f1916820190925261301c91810190613c29565b60015b61302b576129ee613c44565b6001600160e01b0319811663bc197c8160e01b1461225b5760405162461bcd60e51b81526004016108d990613ce5565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106130995772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106130c5576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106130e357662386f26fc10000830492506010015b6305f5e10083106130fb576305f5e100830492506008015b612710831061310f57612710830492506004015b60648310613121576064830492506002015b600a83106109045760010192915050565b80356001600160a01b0381168114613148575f80fd5b919050565b5f806040838503121561315e575f80fd5b61316783613132565b946020939093013593505050565b6001600160e01b031981168114610cb6575f80fd5b5f6020828403121561319a575f80fd5b8135610ab781613175565b5f80604083850312156131b6575f80fd5b6131bf83613132565b915060208301356001600160601b03811681146131da575f80fd5b809150509250929050565b5f5b838110156131ff5781810151838201526020016131e7565b50505f910152565b5f815180845261321e8160208601602086016131e5565b601f01601f19169290920160200192915050565b602081525f610ab76020830184613207565b5f60208284031215613254575f80fd5b610ab782613132565b5f6020828403121561326d575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b601f8201601f191681016001600160401b03811182821017156132ad576132ad613274565b6040525050565b5f82601f8301126132c3575f80fd5b81356001600160401b038111156132dc576132dc613274565b6040516132f3601f8301601f191660200182613288565b818152846020838601011115613307575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215613334575f80fd5b8235915060208301356001600160401b03811115613350575f80fd5b61335c858286016132b4565b9150509250929050565b5f8060408385031215613377575f80fd5b50508035926020909101359150565b5f6001600160401b0382111561339e5761339e613274565b5060051b60200190565b5f82601f8301126133b7575f80fd5b813560206133c482613386565b6040516133d18282613288565b83815260059390931b85018201928281019150868411156133f0575f80fd5b8286015b8481101561340b57803583529183019183016133f4565b509695505050505050565b5f805f805f60a0868803121561342a575f80fd5b61343386613132565b945061344160208701613132565b935060408601356001600160401b038082111561345c575f80fd5b61346889838a016133a8565b9450606088013591508082111561347d575f80fd5b61348989838a016133a8565b9350608088013591508082111561349e575f80fd5b506134ab888289016132b4565b9150509295509295909350565b5f805f606084860312156134ca575f80fd5b6134d384613132565b95602085013595506040909401359392505050565b5f82601f8301126134f7575f80fd5b8135602061350482613386565b6040516135118282613288565b83815260059390931b8501820192828101915086841115613530575f80fd5b8286015b8481101561340b5761354581613132565b8352918301918301613534565b5f8060408385031215613563575f80fd5b82356001600160401b0380821115613579575f80fd5b613585868387016134e8565b9350602085013591508082111561359a575f80fd5b5061335c858286016133a8565b5f8151808452602080850194508084015f5b838110156135d5578151875295820195908201906001016135b9565b509495945050505050565b602081525f610ab760208301846135a7565b5f60208284031215613602575f80fd5b81356001600160401b03811115613617575f80fd5b613623848285016132b4565b949350505050565b5f805f6060848603121561363d575f80fd5b83356001600160401b0380821115613653575f80fd5b61365f878388016134e8565b945060208601359350604086013591508082111561367b575f80fd5b50613688868287016133a8565b9150509250925092565b8015158114610cb6575f80fd5b5f80604083850312156136b0575f80fd5b6136b983613132565b915060208301356131da81613692565b5f80604083850312156136da575f80fd5b823591506136ea60208401613132565b90509250929050565b5f60208284031215613703575f80fd5b8135610ab781613692565b5f806040838503121561371f575f80fd5b8235915060208301356131da81613692565b5f8060408385031215613742575f80fd5b61374b83613132565b91506136ea60208401613132565b5f805f805f60a0868803121561376d575f80fd5b61377686613132565b945061378460208701613132565b9350604086013592506060860135915060808601356001600160401b038111156137ac575f80fd5b6134ab888289016132b4565b600181811c908216806137cc57607f821691505b6020821081036137ea57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f8084546137fd816137b8565b60018281168015613815576001811461382a57613856565b60ff1984168752821515830287019450613856565b885f526020805f205f5b8581101561384d5781548a820152908401908201613834565b50505082870194505b50505050835161386a8183602088016131e5565b01949350505050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761090457610904613873565b8082018082111561090457610904613873565b5f826138cb57634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156138e0575f80fd5b8151610ab781613692565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161391057613910613873565b5060010190565b67030b1b1b7bab73a160c51b81525f82516139398160088501602087016131e5565b721034b9903737ba1030b71037b832b930ba37b960691b6008939091019283015250601b01919050565b601f821115610f7d575f81815260208120601f850160051c810160208610156139895750805b601f850160051c820191505b81811015610f0857828155600101613995565b81516001600160401b038111156139c1576139c1613274565b6139d5816139cf84546137b8565b84613963565b602080601f831160018114613a08575f84156139f15750858301515b5f19600386901b1c1916600185901b178555610f08565b5f85815260208120601f198616915b82811015613a3657888601518255948401946001909101908401613a17565b5085821015613a5357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b67030b1b1b7bab73a160c51b81525f8251613a858160088501602087016131e5565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a000000000081525f8351613b3e81601b8501602088016131e5565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b918401918201528351613b7181602e8401602088016131e5565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f8251613bc381601d8501602087016131e5565b91909101601d0192915050565b5f81613bde57613bde613873565b505f190190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f90613c1e90830184613207565b979650505050505050565b5f60208284031215613c39575f80fd5b8151610ab781613175565b5f60033d1115613c5a5760045f803e505f5160e01c5b90565b5f60443d1015613c6a5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613c9957505050505090565b8285019150815181811115613cb15750505050505090565b843d8701016020828501011115613ccb5750505050505090565b613cda60208286010187613288565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081525f613dce60408301856135a7565b8281036020840152613de081856135a7565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190525f90613e14908301866135a7565b8281036060840152613e2681866135a7565b90508281036080840152613e3a8185613207565b9897505050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c403ed69b558a876595eb1d3ba68bc258e5c1d0c67a5f5396133854193459cc264736f6c6343000815003368747470733a2f2f617277656176652e6e65742f624d4666776c7431663778763271626330447962354c5a6e4b6e4b4c684f665156787a6d6b705a6b4545772f

Deployed Bytecode

0x608060405260043610610269575f3560e01c8063715018a61161014a578063a23baab0116100be578063e8a3d48511610078578063e8a3d485146107a2578063e985e9c5146107b6578063f242432a146107fd578063f2fde38b1461081c578063f7d975771461083b578063fb796e6c1461085a575f80fd5b8063a23baab0146106ba578063b219f7d7146106fb578063b7c0b8e81461071a578063bd85b03914610739578063c71c785914610758578063e6a72acf14610777575f80fd5b806395d89b411161010f57806395d89b4114610607578063962c167b1461061b57806398d2af031461063a5780639d7f4ebf146106685780639da9778c14610693578063a22cb4651461069b575f80fd5b8063715018a614610579578063872a28031461058d5780638bec5040146105ac5780638da5cb5b146105cb5780639324b42a146105e8575f80fd5b806327d22615116101e15780633ccfd60b116101a65780633ccfd60b1461049757806341f434341461049f5780634e1273f4146104d857806355f804b3146105045780635822768b146105235780636d70f7ae14610542575f80fd5b806327d22615146103dd5780632a55205a146103fc5780632cda91031461043a5780632eb2c2d614610459578063388b9fe014610478575f80fd5b80630e89341c116102325780630e89341c1461032f578063162094c41461034e57806319d580a81461036d5780631b2ef1ca1461038c578063235dfa501461039f57806327ac0c58146103be575f80fd5b8062fdd58e1461026d57806301ffc9a71461029f57806304634d8d146102ce57806306fdde03146102ef5780630b8cb10314610310575b5f80fd5b348015610278575f80fd5b5061028c61028736600461314d565b610873565b6040519081526020015b60405180910390f35b3480156102aa575f80fd5b506102be6102b936600461318a565b61090a565b6040519015158152602001610296565b3480156102d9575f80fd5b506102ed6102e83660046131a5565b610914565b005b3480156102fa575f80fd5b5061030361092b565b6040516102969190613232565b34801561031b575f80fd5b506102ed61032a366004613244565b6109b7565b34801561033a575f80fd5b5061030361034936600461325d565b6109e2565b348015610359575f80fd5b506102ed610368366004613323565b610abe565b348015610378575f80fd5b506102ed61038736600461314d565b610ad1565b6102ed61039a366004613366565b610b00565b3480156103aa575f80fd5b506102ed6103b936600461314d565b610c76565b3480156103c9575f80fd5b506102ed6103d8366004613244565b610ca5565b3480156103e8575f80fd5b506102ed6103f736600461314d565b610cb9565b348015610407575f80fd5b5061041b610416366004613366565b610ce8565b604080516001600160a01b039093168352602083019190915201610296565b348015610445575f80fd5b506102ed610454366004613323565b610d92565b348015610464575f80fd5b506102ed610473366004613416565b610e23565b348015610483575f80fd5b506102ed6104923660046134b8565b610f10565b6102ed610f82565b3480156104aa575f80fd5b506104c06daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b039091168152602001610296565b3480156104e3575f80fd5b506104f76104f2366004613552565b6118e9565b60405161029691906135e0565b34801561050f575f80fd5b506102ed61051e3660046135f2565b611a10565b34801561052e575f80fd5b506102ed61053d36600461314d565b611a22565b34801561054d575f80fd5b506102be61055c366004613244565b6001600160a01b03165f9081526006602052604090205460ff1690565b348015610584575f80fd5b506102ed611a51565b348015610598575f80fd5b506102ed6105a736600461362b565b611a62565b3480156105b7575f80fd5b506102ed6105c636600461314d565b611ada565b3480156105d6575f80fd5b506005546001600160a01b03166104c0565b3480156105f3575f80fd5b506102ed6106023660046134b8565b611b09565b348015610612575f80fd5b50610303611b1d565b348015610626575f80fd5b506102ed61063536600461314d565b611b2a565b348015610645575f80fd5b506102be61065436600461325d565b601b6020525f908152604090205460ff1681565b348015610673575f80fd5b5061028c61068236600461325d565b600c6020525f908152604090205481565b6102ed611b59565b3480156106a6575f80fd5b506102ed6106b536600461369f565b611bbe565b3480156106c5575f80fd5b5061028c6106d43660046136c9565b5f918252600d602090815260408084206001600160a01b0393909316845291905290205490565b348015610706575f80fd5b506102ed610715366004613244565b611c9b565b348015610725575f80fd5b506102ed6107343660046136f3565b611cac565b348015610744575f80fd5b5061028c61075336600461325d565b611cc8565b348015610763575f80fd5b506102ed61077236600461370e565b611cd9565b348015610782575f80fd5b5061028c61079136600461325d565b600b6020525f908152604090205481565b3480156107ad575f80fd5b50610303611d01565b3480156107c1575f80fd5b506102be6107d0366004613731565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205460ff1690565b348015610808575f80fd5b506102ed610817366004613759565b611d10565b348015610827575f80fd5b506102ed610836366004613244565b611df0565b348015610846575f80fd5b506102ed610855366004613366565b611e66565b348015610865575f80fd5b506008546102be9060ff1681565b5f6001600160a01b0383166108e25760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b505f818152602081815260408083206001600160a01b03861684529091529020545b92915050565b5f61090482611e80565b61091d33611ea4565b6109278282611f11565b5050565b601c8054610938906137b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610964906137b8565b80156109af5780601f10610986576101008083540402835291602001916109af565b820191905f5260205f20905b81548152906001019060200180831161099257829003601f168201915b505050505081565b6109c033611ea4565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b5f818152600460205260408120805460609291906109ff906137b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2b906137b8565b8015610a765780601f10610a4d57610100808354040283529160200191610a76565b820191905f5260205f20905b815481529060010190602001808311610a5957829003601f168201915b505050505090505f815111610a9357610a8e8361200e565b610ab7565b600381604051602001610aa79291906137f0565b6040516020818303038152906040525b9392505050565b610ac733611ea4565b61092782826120a0565b610ada33611ea4565b601180546001600160a01b0319166001600160a01b039390931692909217909155601755565b610b086120fc565b610b11826109e2565b515f03610b525760405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b9a5d1a585b1a5e9959608a1b60448201526064016108d9565b5f828152601b602052604090205460ff16610ba05760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d081a5cc814185d5cd95960921b60448201526064016108d9565b5f828152600b6020526040902054610bb9908290613887565b3414610c025760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b60448201526064016108d9565b610c1c33838360405180602001604052805f815250612155565b5f828152600d602090815260408083203384529091528120805460019290610c4590849061389e565b90915550505f828152600c60205260408120805460019290610c6890849061389e565b909155505060016007555050565b610c7f33611ea4565b601380546001600160a01b0319166001600160a01b039390931692909217909155601955565b610cad612264565b610cb6816122be565b50565b610cc233611ea4565b601080546001600160a01b0319166001600160a01b039390931692909217909155601655565b5f828152600a602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610d5c5750604080518082019091526009546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f9061271090610d7a906001600160601b031687613887565b610d8491906138b1565b915196919550909350505050565b610d9b33611ea4565b610da4826109e2565b5115610de75760405162461bcd60e51b81526020600482015260126024820152714e465420616c72656164792065786973747360701b60448201526064016108d9565b610e023383600160405180602001604052805f815250612155565b5f828152600b60205260409020661550f7dca70000905561092782826120a0565b846daaeb6d7670e522a718067333cd4e3b15801590610e44575060085460ff165b15610efb57336001600160a01b03821603610e6b57610e668686868686612344565b610f08565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610eb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edc91906138d0565b610efb57604051633b79c77360e21b81523360048201526024016108d9565b610f088686868686612344565b505050505050565b610f1933611ea4565b610f22826109e2565b515f03610f635760405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b9a5d1a585b1a5e9959608a1b60448201526064016108d9565b610f7d83838360405180602001604052805f815250612155565b505050565b610f8b33611ea4565b610f936120fc565b600f546001600160a01b031615801590610fae575060155415155b80610fc25750600f546001600160a01b0316155b6110255760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6161206160448201526d3732103832b931b2b73a30b3b29760911b60648201526084016108d9565b6010546001600160a01b031615801590611040575060165415155b8061105457506010546001600160a01b0316155b6110b75760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6262206160448201526d3732103832b931b2b73a30b3b29760911b60648201526084016108d9565b6011546001600160a01b0316158015906110d2575060175415155b806110e657506011546001600160a01b0316155b6111495760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6363206160448201526d3732103832b931b2b73a30b3b29760911b60648201526084016108d9565b6012546001600160a01b031615801590611164575060185415155b8061117857506012546001600160a01b0316155b6111db5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6464206160448201526d3732103832b931b2b73a30b3b29760911b60648201526084016108d9565b6013546001600160a01b0316158015906111f6575060195415155b8061120a57506013546001600160a01b0316155b61126d5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6565206160448201526d3732103832b931b2b73a30b3b29760911b60648201526084016108d9565b6014546001600160a01b0316158015906112885750601a5415155b8061129c57506014546001600160a01b0316155b6112ff5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6666206160448201526d3732103832b931b2b73a30b3b29760911b60648201526084016108d9565b600f5447905f906001600160a01b0316156113cf57600f546015546001600160a01b0390911690612710906113349085613887565b61133e91906138b1565b6040515f81818185875af1925050503d805f8114611377576040519150601f19603f3d011682016040523d82523d5f602084013e61137c565b606091505b505080915050806113cf5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f6161204574686572000000000060448201526064016108d9565b6010546001600160a01b03161561149b576010546016546001600160a01b0390911690612710906114009085613887565b61140a91906138b1565b6040515f81818185875af1925050503d805f8114611443576040519150601f19603f3d011682016040523d82523d5f602084013e611448565b606091505b5050809150508061149b5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f6262204574686572000000000060448201526064016108d9565b6011546001600160a01b031615611567576011546017546001600160a01b0390911690612710906114cc9085613887565b6114d691906138b1565b6040515f81818185875af1925050503d805f811461150f576040519150601f19603f3d011682016040523d82523d5f602084013e611514565b606091505b505080915050806115675760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f6363204574686572000000000060448201526064016108d9565b6012546001600160a01b031615611633576012546018546001600160a01b0390911690612710906115989085613887565b6115a291906138b1565b6040515f81818185875af1925050503d805f81146115db576040519150601f19603f3d011682016040523d82523d5f602084013e6115e0565b606091505b505080915050806116335760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f6464204574686572000000000060448201526064016108d9565b6013546001600160a01b0316156116ff576013546019546001600160a01b0390911690612710906116649085613887565b61166e91906138b1565b6040515f81818185875af1925050503d805f81146116a7576040519150601f19603f3d011682016040523d82523d5f602084013e6116ac565b606091505b505080915050806116ff5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f6565204574686572000000000060448201526064016108d9565b6014546001600160a01b0316156117cb57601454601a546001600160a01b0390911690612710906117309085613887565b61173a91906138b1565b6040515f81818185875af1925050503d805f8114611773576040519150601f19603f3d011682016040523d82523d5f602084013e611778565b606091505b505080915050806117cb5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f6666204574686572000000000060448201526064016108d9565b600e544792506001600160a01b03161561183957600e546040516001600160a01b039091169083905f81818185875af1925050503d805f8114611829576040519150601f19603f3d011682016040523d82523d5f602084013e61182e565b606091505b50508091505061188e565b6005546040516001600160a01b039091169083905f81818185875af1925050503d805f8114611883576040519150601f19603f3d011682016040523d82523d5f602084013e611888565b606091505b50909150505b806118db5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f207769746864726177204574686572000000000000000060448201526064016108d9565b50506118e76001600755565b565b6060815183511461194e5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016108d9565b5f83516001600160401b0381111561196857611968613274565b604051908082528060200260200182016040528015611991578160200160208202803683370190505b5090505f5b8451811015611a08576119db8582815181106119b4576119b46138eb565b60200260200101518583815181106119ce576119ce6138eb565b6020026020010151610873565b8282815181106119ed576119ed6138eb565b6020908102919091010152611a01816138ff565b9050611996565b509392505050565b611a1933611ea4565b610cb681612390565b611a2b33611ea4565b601280546001600160a01b0319166001600160a01b039390931692909217909155601855565b611a59612264565b6118e75f61239c565b611a6b33611ea4565b5f5b8351811015611ad457611ac2848281518110611a8b57611a8b6138eb565b602002602001015184848481518110611aa657611aa66138eb565b602002602001015160405180602001604052805f815250612155565b80611acc816138ff565b915050611a6d565b50505050565b611ae333611ea4565b600f80546001600160a01b0319166001600160a01b039390931692909217909155601555565b611b1233611ea4565b610f7d8383836123ed565b601d8054610938906137b8565b611b3333611ea4565b601480546001600160a01b0319166001600160a01b039390931692909217909155601a55565b611b6233611ea4565b611b6a6120fc565b5f3411611bb45760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b60448201526064016108d9565b6118e76001600755565b816daaeb6d7670e522a718067333cd4e3b15801590611bdf575060085460ff165b15611c8657604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611c3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c5e91906138d0565b611c8657604051633b79c77360e21b81526001600160a01b03821660048201526024016108d9565b611c908383612564565b610f7d33848461256b565b611ca3612264565b610cb68161264a565b611cb533611ea4565b6008805460ff1916911515919091179055565b5f611cd2826109e2565b5192915050565b611ce233611ea4565b5f918252601b6020526040909120805460ff1916911515919091179055565b6060611d0b612673565b905090565b846daaeb6d7670e522a718067333cd4e3b15801590611d31575060085460ff165b15611de357336001600160a01b03821603611d5357610e6686868686866126f2565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611da0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc491906138d0565b611de357604051633b79c77360e21b81523360048201526024016108d9565b610f0886868686866126f2565b611df8612264565b6001600160a01b038116611e5d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d9565b610cb68161239c565b611e6f33611ea4565b5f918252600b602052604090912055565b5f6001600160e01b0319821663152a902d60e11b1480610904575061090482612737565b6001600160a01b0381165f9081526006602052604090205460ff16611ed4335b6001600160a01b03166014612786565b604051602001611ee49190613917565b604051602081830303815290604052906109275760405162461bcd60e51b81526004016108d99190613232565b6127106001600160601b0382161115611f7f5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016108d9565b6001600160a01b038216611fd55760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016108d9565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600955565b60606002805461201d906137b8565b80601f0160208091040260200160405190810160405280929190818152602001828054612049906137b8565b80156120945780601f1061206b57610100808354040283529160200191612094565b820191905f5260205f20905b81548152906001019060200180831161207757829003601f168201915b50505050509050919050565b5f8281526004602052604090206120b782826139a8565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6120e3846109e2565b6040516120f09190613232565b60405180910390a25050565b60026007540361214e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108d9565b6002600755565b6001600160a01b0384166121b55760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016108d9565b335f6121c08561291b565b90505f6121cc8561291b565b90505f868152602081815260408083206001600160a01b038b168452909152812080548792906121fd90849061389e565b909155505060408051878152602081018790526001600160a01b03808a16925f92918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461225b835f89898989612964565b50505050505050565b6005546001600160a01b031633146118e75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108d9565b6001600160a01b0381165f9081526006602052604090205460ff16156122e333611ec4565b6040516020016122f39190613a63565b604051602081830303815290604052906123205760405162461bcd60e51b81526004016108d99190613232565b506001600160a01b03165f908152600660205260409020805460ff19166001179055565b6001600160a01b038516331480612360575061236085336107d0565b61237c5760405162461bcd60e51b81526004016108d990613ab9565b6123898585858585612abe565b5050505050565b600361092782826139a8565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b03831661244f5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016108d9565b335f61245a8461291b565b90505f6124668461291b565b60408051602080820183525f918290528882528181528282206001600160a01b038b16835290522054909150848110156124ee5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016108d9565b5f868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091525f905261225b565b6109273383835b816001600160a01b0316836001600160a01b0316036125de5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016108d9565b6001600160a01b038381165f81815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61265381611ea4565b6001600160a01b03165f908152600660205260409020805460ff19169055565b60605f8061268381612710610ce8565b915091506126cc61269382612c8e565b6126a7846001600160a01b03166014612786565b6040516020016126b8929190613b07565b604051602081830303815290604052612d1d565b6040516020016126dc9190613b8c565b6040516020818303038152906040529250505090565b6001600160a01b03851633148061270e575061270e85336107d0565b61272a5760405162461bcd60e51b81526004016108d990613ab9565b6123898585858585612e7b565b5f6001600160e01b03198216636cdb3d1360e11b148061276757506001600160e01b031982166303a24d0760e21b145b8061090457506301ffc9a760e01b6001600160e01b0319831614610904565b60605f612794836002613887565b61279f90600261389e565b6001600160401b038111156127b6576127b6613274565b6040519080825280601f01601f1916602001820160405280156127e0576020820181803683370190505b509050600360fc1b815f815181106127fa576127fa6138eb565b60200101906001600160f81b03191690815f1a905350600f60fb1b81600181518110612828576128286138eb565b60200101906001600160f81b03191690815f1a9053505f61284a846002613887565b61285590600161389e565b90505b60018111156128cc576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612889576128896138eb565b1a60f81b82828151811061289f5761289f6138eb565b60200101906001600160f81b03191690815f1a90535060049490941c936128c581613bd0565b9050612858565b508315610ab75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108d9565b6040805160018082528183019092526060915f91906020808301908036833701905050905082815f81518110612953576129536138eb565b602090810291909101015292915050565b6001600160a01b0384163b15610f085760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906129a89089908990889088908890600401613be5565b6020604051808303815f875af19250505080156129e2575060408051601f3d908101601f191682019092526129df91810190613c29565b60015b612a8e576129ee613c44565b806308c379a003612a275750612a02613c5d565b80612a0d5750612a29565b8060405162461bcd60e51b81526004016108d99190613232565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016108d9565b6001600160e01b0319811663f23a6e6160e01b1461225b5760405162461bcd60e51b81526004016108d990613ce5565b8151835114612b205760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016108d9565b6001600160a01b038416612b465760405162461bcd60e51b81526004016108d990613d2d565b335f5b8451811015612c28575f858281518110612b6557612b656138eb565b602002602001015190505f858381518110612b8257612b826138eb565b6020908102919091018101515f84815280835260408082206001600160a01b038e168352909352919091205490915081811015612bd15760405162461bcd60e51b81526004016108d990613d72565b5f838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612c0d90849061389e565b9250508190555050505080612c21906138ff565b9050612b49565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612c78929190613dbc565b60405180910390a4610f08818787878787612fa1565b60605f612c9a8361305b565b60010190505f816001600160401b03811115612cb857612cb8613274565b6040519080825280601f01601f191660200182016040528015612ce2576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612cec57509392505050565b606081515f03612d3a57505060408051602081019091525f815290565b5f604051806060016040528060408152602001613e476040913990505f600384516002612d67919061389e565b612d7191906138b1565b612d7c906004613887565b90505f612d8a82602061389e565b6001600160401b03811115612da157612da1613274565b6040519080825280601f01601f191660200182016040528015612dcb576020820181803683370190505b509050818152600183018586518101602084015b81831015612e37576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101612ddf565b600389510660018114612e515760028114612e6257612e6d565b613d3d60f01b600119830152612e6d565b603d60f81b5f198301525b509398975050505050505050565b6001600160a01b038416612ea15760405162461bcd60e51b81526004016108d990613d2d565b335f612eac8561291b565b90505f612eb88561291b565b90505f868152602081815260408083206001600160a01b038c16845290915290205485811015612efa5760405162461bcd60e51b81526004016108d990613d72565b5f878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612f3690849061389e565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612f96848a8a8a8a8a612964565b505050505050505050565b6001600160a01b0384163b15610f085760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612fe59089908990889088908890600401613de9565b6020604051808303815f875af192505050801561301f575060408051601f3d908101601f1916820190925261301c91810190613c29565b60015b61302b576129ee613c44565b6001600160e01b0319811663bc197c8160e01b1461225b5760405162461bcd60e51b81526004016108d990613ce5565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106130995772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106130c5576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106130e357662386f26fc10000830492506010015b6305f5e10083106130fb576305f5e100830492506008015b612710831061310f57612710830492506004015b60648310613121576064830492506002015b600a83106109045760010192915050565b80356001600160a01b0381168114613148575f80fd5b919050565b5f806040838503121561315e575f80fd5b61316783613132565b946020939093013593505050565b6001600160e01b031981168114610cb6575f80fd5b5f6020828403121561319a575f80fd5b8135610ab781613175565b5f80604083850312156131b6575f80fd5b6131bf83613132565b915060208301356001600160601b03811681146131da575f80fd5b809150509250929050565b5f5b838110156131ff5781810151838201526020016131e7565b50505f910152565b5f815180845261321e8160208601602086016131e5565b601f01601f19169290920160200192915050565b602081525f610ab76020830184613207565b5f60208284031215613254575f80fd5b610ab782613132565b5f6020828403121561326d575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b601f8201601f191681016001600160401b03811182821017156132ad576132ad613274565b6040525050565b5f82601f8301126132c3575f80fd5b81356001600160401b038111156132dc576132dc613274565b6040516132f3601f8301601f191660200182613288565b818152846020838601011115613307575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215613334575f80fd5b8235915060208301356001600160401b03811115613350575f80fd5b61335c858286016132b4565b9150509250929050565b5f8060408385031215613377575f80fd5b50508035926020909101359150565b5f6001600160401b0382111561339e5761339e613274565b5060051b60200190565b5f82601f8301126133b7575f80fd5b813560206133c482613386565b6040516133d18282613288565b83815260059390931b85018201928281019150868411156133f0575f80fd5b8286015b8481101561340b57803583529183019183016133f4565b509695505050505050565b5f805f805f60a0868803121561342a575f80fd5b61343386613132565b945061344160208701613132565b935060408601356001600160401b038082111561345c575f80fd5b61346889838a016133a8565b9450606088013591508082111561347d575f80fd5b61348989838a016133a8565b9350608088013591508082111561349e575f80fd5b506134ab888289016132b4565b9150509295509295909350565b5f805f606084860312156134ca575f80fd5b6134d384613132565b95602085013595506040909401359392505050565b5f82601f8301126134f7575f80fd5b8135602061350482613386565b6040516135118282613288565b83815260059390931b8501820192828101915086841115613530575f80fd5b8286015b8481101561340b5761354581613132565b8352918301918301613534565b5f8060408385031215613563575f80fd5b82356001600160401b0380821115613579575f80fd5b613585868387016134e8565b9350602085013591508082111561359a575f80fd5b5061335c858286016133a8565b5f8151808452602080850194508084015f5b838110156135d5578151875295820195908201906001016135b9565b509495945050505050565b602081525f610ab760208301846135a7565b5f60208284031215613602575f80fd5b81356001600160401b03811115613617575f80fd5b613623848285016132b4565b949350505050565b5f805f6060848603121561363d575f80fd5b83356001600160401b0380821115613653575f80fd5b61365f878388016134e8565b945060208601359350604086013591508082111561367b575f80fd5b50613688868287016133a8565b9150509250925092565b8015158114610cb6575f80fd5b5f80604083850312156136b0575f80fd5b6136b983613132565b915060208301356131da81613692565b5f80604083850312156136da575f80fd5b823591506136ea60208401613132565b90509250929050565b5f60208284031215613703575f80fd5b8135610ab781613692565b5f806040838503121561371f575f80fd5b8235915060208301356131da81613692565b5f8060408385031215613742575f80fd5b61374b83613132565b91506136ea60208401613132565b5f805f805f60a0868803121561376d575f80fd5b61377686613132565b945061378460208701613132565b9350604086013592506060860135915060808601356001600160401b038111156137ac575f80fd5b6134ab888289016132b4565b600181811c908216806137cc57607f821691505b6020821081036137ea57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f8084546137fd816137b8565b60018281168015613815576001811461382a57613856565b60ff1984168752821515830287019450613856565b885f526020805f205f5b8581101561384d5781548a820152908401908201613834565b50505082870194505b50505050835161386a8183602088016131e5565b01949350505050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761090457610904613873565b8082018082111561090457610904613873565b5f826138cb57634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156138e0575f80fd5b8151610ab781613692565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161391057613910613873565b5060010190565b67030b1b1b7bab73a160c51b81525f82516139398160088501602087016131e5565b721034b9903737ba1030b71037b832b930ba37b960691b6008939091019283015250601b01919050565b601f821115610f7d575f81815260208120601f850160051c810160208610156139895750805b601f850160051c820191505b81811015610f0857828155600101613995565b81516001600160401b038111156139c1576139c1613274565b6139d5816139cf84546137b8565b84613963565b602080601f831160018114613a08575f84156139f15750858301515b5f19600386901b1c1916600185901b178555610f08565b5f85815260208120601f198616915b82811015613a3657888601518255948401946001909101908401613a17565b5085821015613a5357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b67030b1b1b7bab73a160c51b81525f8251613a858160088501602087016131e5565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a000000000081525f8351613b3e81601b8501602088016131e5565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b918401918201528351613b7181602e8401602088016131e5565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f8251613bc381601d8501602087016131e5565b91909101601d0192915050565b5f81613bde57613bde613873565b505f190190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f90613c1e90830184613207565b979650505050505050565b5f60208284031215613c39575f80fd5b8151610ab781613175565b5f60033d1115613c5a5760045f803e505f5160e01c5b90565b5f60443d1015613c6a5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613c9957505050505090565b8285019150815181811115613cb15750505050505090565b843d8701016020828501011115613ccb5750505050505090565b613cda60208286010187613288565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081525f613dce60408301856135a7565b8281036020840152613de081856135a7565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190525f90613e14908301866135a7565b8281036060840152613e2681866135a7565b90508281036080840152613e3a8185613207565b9897505050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c403ed69b558a876595eb1d3ba68bc258e5c1d0c67a5f5396133854193459cc264736f6c63430008150033

Deployed Bytecode Sourcemap

76655:12082:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24424:230;;;;;;;;;;-1:-1:-1;24424:230:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;24424:230:0;;;;;;;;85734:165;;;;;;;;;;-1:-1:-1;85734:165:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;85734:165:0;1019:187:1;85556:157:0;;;;;;;;;;-1:-1:-1;85556:157:0;;;;;:::i;:::-;;:::i;:::-;;77432:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;82331:112::-;;;;;;;;;;-1:-1:-1;82331:112:0;;;;;:::i;:::-;;:::i;56331:351::-;;;;;;;;;;-1:-1:-1;56331:351:0;;;;;:::i;:::-;;:::i;78198:154::-;;;;;;;;;;-1:-1:-1;78198:154:0;;;;;:::i;:::-;;:::i;81262:166::-;;;;;;;;;;-1:-1:-1;81262:166:0;;;;;:::i;:::-;;:::i;78912:431::-;;;;;;:::i;:::-;;:::i;81800:166::-;;;;;;;;;;-1:-1:-1;81800:166:0;;;;;:::i;:::-;;:::i;88443:115::-;;;;;;;;;;-1:-1:-1;88443:115:0;;;;;:::i;:::-;;:::i;80993:166::-;;;;;;;;;;-1:-1:-1;80993:166:0;;;;;:::i;:::-;;:::i;69990:442::-;;;;;;;;;;-1:-1:-1;69990:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4501:32:1;;;4483:51;;4565:2;4550:18;;4543:34;;;;4456:18;69990:442:0;4309:274:1;78360:314:0;;;;;;;;;;-1:-1:-1;78360:314:0;;;;;:::i;:::-;;:::i;88047:302::-;;;;;;;;;;-1:-1:-1;88047:302:0;;;;;:::i;:::-;;:::i;78682:222::-;;;;;;;;;;-1:-1:-1;78682:222:0;;;;;:::i;:::-;;:::i;82513:2977::-;;;:::i;65003:143::-;;;;;;;;;;;;65103:42;65003:143;;;;;-1:-1:-1;;;;;6977:32:1;;;6959:51;;6947:2;6932:18;65003:143:0;6781:235:1;24820:499:0;;;;;;;;;;-1:-1:-1;24820:499:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;78092:98::-;;;;;;;;;;-1:-1:-1;78092:98:0;;;;;:::i;:::-;;:::i;81531:166::-;;;;;;;;;;-1:-1:-1;81531:166:0;;;;;:::i;:::-;;:::i;75579:113::-;;;;;;;;;;-1:-1:-1;75579:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;75663:21:0;75639:4;75663:21;;;:10;:21;;;;;;;;;75579:113;2755:103;;;;;;;;;;;;;:::i;79660:255::-;;;;;;;;;;-1:-1:-1;79660:255:0;;;;;:::i;:::-;;:::i;80724:166::-;;;;;;;;;;-1:-1:-1;80724:166:0;;;;;:::i;:::-;;:::i;2107:87::-;;;;;;;;;;-1:-1:-1;2180:6:0;;-1:-1:-1;;;;;2180:6:0;2107:87;;79923:153;;;;;;;;;;-1:-1:-1;79923:153:0;;;;;:::i;:::-;;:::i;77473:28::-;;;;;;;;;;;;;:::i;82069:166::-;;;;;;;;;;-1:-1:-1;82069:166:0;;;;;:::i;:::-;;:::i;77378:45::-;;;;;;;;;;-1:-1:-1;77378:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;76853:46;;;;;;;;;;-1:-1:-1;76853:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;80477:144;;;:::i;87175:239::-;;;;;;;;;;-1:-1:-1;87175:239:0;;;;;:::i;:::-;;:::i;79351:159::-;;;;;;;;;;-1:-1:-1;79351:159:0;;;;;:::i;:::-;79454:7;79481:11;;;:6;:11;;;;;;;;-1:-1:-1;;;;;79481:21:0;;;;;;;;;;;;;79351:159;88617:117;;;;;;;;;;-1:-1:-1;88617:117:0;;;;;:::i;:::-;;:::i;86864:122::-;;;;;;;;;;-1:-1:-1;86864:122:0;;;;;:::i;:::-;;:::i;79516:136::-;;;;;;;;;;-1:-1:-1;79516:136:0;;;;;:::i;:::-;;:::i;80100:148::-;;;;;;;;;;-1:-1:-1;80100:148:0;;;;;:::i;:::-;;:::i;76802:44::-;;;;;;;;;;-1:-1:-1;76802:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;85928:113;;;;;;;;;;;;;:::i;25619:168::-;;;;;;;;;;-1:-1:-1;25619:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;25742:27:0;;;25718:4;25742:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;25619:168;87602:252;;;;;;;;;;-1:-1:-1;87602:252:0;;;;;:::i;:::-;;:::i;3013:201::-;;;;;;;;;;-1:-1:-1;3013:201:0;;;;;:::i;:::-;;:::i;80289:148::-;;;;;;;;;;-1:-1:-1;80289:148:0;;;;;:::i;:::-;;:::i;64951:43::-;;;;;;;;;;-1:-1:-1;64951:43:0;;;;;;;;24424:230;24510:7;-1:-1:-1;;;;;24538:21:0;;24530:76;;;;-1:-1:-1;;;24530:76:0;;12606:2:1;24530:76:0;;;12588:21:1;12645:2;12625:18;;;12618:30;12684:34;12664:18;;;12657:62;-1:-1:-1;;;12735:18:1;;;12728:40;12785:19;;24530:76:0;;;;;;;;;-1:-1:-1;24624:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;24624:22:0;;;;;;;;;;24424:230;;;;;:::o;85734:165::-;85837:4;85857:36;85881:11;85857:23;:36::i;85556:157::-;75521:32;738:10;75521:18;:32::i;:::-;85663:44:::1;85682:9;85693:13;85663:18;:44::i;:::-;85556:157:::0;;:::o;77432:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;82331:112::-;75521:32;738:10;75521:18;:32::i;:::-;82411:15:::1;:24:::0;;-1:-1:-1;;;;;;82411:24:0::1;-1:-1:-1::0;;;;;82411:24:0;;;::::1;::::0;;;::::1;::::0;;82331:112::o;56331:351::-;56425:22;56450:19;;;:10;:19;;;;;56425:44;;56399:13;;56425:22;56450:19;56425:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56605:1;56586:8;56580:22;:26;:94;;56656:18;56666:7;56656:9;:18::i;:::-;56580:94;;;56633:8;56643;56616:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56580:94;56573:101;56331:351;-1:-1:-1;;;56331:351:0:o;78198:154::-;75521:32;738:10;75521:18;:32::i;:::-;78317:27:::1;78325:7;78334:9;78317:7;:27::i;81262:166::-:0;75521:32;738:10;75521:18;:32::i;:::-;81382:3:::1;:12:::0;;-1:-1:-1;;;;;;81382:12:0::1;-1:-1:-1::0;;;;;81382:12:0;;;::::1;::::0;;;::::1;::::0;;;81405:7:::1;:15:::0;81262:166::o;78912:431::-;74769:21;:19;:21::i;:::-;79043:7:::1;79047:2;79043:3;:7::i;:::-;79037:21;79062:1;79037:26:::0;79029:54:::1;;;::::0;-1:-1:-1;;;79029:54:0;;14553:2:1;79029:54:0::1;::::0;::::1;14535:21:1::0;14592:2;14572:18;;;14565:30;-1:-1:-1;;;14611:18:1;;;14604:45;14666:18;;79029:54:0::1;14351:339:1::0;79029:54:0::1;79102:17;::::0;;;:13:::1;:17;::::0;;;;;::::1;;79094:44;;;::::0;-1:-1:-1;;;79094:44:0;;14897:2:1;79094:44:0::1;::::0;::::1;14879:21:1::0;14936:2;14916:18;;;14909:30;-1:-1:-1;;;14955:18:1;;;14948:44;15009:18;;79094:44:0::1;14695:338:1::0;79094:44:0::1;79170:13;::::0;;;:9:::1;:13;::::0;;;;;:23:::1;::::0;79186:7;;79170:23:::1;:::i;:::-;79157:9;:36;79149:73;;;::::0;-1:-1:-1;;;79149:73:0;;15545:2:1;79149:73:0::1;::::0;::::1;15527:21:1::0;15584:2;15564:18;;;15557:30;-1:-1:-1;;;15603:18:1;;;15596:54;15667:18;;79149:73:0::1;15343:348:1::0;79149:73:0::1;79233:33;79239:10;79250:2;79254:7;79233:33;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;79277:10;::::0;;;:6:::1;:10;::::0;;;;;;;79288::::1;79277:22:::0;;;;;;;:27;;79303:1:::1;::::0;79277:10;:27:::1;::::0;79303:1;;79277:27:::1;:::i;:::-;::::0;;;-1:-1:-1;;79315:15:0::1;::::0;;;:11:::1;:15;::::0;;;;:20;;79334:1:::1;::::0;79315:15;:20:::1;::::0;79334:1;;79315:20:::1;:::i;:::-;::::0;;;-1:-1:-1;;74207:1:0;75333:7;:22;85556:157;;:::o;81800:166::-;75521:32;738:10;75521:18;:32::i;:::-;81920:3:::1;:12:::0;;-1:-1:-1;;;;;;81920:12:0::1;-1:-1:-1::0;;;;;81920:12:0;;;::::1;::::0;;;::::1;::::0;;;81943:7:::1;:15:::0;81800:166::o;88443:115::-;1993:13;:11;:13::i;:::-;88520:30:::1;88539:10;88520:18;:30::i;:::-;88443:115:::0;:::o;80993:166::-;75521:32;738:10;75521:18;:32::i;:::-;81113:3:::1;:12:::0;;-1:-1:-1;;;;;;81113:12:0::1;-1:-1:-1::0;;;;;81113:12:0;;;::::1;::::0;;;::::1;::::0;;;81136:7:::1;:15:::0;80993:166::o;69990:442::-;70087:7;70145:27;;;:17;:27;;;;;;;;70116:56;;;;;;;;;-1:-1:-1;;;;;70116:56:0;;;;;-1:-1:-1;;;70116:56:0;;;-1:-1:-1;;;;;70116:56:0;;;;;;;;70087:7;;70185:92;;-1:-1:-1;70236:29:0;;;;;;;;;70246:19;70236:29;-1:-1:-1;;;;;70236:29:0;;;;-1:-1:-1;;;70236:29:0;;-1:-1:-1;;;;;70236:29:0;;;;;70185:92;70327:23;;;;70289:21;;70798:5;;70314:36;;-1:-1:-1;;;;;70314:36:0;:10;:36;:::i;:::-;70313:58;;;;:::i;:::-;70392:16;;;;;-1:-1:-1;69990:442:0;;-1:-1:-1;;;;69990:442:0:o;78360:314::-;75521:32;738:10;75521:18;:32::i;:::-;78493:12:::1;78497:7;78493:3;:12::i;:::-;78487:26:::0;:31;78479:62:::1;;;::::0;-1:-1:-1;;;78479:62:0;;16382:2:1;78479:62:0::1;::::0;::::1;16364:21:1::0;16421:2;16401:18;;;16394:30;-1:-1:-1;;;16440:18:1;;;16433:48;16498:18;;78479:62:0::1;16180:342:1::0;78479:62:0::1;78552:33;78558:10;78570:7;78579:1;78552:33;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;78596:18;::::0;;;:9:::1;:18;::::0;;;;78617:11:::1;78596:32:::0;;78639:27:::1;78606:7:::0;78656:9;78639:7:::1;:27::i;88047:302::-:0;88267:4;65103:42;66251:45;:49;;;;:77;;-1:-1:-1;66304:24:0;;;;66251:77;66247:567;;;66568:10;-1:-1:-1;;;;;66560:18:0;;;66556:85;;88284:57:::1;88312:4;88318:2;88322:3;88327:7;88336:4;88284:27;:57::i;:::-;66619:7:::0;;66556:85;66660:69;;-1:-1:-1;;;66660:69:0;;66711:4;66660:69;;;16739:34:1;66718:10:0;16789:18:1;;;16782:43;65103:42:0;;66660;;16674:18:1;;66660:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66655:148;;66757:30;;-1:-1:-1;;;66757:30:0;;66776:10;66757:30;;;6959:51:1;6932:18;;66757:30:0;6781:235:1;66655:148:0;88284:57:::1;88312:4;88318:2;88322:3;88327:7;88336:4;88284:27;:57::i;:::-;88047:302:::0;;;;;;:::o;78682:222::-;75521:32;738:10;75521:18;:32::i;:::-;78820:7:::1;78824:2;78820:3;:7::i;:::-;78814:21;78839:1;78814:26:::0;78806:54:::1;;;::::0;-1:-1:-1;;;78806:54:0;;14553:2:1;78806:54:0::1;::::0;::::1;14535:21:1::0;14592:2;14572:18;;;14565:30;-1:-1:-1;;;14611:18:1;;;14604:45;14666:18;;78806:54:0::1;14351:339:1::0;78806:54:0::1;78871:25;78877:2;78881;78885:6;78871:25;;;;;;;;;;;::::0;:5:::1;:25::i;:::-;78682:222:::0;;;:::o;82513:2977::-;75521:32;738:10;75521:18;:32::i;:::-;74769:21:::1;:19;:21::i;:::-;82618:3:::2;::::0;-1:-1:-1;;;;;82618:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;82639:7:0::2;::::0;:12;::::2;82618:33;82617:56;;;-1:-1:-1::0;82656:3:0::2;::::0;-1:-1:-1;;;;;82656:3:0::2;:17:::0;82617:56:::2;82595:152;;;::::0;-1:-1:-1;;;82595:152:0;;17288:2:1;82595:152:0::2;::::0;::::2;17270:21:1::0;17327:2;17307:18;;;17300:30;17366:34;17346:18;;;17339:62;-1:-1:-1;;;17417:18:1;;;17410:44;17471:19;;82595:152:0::2;17086:410:1::0;82595:152:0::2;82781:3;::::0;-1:-1:-1;;;;;82781:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;82802:7:0::2;::::0;:12;::::2;82781:33;82780:56;;;-1:-1:-1::0;82819:3:0::2;::::0;-1:-1:-1;;;;;82819:3:0::2;:17:::0;82780:56:::2;82758:152;;;::::0;-1:-1:-1;;;82758:152:0;;17703:2:1;82758:152:0::2;::::0;::::2;17685:21:1::0;17742:2;17722:18;;;17715:30;17781:34;17761:18;;;17754:62;-1:-1:-1;;;17832:18:1;;;17825:44;17886:19;;82758:152:0::2;17501:410:1::0;82758:152:0::2;82944:3;::::0;-1:-1:-1;;;;;82944:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;82965:7:0::2;::::0;:12;::::2;82944:33;82943:56;;;-1:-1:-1::0;82982:3:0::2;::::0;-1:-1:-1;;;;;82982:3:0::2;:17:::0;82943:56:::2;82921:152;;;::::0;-1:-1:-1;;;82921:152:0;;18118:2:1;82921:152:0::2;::::0;::::2;18100:21:1::0;18157:2;18137:18;;;18130:30;18196:34;18176:18;;;18169:62;-1:-1:-1;;;18247:18:1;;;18240:44;18301:19;;82921:152:0::2;17916:410:1::0;82921:152:0::2;83107:3;::::0;-1:-1:-1;;;;;83107:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;83128:7:0::2;::::0;:12;::::2;83107:33;83106:56;;;-1:-1:-1::0;83145:3:0::2;::::0;-1:-1:-1;;;;;83145:3:0::2;:17:::0;83106:56:::2;83084:152;;;::::0;-1:-1:-1;;;83084:152:0;;18533:2:1;83084:152:0::2;::::0;::::2;18515:21:1::0;18572:2;18552:18;;;18545:30;18611:34;18591:18;;;18584:62;-1:-1:-1;;;18662:18:1;;;18655:44;18716:19;;83084:152:0::2;18331:410:1::0;83084:152:0::2;83270:3;::::0;-1:-1:-1;;;;;83270:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;83291:7:0::2;::::0;:12;::::2;83270:33;83269:56;;;-1:-1:-1::0;83308:3:0::2;::::0;-1:-1:-1;;;;;83308:3:0::2;:17:::0;83269:56:::2;83247:152;;;::::0;-1:-1:-1;;;83247:152:0;;18948:2:1;83247:152:0::2;::::0;::::2;18930:21:1::0;18987:2;18967:18;;;18960:30;19026:34;19006:18;;;18999:62;-1:-1:-1;;;19077:18:1;;;19070:44;19131:19;;83247:152:0::2;18746:410:1::0;83247:152:0::2;83433:3;::::0;-1:-1:-1;;;;;83433:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;83454:7:0::2;::::0;:12;::::2;83433:33;83432:56;;;-1:-1:-1::0;83471:3:0::2;::::0;-1:-1:-1;;;;;83471:3:0::2;:17:::0;83432:56:::2;83410:152;;;::::0;-1:-1:-1;;;83410:152:0;;19363:2:1;83410:152:0::2;::::0;::::2;19345:21:1::0;19402:2;19382:18;;;19375:30;19441:34;19421:18;;;19414:62;-1:-1:-1;;;19492:18:1;;;19485:44;19546:19;;83410:152:0::2;19161:410:1::0;83410:152:0::2;83649:3;::::0;83595:21:::2;::::0;83573:19:::2;::::0;-1:-1:-1;;;;;83649:3:0::2;:17:::0;83645:238:::2;;83727:3;::::0;83778:7:::2;::::0;-1:-1:-1;;;;;83727:3:0;;::::2;::::0;83789:5:::2;::::0;83764:21:::2;::::0;:11;:21:::2;:::i;:::-;83763:31;;;;:::i;:::-;83719:95;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83710:104;;;;;83837:2;83829:42;;;::::0;-1:-1:-1;;;83829:42:0;;19988:2:1;83829:42:0::2;::::0;::::2;19970:21:1::0;20027:2;20007:18;;;20000:30;20066:29;20046:18;;;20039:57;20113:18;;83829:42:0::2;19786:351:1::0;83829:42:0::2;83897:3;::::0;-1:-1:-1;;;;;83897:3:0::2;:17:::0;83893:238:::2;;83975:3;::::0;84026:7:::2;::::0;-1:-1:-1;;;;;83975:3:0;;::::2;::::0;84037:5:::2;::::0;84012:21:::2;::::0;:11;:21:::2;:::i;:::-;84011:31;;;;:::i;:::-;83967:95;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83958:104;;;;;84085:2;84077:42;;;::::0;-1:-1:-1;;;84077:42:0;;20344:2:1;84077:42:0::2;::::0;::::2;20326:21:1::0;20383:2;20363:18;;;20356:30;20422:29;20402:18;;;20395:57;20469:18;;84077:42:0::2;20142:351:1::0;84077:42:0::2;84145:3;::::0;-1:-1:-1;;;;;84145:3:0::2;:17:::0;84141:238:::2;;84223:3;::::0;84274:7:::2;::::0;-1:-1:-1;;;;;84223:3:0;;::::2;::::0;84285:5:::2;::::0;84260:21:::2;::::0;:11;:21:::2;:::i;:::-;84259:31;;;;:::i;:::-;84215:95;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84206:104;;;;;84333:2;84325:42;;;::::0;-1:-1:-1;;;84325:42:0;;20700:2:1;84325:42:0::2;::::0;::::2;20682:21:1::0;20739:2;20719:18;;;20712:30;20778:29;20758:18;;;20751:57;20825:18;;84325:42:0::2;20498:351:1::0;84325:42:0::2;84393:3;::::0;-1:-1:-1;;;;;84393:3:0::2;:17:::0;84389:238:::2;;84471:3;::::0;84522:7:::2;::::0;-1:-1:-1;;;;;84471:3:0;;::::2;::::0;84533:5:::2;::::0;84508:21:::2;::::0;:11;:21:::2;:::i;:::-;84507:31;;;;:::i;:::-;84463:95;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84454:104;;;;;84581:2;84573:42;;;::::0;-1:-1:-1;;;84573:42:0;;21056:2:1;84573:42:0::2;::::0;::::2;21038:21:1::0;21095:2;21075:18;;;21068:30;21134:29;21114:18;;;21107:57;21181:18;;84573:42:0::2;20854:351:1::0;84573:42:0::2;84641:3;::::0;-1:-1:-1;;;;;84641:3:0::2;:17:::0;84637:238:::2;;84719:3;::::0;84770:7:::2;::::0;-1:-1:-1;;;;;84719:3:0;;::::2;::::0;84781:5:::2;::::0;84756:21:::2;::::0;:11;:21:::2;:::i;:::-;84755:31;;;;:::i;:::-;84711:95;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84702:104;;;;;84829:2;84821:42;;;::::0;-1:-1:-1;;;84821:42:0;;21412:2:1;84821:42:0::2;::::0;::::2;21394:21:1::0;21451:2;21431:18;;;21424:30;21490:29;21470:18;;;21463:57;21537:18;;84821:42:0::2;21210:351:1::0;84821:42:0::2;84889:3;::::0;-1:-1:-1;;;;;84889:3:0::2;:17:::0;84885:238:::2;;84967:3;::::0;85018:7:::2;::::0;-1:-1:-1;;;;;84967:3:0;;::::2;::::0;85029:5:::2;::::0;85004:21:::2;::::0;:11;:21:::2;:::i;:::-;85003:31;;;;:::i;:::-;84959:95;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84950:104;;;;;85077:2;85069:42;;;::::0;-1:-1:-1;;;85069:42:0;;21768:2:1;85069:42:0::2;::::0;::::2;21750:21:1::0;21807:2;21787:18;;;21780:30;21846:29;21826:18;;;21819:57;21893:18;;85069:42:0::2;21566:351:1::0;85069:42:0::2;85183:15;::::0;85147:21:::2;::::0;-1:-1:-1;;;;;;85183:15:0::2;:29:::0;85179:254:::2;;85285:15;::::0;85277:55:::2;::::0;-1:-1:-1;;;;;85285:15:0;;::::2;::::0;85315:11;;85277:55:::2;::::0;;;85315:11;85285:15;85277:55:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85268:64;;;;;85179:254;;;2180:6:::0;;85374:47:::2;::::0;-1:-1:-1;;;;;2180:6:0;;;;85404:11;;85374:47:::2;::::0;;;85404:11;2180:6;85374:47:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;85365:56:0;;-1:-1:-1;;85179:254:0::2;85451:2;85443:39;;;::::0;-1:-1:-1;;;85443:39:0;;22124:2:1;85443:39:0::2;::::0;::::2;22106:21:1::0;22163:2;22143:18;;;22136:30;22202:26;22182:18;;;22175:54;22246:18;;85443:39:0::2;21922:348:1::0;85443:39:0::2;82584:2906;;74813:20:::1;74207:1:::0;75333:7;:22;75150:213;74813:20:::1;82513:2977::o:0;24820:499::-;24956:16;25012:3;:10;24993:8;:15;:29;24985:83;;;;-1:-1:-1;;;24985:83:0;;22477:2:1;24985:83:0;;;22459:21:1;22516:2;22496:18;;;22489:30;22555:34;22535:18;;;22528:62;-1:-1:-1;;;22606:18:1;;;22599:39;22655:19;;24985:83:0;22275:405:1;24985:83:0;25081:30;25128:8;:15;-1:-1:-1;;;;;25114:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25114:30:0;;25081:63;;25162:9;25157:122;25181:8;:15;25177:1;:19;25157:122;;;25237:30;25247:8;25256:1;25247:11;;;;;;;;:::i;:::-;;;;;;;25260:3;25264:1;25260:6;;;;;;;;:::i;:::-;;;;;;;25237:9;:30::i;:::-;25218:13;25232:1;25218:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;25198:3;;;:::i;:::-;;;25157:122;;;-1:-1:-1;25298:13:0;24820:499;-1:-1:-1;;;24820:499:0:o;78092:98::-;75521:32;738:10;75521:18;:32::i;:::-;78165:17:::1;78177:4;78165:11;:17::i;81531:166::-:0;75521:32;738:10;75521:18;:32::i;:::-;81651:3:::1;:12:::0;;-1:-1:-1;;;;;;81651:12:0::1;-1:-1:-1::0;;;;;81651:12:0;;;::::1;::::0;;;::::1;::::0;;;81674:7:::1;:15:::0;81531:166::o;2755:103::-;1993:13;:11;:13::i;:::-;2820:30:::1;2847:1;2820:18;:30::i;79660:255::-:0;75521:32;738:10;75521:18;:32::i;:::-;79811:9:::1;79806:102;79830:4;:11;79826:1;:15;79806:102;;;79863:33;79869:4;79874:1;79869:7;;;;;;;;:::i;:::-;;;;;;;79878:2;79882:6;79889:1;79882:9;;;;;;;;:::i;:::-;;;;;;;79863:33;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;79843:3:::0;::::1;::::0;::::1;:::i;:::-;;;;79806:102;;;;79660:255:::0;;;:::o;80724:166::-;75521:32;738:10;75521:18;:32::i;:::-;80844:3:::1;:12:::0;;-1:-1:-1;;;;;;80844:12:0::1;-1:-1:-1::0;;;;;80844:12:0;;;::::1;::::0;;;::::1;::::0;;;80867:7:::1;:15:::0;80724:166::o;79923:153::-;75521:32;738:10;75521:18;:32::i;:::-;80047:21:::1;80053:2;80057;80061:6;80047:5;:21::i;77473:28::-:0;;;;;;;:::i;82069:166::-;75521:32;738:10;75521:18;:32::i;:::-;82189:3:::1;:12:::0;;-1:-1:-1;;;;;;82189:12:0::1;-1:-1:-1::0;;;;;82189:12:0;;;::::1;::::0;;;::::1;::::0;;;82212:7:::1;:15:::0;82069:166::o;80477:144::-;75521:32;738:10;75521:18;:32::i;:::-;74769:21:::1;:19;:21::i;:::-;80583:1:::2;80571:9;:13;80563:50;;;::::0;-1:-1:-1;;;80563:50:0;;15545:2:1;80563:50:0::2;::::0;::::2;15527:21:1::0;15584:2;15564:18;;;15557:30;-1:-1:-1;;;15603:18:1;;;15596:54;15667:18;;80563:50:0::2;15343:348:1::0;80563:50:0::2;74813:20:::1;74207:1:::0;75333:7;:22;75150:213;87175:239;87279:8;65103:42;67025:45;:49;;;;:77;;-1:-1:-1;67078:24:0;;;;67025:77;67021:253;;;67124:67;;-1:-1:-1;;;67124:67:0;;67175:4;67124:67;;;16739:34:1;-1:-1:-1;;;;;16809:15:1;;16789:18;;;16782:43;65103:42:0;;67124;;16674:18:1;;67124:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67119:144;;67219:28;;-1:-1:-1;;;67219:28:0;;-1:-1:-1;;;;;6977:32:1;;67219:28:0;;;6959:51:1;6932:18;;67219:28:0;6781:235:1;67119:144:0;87300:43:::1;87324:8;87334;87300:23;:43::i;:::-;87354:52;738:10:::0;87387:8:::1;87397;87354:18;:52::i;88617:117::-:0;1993:13;:11;:13::i;:::-;88695:31:::1;88715:10;88695:19;:31::i;86864:122::-:0;75521:32;738:10;75521:18;:32::i;:::-;86946:24:::1;:32:::0;;-1:-1:-1;;86946:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;86864:122::o;79516:136::-;79595:7;79628:8;79632:3;79628;:8::i;:::-;79622:22;;79516:136;-1:-1:-1;;79516:136:0:o;80100:148::-;75521:32;738:10;75521:18;:32::i;:::-;80214:18:::1;::::0;;;:13:::1;:18;::::0;;;;;:26;;-1:-1:-1;;80214:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;80100:148::o;85928:113::-;85982:13;86015:20;:18;:20::i;:::-;86008:27;;85928:113;:::o;87602:252::-;87769:4;65103:42;66251:45;:49;;;;:77;;-1:-1:-1;66304:24:0;;;;66251:77;66247:567;;;66568:10;-1:-1:-1;;;;;66560:18:0;;;66556:85;;87791:55:::1;87814:4;87820:2;87824:7;87833:6;87841:4;87791:22;:55::i;66556:85::-:0;66660:69;;-1:-1:-1;;;66660:69:0;;66711:4;66660:69;;;16739:34:1;66718:10:0;16789:18:1;;;16782:43;65103:42:0;;66660;;16674:18:1;;66660:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66655:148;;66757:30;;-1:-1:-1;;;66757:30:0;;66776:10;66757:30;;;6959:51:1;6932:18;;66757:30:0;6781:235:1;66655:148:0;87791:55:::1;87814:4;87820:2;87824:7;87833:6;87841:4;87791:22;:55::i;3013:201::-:0;1993:13;:11;:13::i;:::-;-1:-1:-1;;;;;3102:22:0;::::1;3094:73;;;::::0;-1:-1:-1;;;3094:73:0;;23159:2:1;3094:73:0::1;::::0;::::1;23141:21:1::0;23198:2;23178:18;;;23171:30;23237:34;23217:18;;;23210:62;-1:-1:-1;;;23288:18:1;;;23281:36;23334:19;;3094:73:0::1;22957:402:1::0;3094:73:0::1;3178:28;3197:8;3178:18;:28::i;80289:148::-:0;75521:32;738:10;75521:18;:32::i;:::-;80404:14:::1;::::0;;;:9:::1;:14;::::0;;;;;:25;80289:148::o;69720:215::-;69822:4;-1:-1:-1;;;;;;69846:41:0;;-1:-1:-1;;;69846:41:0;;:81;;;69891:36;69915:11;69891:23;:36::i;76278:370::-;-1:-1:-1;;;;;76372:21:0;;;;;;:10;:21;;;;;;;;76505:46;738:10;76533:12;-1:-1:-1;;;;;76505:46:0;76548:2;76505:19;:46::i;:::-;76433:181;;;;;;;;:::i;:::-;;;;;;;;;;;;;76350:290;;;;;-1:-1:-1;;;76350:290:0;;;;;;;;:::i;71082:332::-;70798:5;-1:-1:-1;;;;;71185:33:0;;;;71177:88;;;;-1:-1:-1;;;71177:88:0;;24182:2:1;71177:88:0;;;24164:21:1;24221:2;24201:18;;;24194:30;24260:34;24240:18;;;24233:62;-1:-1:-1;;;24311:18:1;;;24304:40;24361:19;;71177:88:0;23980:406:1;71177:88:0;-1:-1:-1;;;;;71284:22:0;;71276:60;;;;-1:-1:-1;;;71276:60:0;;24593:2:1;71276:60:0;;;24575:21:1;24632:2;24612:18;;;24605:30;24671:27;24651:18;;;24644:55;24716:18;;71276:60:0;24391:349:1;71276:60:0;71371:35;;;;;;;;;-1:-1:-1;;;;;71371:35:0;;;;;;-1:-1:-1;;;;;71371:35:0;;;;;;;;;;-1:-1:-1;;;71349:57:0;;;;:19;:57;71082:332::o;24168:105::-;24228:13;24261:4;24254:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24168:105;;;:::o;56767:166::-;56853:19;;;;:10;:19;;;;;:30;56875:8;56853:19;:30;:::i;:::-;;56917:7;56899:26;56903:12;56907:7;56903:3;:12::i;:::-;56899:26;;;;;;:::i;:::-;;;;;;;;56767:166;;:::o;74849:293::-;74251:1;74983:7;;:19;74975:63;;;;-1:-1:-1;;;74975:63:0;;27025:2:1;74975:63:0;;;27007:21:1;27064:2;27044:18;;;27037:30;27103:33;27083:18;;;27076:61;27154:18;;74975:63:0;26823:355:1;74975:63:0;74251:1;75116:7;:18;74849:293::o;31040:686::-;-1:-1:-1;;;;;31150:16:0;;31142:62;;;;-1:-1:-1;;;31142:62:0;;27385:2:1;31142:62:0;;;27367:21:1;27424:2;27404:18;;;27397:30;27463:34;27443:18;;;27436:62;-1:-1:-1;;;27514:18:1;;;27507:31;27555:19;;31142:62:0;27183:397:1;31142:62:0;738:10;31217:16;31282:21;31300:2;31282:17;:21::i;:::-;31259:44;;31314:24;31341:25;31359:6;31341:17;:25::i;:::-;31314:52;;31458:9;:13;;;;;;;;;;;-1:-1:-1;;;;;31458:17:0;;;;;;;;;:27;;31479:6;;31458:9;:27;;31479:6;;31458:27;:::i;:::-;;;;-1:-1:-1;;31501:52:0;;;27759:25:1;;;27815:2;27800:18;;27793:34;;;-1:-1:-1;;;;;31501:52:0;;;;31534:1;;31501:52;;;;;;27732:18:1;31501:52:0;;;;;;;31644:74;31675:8;31693:1;31697:2;31701;31705:6;31713:4;31644:30;:74::i;:::-;31131:595;;;31040:686;;;;:::o;2272:132::-;2180:6;;-1:-1:-1;;;;;2180:6:0;738:10;2336:23;2328:68;;;;-1:-1:-1;;;2328:68:0;;28040:2:1;2328:68:0;;;28022:21:1;;;28059:18;;;28052:30;28118:34;28098:18;;;28091:62;28170:18;;2328:68:0;27838:356:1;75698:421:0;-1:-1:-1;;;;;75789:22:0;;;;;;:10;:22;;;;;;;;75788:23;75923:46;738:10;75951:12;658:98;75923:46;75851:194;;;;;;;;:::i;:::-;;;;;;;;;;;;;75766:305;;;;;-1:-1:-1;;;75766:305:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;76082:22:0;;;;;:10;:22;;;;;:29;;-1:-1:-1;;76082:29:0;76107:4;76082:29;;;75698:421::o;26342:438::-;-1:-1:-1;;;;;26575:20:0;;738:10;26575:20;;:60;;-1:-1:-1;26599:36:0;26616:4;738:10;25619:168;:::i;26599:36::-;26553:156;;;;-1:-1:-1;;;26553:156:0;;;;;;;:::i;:::-;26720:52;26743:4;26749:2;26753:3;26758:7;26767:4;26720:22;:52::i;:::-;26342:438;;;;;:::o;57020:98::-;57092:8;:18;57103:7;57092:8;:18;:::i;3374:191::-;3467:6;;;-1:-1:-1;;;;;3484:17:0;;;-1:-1:-1;;;;;;3484:17:0;;;;;;;3517:40;;3467:6;;;3484:17;3467:6;;3517:40;;3448:16;;3517:40;3437:128;3374:191;:::o;33240:774::-;-1:-1:-1;;;;;33333:18:0;;33325:66;;;;-1:-1:-1;;;33325:66:0;;29445:2:1;33325:66:0;;;29427:21:1;29484:2;29464:18;;;29457:30;29523:34;29503:18;;;29496:62;-1:-1:-1;;;29574:18:1;;;29567:33;29617:19;;33325:66:0;29243:399:1;33325:66:0;738:10;33404:16;33469:21;33487:2;33469:17;:21::i;:::-;33446:44;;33501:24;33528:25;33546:6;33528:17;:25::i;:::-;33566:66;;;;;;;;;-1:-1:-1;33566:66:0;;;;33667:13;;;;;;;;;-1:-1:-1;;;;;33667:19:0;;;;;;;;33501:52;;-1:-1:-1;33705:21:0;;;;33697:70;;;;-1:-1:-1;;;33697:70:0;;29849:2:1;33697:70:0;;;29831:21:1;29888:2;29868:18;;;29861:30;29927:34;29907:18;;;29900:62;-1:-1:-1;;;29978:18:1;;;29971:34;30022:19;;33697:70:0;29647:400:1;33697:70:0;33803:9;:13;;;;;;;;;;;-1:-1:-1;;;;;33803:19:0;;;;;;;;;;;;33825:20;;;33803:42;;33874:54;;27759:25:1;;;27800:18;;;27793:34;;;33803:19:0;;33874:54;;;;;;27732:18:1;33874:54:0;;;;;;;33941:65;;;;;;;;;33985:1;33941:65;;;88047:302;25392:155;25487:52;738:10;25520:8;25530;35342:297;35463:8;-1:-1:-1;;;;;35454:17:0;:5;-1:-1:-1;;;;;35454:17:0;;35446:71;;;;-1:-1:-1;;;35446:71:0;;30254:2:1;35446:71:0;;;30236:21:1;30293:2;30273:18;;;30266:30;30332:34;30312:18;;;30305:62;-1:-1:-1;;;30383:18:1;;;30376:39;30432:19;;35446:71:0;30052:405:1;35446:71:0;-1:-1:-1;;;;;35528:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;35528:46:0;;;;;;;;;;35590:41;;1159::1;;;35590::0;;1132:18:1;35590:41:0;;;;;;;35342:297;;;:::o;76125:147::-;76194:30;76213:10;76194:18;:30::i;:::-;-1:-1:-1;;;;;76242:22:0;;;;;:10;:22;;;;;76235:29;;-1:-1:-1;;76235:29:0;;;76125:147::o;86067:567::-;86120:13;86143:16;;86188:32;86143:16;70798:5;86188:11;:32::i;:::-;86142:78;;;;86329:283;86441:33;86458:15;86441:16;:33::i;:::-;86516:51;86552:8;-1:-1:-1;;;;;86536:26:0;86564:2;86516:19;:51::i;:::-;86375:213;;;;;;;;;:::i;:::-;;;;;;;;;;;;;86329:13;:283::i;:::-;86260:361;;;;;;;;:::i;:::-;;;;;;;;;;;;;86238:390;;;;86067:567;:::o;25859:406::-;-1:-1:-1;;;;;26067:20:0;;738:10;26067:20;;:60;;-1:-1:-1;26091:36:0;26108:4;738:10;25619:168;:::i;26091:36::-;26045:156;;;;-1:-1:-1;;;26045:156:0;;;;;;;:::i;:::-;26212:45;26230:4;26236:2;26240;26244:6;26252:4;26212:17;:45::i;23447:310::-;23549:4;-1:-1:-1;;;;;;23586:41:0;;-1:-1:-1;;;23586:41:0;;:110;;-1:-1:-1;;;;;;;23644:52:0;;-1:-1:-1;;;23644:52:0;23586:110;:163;;;-1:-1:-1;;;;;;;;;;14891:40:0;;;23713:36;14782:157;54216:447;54291:13;54317:19;54349:10;54353:6;54349:1;:10;:::i;:::-;:14;;54362:1;54349:14;:::i;:::-;-1:-1:-1;;;;;54339:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54339:25:0;;54317:47;;-1:-1:-1;;;54375:6:0;54382:1;54375:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;54375:15:0;;;;;;;;;-1:-1:-1;;;54401:6:0;54408:1;54401:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;54401:15:0;;;;;;;;-1:-1:-1;54432:9:0;54444:10;54448:6;54444:1;:10;:::i;:::-;:14;;54457:1;54444:14;:::i;:::-;54432:26;;54427:131;54464:1;54460;:5;54427:131;;;-1:-1:-1;;;54508:5:0;54516:3;54508:11;54499:21;;;;;;;:::i;:::-;;;;54487:6;54494:1;54487:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;54487:33:0;;;;;;;;-1:-1:-1;54545:1:0;54535:11;;;;;54467:3;;;:::i;:::-;;;54427:131;;;-1:-1:-1;54576:10:0;;54568:55;;;;-1:-1:-1;;;54568:55:0;;32326:2:1;54568:55:0;;;32308:21:1;;;32345:18;;;32338:30;32404:34;32384:18;;;32377:62;32456:18;;54568:55:0;32124:356:1;39574:198:0;39694:16;;;39708:1;39694:16;;;;;;;;;39640;;39669:22;;39694:16;;;;;;;;;;;;-1:-1:-1;39694:16:0;39669:41;;39732:7;39721:5;39727:1;39721:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;39759:5;39574:198;-1:-1:-1;;39574:198:0:o;38001:744::-;-1:-1:-1;;;;;38216:13:0;;5100:19;:23;38212:526;;38252:72;;-1:-1:-1;;;38252:72:0;;-1:-1:-1;;;;;38252:38:0;;;;;:72;;38291:8;;38301:4;;38307:2;;38311:6;;38319:4;;38252:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38252:72:0;;;;;;;;-1:-1:-1;;38252:72:0;;;;;;;;;;;;:::i;:::-;;;38248:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;38600:6;38593:14;;-1:-1:-1;;;38593:14:0;;;;;;;;:::i;38248:479::-;;;38649:62;;-1:-1:-1;;;38649:62:0;;34367:2:1;38649:62:0;;;34349:21:1;34406:2;34386:18;;;34379:30;34445:34;34425:18;;;34418:62;-1:-1:-1;;;34496:18:1;;;34489:50;34556:19;;38649:62:0;34165:416:1;38248:479:0;-1:-1:-1;;;;;;38374:55:0;;-1:-1:-1;;;38374:55:0;38370:154;;38454:50;;-1:-1:-1;;;38454:50:0;;;;;;;:::i;28576:1146::-;28803:7;:14;28789:3;:10;:28;28781:81;;;;-1:-1:-1;;;28781:81:0;;35197:2:1;28781:81:0;;;35179:21:1;35236:2;35216:18;;;35209:30;35275:34;35255:18;;;35248:62;-1:-1:-1;;;35326:18:1;;;35319:38;35374:19;;28781:81:0;34995:404:1;28781:81:0;-1:-1:-1;;;;;28881:16:0;;28873:66;;;;-1:-1:-1;;;28873:66:0;;;;;;;:::i;:::-;738:10;28952:16;29069:421;29093:3;:10;29089:1;:14;29069:421;;;29125:10;29138:3;29142:1;29138:6;;;;;;;;:::i;:::-;;;;;;;29125:19;;29159:14;29176:7;29184:1;29176:10;;;;;;;;:::i;:::-;;;;;;;;;;;;29203:19;29225:13;;;;;;;;;;-1:-1:-1;;;;;29225:19:0;;;;;;;;;;;;29176:10;;-1:-1:-1;29267:21:0;;;;29259:76;;;;-1:-1:-1;;;29259:76:0;;;;;;;:::i;:::-;29379:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29379:19:0;;;;;;;;;;29401:20;;;29379:42;;29451:17;;;;;;;:27;;29401:20;;29379:9;29451:27;;29401:20;;29451:27;:::i;:::-;;;;;;;;29110:380;;;29105:3;;;;:::i;:::-;;;29069:421;;;;29537:2;-1:-1:-1;;;;;29507:47:0;29531:4;-1:-1:-1;;;;;29507:47:0;29521:8;-1:-1:-1;;;;;29507:47:0;;29541:3;29546:7;29507:47;;;;;;;:::i;:::-;;;;;;;;29639:75;29675:8;29685:4;29691:2;29695:3;29700:7;29709:4;29639:35;:75::i;53084:716::-;53140:13;53191:14;53208:17;53219:5;53208:10;:17::i;:::-;53228:1;53208:21;53191:38;;53244:20;53278:6;-1:-1:-1;;;;;53267:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53267:18:0;-1:-1:-1;53244:41:0;-1:-1:-1;53409:28:0;;;53425:2;53409:28;53466:288;-1:-1:-1;;53498:5:0;-1:-1:-1;;;53635:2:0;53624:14;;53619:30;53498:5;53606:44;53696:2;53687:11;;;-1:-1:-1;53717:21:0;53466:288;53717:21;-1:-1:-1;53775:6:0;53084:716;-1:-1:-1;;;53084:716:0:o;57989:1912::-;58047:13;58077:4;:11;58092:1;58077:16;58073:31;;-1:-1:-1;;58095:9:0;;;;;;;;;-1:-1:-1;58095:9:0;;;57989:1912::o;58073:31::-;58156:19;58178:12;;;;;;;;;;;;;;;;;58156:34;;58242:18;58288:1;58269:4;:11;58283:1;58269:15;;;;:::i;:::-;58268:21;;;;:::i;:::-;58263:27;;:1;:27;:::i;:::-;58242:48;-1:-1:-1;58373:20:0;58407:15;58242:48;58420:2;58407:15;:::i;:::-;-1:-1:-1;;;;;58396:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58396:27:0;;58373:50;;58520:10;58512:6;58505:26;58615:1;58608:5;58604:13;58674:4;58725;58719:11;58710:7;58706:25;58821:2;58813:6;58809:15;58894:754;58913:6;58904:7;58901:19;58894:754;;;59013:1;59004:7;59000:15;58989:26;;59052:7;59046:14;59178:4;59170:5;59166:2;59162:14;59158:25;59148:8;59144:40;59138:47;59127:9;59119:67;59232:1;59221:9;59217:17;59204:30;;59311:4;59303:5;59299:2;59295:14;59291:25;59281:8;59277:40;59271:47;59260:9;59252:67;59365:1;59354:9;59350:17;59337:30;;59444:4;59436:5;59433:1;59428:14;59424:25;59414:8;59410:40;59404:47;59393:9;59385:67;59498:1;59487:9;59483:17;59470:30;;59577:4;59569:5;59557:25;59547:8;59543:40;59537:47;59526:9;59518:67;-1:-1:-1;59631:1:0;59616:17;58894:754;;;59721:1;59714:4;59708:11;59704:19;59742:1;59737:54;;;;59810:1;59805:52;;;;59697:160;;59737:54;-1:-1:-1;;;;;59753:17:0;;59746:43;59737:54;;59805:52;-1:-1:-1;;;;;59821:17:0;;59814:41;59697:160;-1:-1:-1;59887:6:0;;57989:1912;-1:-1:-1;;;;;;;;57989:1912:0:o;27244:974::-;-1:-1:-1;;;;;27432:16:0;;27424:66;;;;-1:-1:-1;;;27424:66:0;;;;;;;:::i;:::-;738:10;27503:16;27568:21;27586:2;27568:17;:21::i;:::-;27545:44;;27600:24;27627:25;27645:6;27627:17;:25::i;:::-;27600:52;;27738:19;27760:13;;;;;;;;;;;-1:-1:-1;;;;;27760:19:0;;;;;;;;;;27798:21;;;;27790:76;;;;-1:-1:-1;;;27790:76:0;;;;;;;:::i;:::-;27902:9;:13;;;;;;;;;;;-1:-1:-1;;;;;27902:19:0;;;;;;;;;;27924:20;;;27902:42;;27966:17;;;;;;;:27;;27924:20;;27902:9;27966:27;;27924:20;;27966:27;:::i;:::-;;;;-1:-1:-1;;28011:46:0;;;27759:25:1;;;27815:2;27800:18;;27793:34;;;-1:-1:-1;;;;;28011:46:0;;;;;;;;;;;;;;27732:18:1;28011:46:0;;;;;;;28142:68;28173:8;28183:4;28189:2;28193;28197:6;28205:4;28142:30;:68::i;:::-;27413:805;;;;27244:974;;;;;:::o;38753:813::-;-1:-1:-1;;;;;38993:13:0;;5100:19;:23;38989:570;;39029:79;;-1:-1:-1;;;39029:79:0;;-1:-1:-1;;;;;39029:43:0;;;;;:79;;39073:8;;39083:4;;39089:3;;39094:7;;39103:4;;39029:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39029:79:0;;;;;;;;-1:-1:-1;;39029:79:0;;;;;;;;;;;;:::i;:::-;;;39025:523;;;;:::i;:::-;-1:-1:-1;;;;;;39190:60:0;;-1:-1:-1;;;39190:60:0;39186:159;;39275:50;;-1:-1:-1;;;39275:50:0;;;;;;;:::i;49950:922::-;50003:7;;-1:-1:-1;;;50081:15:0;;50077:102;;-1:-1:-1;;;50117:15:0;;;-1:-1:-1;50161:2:0;50151:12;50077:102;50206:6;50197:5;:15;50193:102;;50242:6;50233:15;;;-1:-1:-1;50277:2:0;50267:12;50193:102;50322:6;50313:5;:15;50309:102;;50358:6;50349:15;;;-1:-1:-1;50393:2:0;50383:12;50309:102;50438:5;50429;:14;50425:99;;50473:5;50464:14;;;-1:-1:-1;50507:1:0;50497:11;50425:99;50551:5;50542;:14;50538:99;;50586:5;50577:14;;;-1:-1:-1;50620:1:0;50610:11;50538:99;50664:5;50655;:14;50651:99;;50699:5;50690:14;;;-1:-1:-1;50733:1:0;50723:11;50651:99;50777:5;50768;:14;50764:66;;50813:1;50803:11;50858:6;49950:922;-1:-1:-1;;49950:922:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:366::-;1278:6;1286;1339:2;1327:9;1318:7;1314:23;1310:32;1307:52;;;1355:1;1352;1345:12;1307:52;1378:29;1397:9;1378:29;:::i;:::-;1368:39;;1457:2;1446:9;1442:18;1429:32;-1:-1:-1;;;;;1494:5:1;1490:38;1483:5;1480:49;1470:77;;1543:1;1540;1533:12;1470:77;1566:5;1556:15;;;1211:366;;;;;:::o;1582:250::-;1667:1;1677:113;1691:6;1688:1;1685:13;1677:113;;;1767:11;;;1761:18;1748:11;;;1741:39;1713:2;1706:10;1677:113;;;-1:-1:-1;;1824:1:1;1806:16;;1799:27;1582:250::o;1837:271::-;1879:3;1917:5;1911:12;1944:6;1939:3;1932:19;1960:76;2029:6;2022:4;2017:3;2013:14;2006:4;1999:5;1995:16;1960:76;:::i;:::-;2090:2;2069:15;-1:-1:-1;;2065:29:1;2056:39;;;;2097:4;2052:50;;1837:271;-1:-1:-1;;1837:271:1:o;2113:220::-;2262:2;2251:9;2244:21;2225:4;2282:45;2323:2;2312:9;2308:18;2300:6;2282:45;:::i;2338:186::-;2397:6;2450:2;2438:9;2429:7;2425:23;2421:32;2418:52;;;2466:1;2463;2456:12;2418:52;2489:29;2508:9;2489:29;:::i;2529:180::-;2588:6;2641:2;2629:9;2620:7;2616:23;2612:32;2609:52;;;2657:1;2654;2647:12;2609:52;-1:-1:-1;2680:23:1;;2529:180;-1:-1:-1;2529:180:1:o;2714:127::-;2775:10;2770:3;2766:20;2763:1;2756:31;2806:4;2803:1;2796:15;2830:4;2827:1;2820:15;2846:249;2956:2;2937:13;;-1:-1:-1;;2933:27:1;2921:40;;-1:-1:-1;;;;;2976:34:1;;3012:22;;;2973:62;2970:88;;;3038:18;;:::i;:::-;3074:2;3067:22;-1:-1:-1;;2846:249:1:o;3100:556::-;3143:5;3196:3;3189:4;3181:6;3177:17;3173:27;3163:55;;3214:1;3211;3204:12;3163:55;3250:6;3237:20;-1:-1:-1;;;;;3272:2:1;3269:26;3266:52;;;3298:18;;:::i;:::-;3347:2;3341:9;3359:67;3414:2;3395:13;;-1:-1:-1;;3391:27:1;3420:4;3387:38;3341:9;3359:67;:::i;:::-;3450:2;3442:6;3435:18;3496:3;3489:4;3484:2;3476:6;3472:15;3468:26;3465:35;3462:55;;;3513:1;3510;3503:12;3462:55;3577:2;3570:4;3562:6;3558:17;3551:4;3543:6;3539:17;3526:54;3624:1;3600:15;;;3617:4;3596:26;3589:37;;;;3604:6;3100:556;-1:-1:-1;;;3100:556:1:o;3661:390::-;3739:6;3747;3800:2;3788:9;3779:7;3775:23;3771:32;3768:52;;;3816:1;3813;3806:12;3768:52;3852:9;3839:23;3829:33;;3913:2;3902:9;3898:18;3885:32;-1:-1:-1;;;;;3932:6:1;3929:30;3926:50;;;3972:1;3969;3962:12;3926:50;3995;4037:7;4028:6;4017:9;4013:22;3995:50;:::i;:::-;3985:60;;;3661:390;;;;;:::o;4056:248::-;4124:6;4132;4185:2;4173:9;4164:7;4160:23;4156:32;4153:52;;;4201:1;4198;4191:12;4153:52;-1:-1:-1;;4224:23:1;;;4294:2;4279:18;;;4266:32;;-1:-1:-1;4056:248:1:o;4588:183::-;4648:4;-1:-1:-1;;;;;4673:6:1;4670:30;4667:56;;;4703:18;;:::i;:::-;-1:-1:-1;4748:1:1;4744:14;4760:4;4740:25;;4588:183::o;4776:724::-;4830:5;4883:3;4876:4;4868:6;4864:17;4860:27;4850:55;;4901:1;4898;4891:12;4850:55;4937:6;4924:20;4963:4;4986:43;5026:2;4986:43;:::i;:::-;5058:2;5052:9;5070:31;5098:2;5090:6;5070:31;:::i;:::-;5136:18;;;5228:1;5224:10;;;;5212:23;;5208:32;;;5170:15;;;;-1:-1:-1;5252:15:1;;;5249:35;;;5280:1;5277;5270:12;5249:35;5316:2;5308:6;5304:15;5328:142;5344:6;5339:3;5336:15;5328:142;;;5410:17;;5398:30;;5448:12;;;;5361;;5328:142;;;-1:-1:-1;5488:6:1;4776:724;-1:-1:-1;;;;;;4776:724:1:o;5505:944::-;5659:6;5667;5675;5683;5691;5744:3;5732:9;5723:7;5719:23;5715:33;5712:53;;;5761:1;5758;5751:12;5712:53;5784:29;5803:9;5784:29;:::i;:::-;5774:39;;5832:38;5866:2;5855:9;5851:18;5832:38;:::i;:::-;5822:48;;5921:2;5910:9;5906:18;5893:32;-1:-1:-1;;;;;5985:2:1;5977:6;5974:14;5971:34;;;6001:1;5998;5991:12;5971:34;6024:61;6077:7;6068:6;6057:9;6053:22;6024:61;:::i;:::-;6014:71;;6138:2;6127:9;6123:18;6110:32;6094:48;;6167:2;6157:8;6154:16;6151:36;;;6183:1;6180;6173:12;6151:36;6206:63;6261:7;6250:8;6239:9;6235:24;6206:63;:::i;:::-;6196:73;;6322:3;6311:9;6307:19;6294:33;6278:49;;6352:2;6342:8;6339:16;6336:36;;;6368:1;6365;6358:12;6336:36;;6391:52;6435:7;6424:8;6413:9;6409:24;6391:52;:::i;:::-;6381:62;;;5505:944;;;;;;;;:::o;6454:322::-;6531:6;6539;6547;6600:2;6588:9;6579:7;6575:23;6571:32;6568:52;;;6616:1;6613;6606:12;6568:52;6639:29;6658:9;6639:29;:::i;:::-;6629:39;6715:2;6700:18;;6687:32;;-1:-1:-1;6766:2:1;6751:18;;;6738:32;;6454:322;-1:-1:-1;;;6454:322:1:o;7021:730::-;7075:5;7128:3;7121:4;7113:6;7109:17;7105:27;7095:55;;7146:1;7143;7136:12;7095:55;7182:6;7169:20;7208:4;7231:43;7271:2;7231:43;:::i;:::-;7303:2;7297:9;7315:31;7343:2;7335:6;7315:31;:::i;:::-;7381:18;;;7473:1;7469:10;;;;7457:23;;7453:32;;;7415:15;;;;-1:-1:-1;7497:15:1;;;7494:35;;;7525:1;7522;7515:12;7494:35;7561:2;7553:6;7549:15;7573:148;7589:6;7584:3;7581:15;7573:148;;;7655:23;7674:3;7655:23;:::i;:::-;7643:36;;7699:12;;;;7606;;7573:148;;7756:595;7874:6;7882;7935:2;7923:9;7914:7;7910:23;7906:32;7903:52;;;7951:1;7948;7941:12;7903:52;7991:9;7978:23;-1:-1:-1;;;;;8061:2:1;8053:6;8050:14;8047:34;;;8077:1;8074;8067:12;8047:34;8100:61;8153:7;8144:6;8133:9;8129:22;8100:61;:::i;:::-;8090:71;;8214:2;8203:9;8199:18;8186:32;8170:48;;8243:2;8233:8;8230:16;8227:36;;;8259:1;8256;8249:12;8227:36;;8282:63;8337:7;8326:8;8315:9;8311:24;8282:63;:::i;8356:435::-;8409:3;8447:5;8441:12;8474:6;8469:3;8462:19;8500:4;8529:2;8524:3;8520:12;8513:19;;8566:2;8559:5;8555:14;8587:1;8597:169;8611:6;8608:1;8605:13;8597:169;;;8672:13;;8660:26;;8706:12;;;;8741:15;;;;8633:1;8626:9;8597:169;;;-1:-1:-1;8782:3:1;;8356:435;-1:-1:-1;;;;;8356:435:1:o;8796:261::-;8975:2;8964:9;8957:21;8938:4;8995:56;9047:2;9036:9;9032:18;9024:6;8995:56;:::i;9062:322::-;9131:6;9184:2;9172:9;9163:7;9159:23;9155:32;9152:52;;;9200:1;9197;9190:12;9152:52;9240:9;9227:23;-1:-1:-1;;;;;9265:6:1;9262:30;9259:50;;;9305:1;9302;9295:12;9259:50;9328;9370:7;9361:6;9350:9;9346:22;9328:50;:::i;:::-;9318:60;9062:322;-1:-1:-1;;;;9062:322:1:o;9389:663::-;9516:6;9524;9532;9585:2;9573:9;9564:7;9560:23;9556:32;9553:52;;;9601:1;9598;9591:12;9553:52;9641:9;9628:23;-1:-1:-1;;;;;9711:2:1;9703:6;9700:14;9697:34;;;9727:1;9724;9717:12;9697:34;9750:61;9803:7;9794:6;9783:9;9779:22;9750:61;:::i;:::-;9740:71;;9858:2;9847:9;9843:18;9830:32;9820:42;;9915:2;9904:9;9900:18;9887:32;9871:48;;9944:2;9934:8;9931:16;9928:36;;;9960:1;9957;9950:12;9928:36;;9983:63;10038:7;10027:8;10016:9;10012:24;9983:63;:::i;:::-;9973:73;;;9389:663;;;;;:::o;10265:118::-;10351:5;10344:13;10337:21;10330:5;10327:32;10317:60;;10373:1;10370;10363:12;10388:315;10453:6;10461;10514:2;10502:9;10493:7;10489:23;10485:32;10482:52;;;10530:1;10527;10520:12;10482:52;10553:29;10572:9;10553:29;:::i;:::-;10543:39;;10632:2;10621:9;10617:18;10604:32;10645:28;10667:5;10645:28;:::i;10708:254::-;10776:6;10784;10837:2;10825:9;10816:7;10812:23;10808:32;10805:52;;;10853:1;10850;10843:12;10805:52;10889:9;10876:23;10866:33;;10918:38;10952:2;10941:9;10937:18;10918:38;:::i;:::-;10908:48;;10708:254;;;;;:::o;10967:241::-;11023:6;11076:2;11064:9;11055:7;11051:23;11047:32;11044:52;;;11092:1;11089;11082:12;11044:52;11131:9;11118:23;11150:28;11172:5;11150:28;:::i;11213:309::-;11278:6;11286;11339:2;11327:9;11318:7;11314:23;11310:32;11307:52;;;11355:1;11352;11345:12;11307:52;11391:9;11378:23;11368:33;;11451:2;11440:9;11436:18;11423:32;11464:28;11486:5;11464:28;:::i;11527:260::-;11595:6;11603;11656:2;11644:9;11635:7;11631:23;11627:32;11624:52;;;11672:1;11669;11662:12;11624:52;11695:29;11714:9;11695:29;:::i;:::-;11685:39;;11743:38;11777:2;11766:9;11762:18;11743:38;:::i;11792:607::-;11896:6;11904;11912;11920;11928;11981:3;11969:9;11960:7;11956:23;11952:33;11949:53;;;11998:1;11995;11988:12;11949:53;12021:29;12040:9;12021:29;:::i;:::-;12011:39;;12069:38;12103:2;12092:9;12088:18;12069:38;:::i;:::-;12059:48;;12154:2;12143:9;12139:18;12126:32;12116:42;;12205:2;12194:9;12190:18;12177:32;12167:42;;12260:3;12249:9;12245:19;12232:33;-1:-1:-1;;;;;12280:6:1;12277:30;12274:50;;;12320:1;12317;12310:12;12274:50;12343;12385:7;12376:6;12365:9;12361:22;12343:50;:::i;12815:380::-;12894:1;12890:12;;;;12937;;;12958:61;;13012:4;13004:6;13000:17;12990:27;;12958:61;13065:2;13057:6;13054:14;13034:18;13031:38;13028:161;;13111:10;13106:3;13102:20;13099:1;13092:31;13146:4;13143:1;13136:15;13174:4;13171:1;13164:15;13028:161;;12815:380;;;:::o;13326:1020::-;13502:3;13531:1;13564:6;13558:13;13594:36;13620:9;13594:36;:::i;:::-;13649:1;13666:18;;;13693:133;;;;13840:1;13835:356;;;;13659:532;;13693:133;-1:-1:-1;;13726:24:1;;13714:37;;13799:14;;13792:22;13780:35;;13771:45;;;-1:-1:-1;13693:133:1;;13835:356;13866:6;13863:1;13856:17;13896:4;13941:2;13938:1;13928:16;13966:1;13980:165;13994:6;13991:1;13988:13;13980:165;;;14072:14;;14059:11;;;14052:35;14115:16;;;;14009:10;;13980:165;;;13984:3;;;14174:6;14169:3;14165:16;14158:23;;13659:532;;;;;14222:6;14216:13;14238:68;14297:8;14292:3;14285:4;14277:6;14273:17;14238:68;:::i;:::-;14322:18;;13326:1020;-1:-1:-1;;;;13326:1020:1:o;15038:127::-;15099:10;15094:3;15090:20;15087:1;15080:31;15130:4;15127:1;15120:15;15154:4;15151:1;15144:15;15170:168;15243:9;;;15274;;15291:15;;;15285:22;;15271:37;15261:71;;15312:18;;:::i;15696:125::-;15761:9;;;15782:10;;;15779:36;;;15795:18;;:::i;15958:217::-;15998:1;16024;16014:132;;16068:10;16063:3;16059:20;16056:1;16049:31;16103:4;16100:1;16093:15;16131:4;16128:1;16121:15;16014:132;-1:-1:-1;16160:9:1;;15958:217::o;16836:245::-;16903:6;16956:2;16944:9;16935:7;16931:23;16927:32;16924:52;;;16972:1;16969;16962:12;16924:52;17004:9;16998:16;17023:28;17045:5;17023:28;:::i;22685:127::-;22746:10;22741:3;22737:20;22734:1;22727:31;22777:4;22774:1;22767:15;22801:4;22798:1;22791:15;22817:135;22856:3;22877:17;;;22874:43;;22897:18;;:::i;:::-;-1:-1:-1;22944:1:1;22933:13;;22817:135::o;23364:611::-;-1:-1:-1;;;23722:3:1;23715:23;23697:3;23767:6;23761:13;23783:74;23850:6;23846:1;23841:3;23837:11;23830:4;23822:6;23818:17;23783:74;:::i;:::-;-1:-1:-1;;;23916:1:1;23876:16;;;;23908:10;;;23901:41;-1:-1:-1;23966:2:1;23958:11;;23364:611;-1:-1:-1;23364:611:1:o;24745:545::-;24847:2;24842:3;24839:11;24836:448;;;24883:1;24908:5;24904:2;24897:17;24953:4;24949:2;24939:19;25023:2;25011:10;25007:19;25004:1;25000:27;24994:4;24990:38;25059:4;25047:10;25044:20;25041:47;;;-1:-1:-1;25082:4:1;25041:47;25137:2;25132:3;25128:12;25125:1;25121:20;25115:4;25111:31;25101:41;;25192:82;25210:2;25203:5;25200:13;25192:82;;;25255:17;;;25236:1;25225:13;25192:82;;25466:1352;25592:3;25586:10;-1:-1:-1;;;;;25611:6:1;25608:30;25605:56;;;25641:18;;:::i;:::-;25670:97;25760:6;25720:38;25752:4;25746:11;25720:38;:::i;:::-;25714:4;25670:97;:::i;:::-;25822:4;;25886:2;25875:14;;25903:1;25898:663;;;;26605:1;26622:6;26619:89;;;-1:-1:-1;26674:19:1;;;26668:26;26619:89;-1:-1:-1;;25423:1:1;25419:11;;;25415:24;25411:29;25401:40;25447:1;25443:11;;;25398:57;26721:81;;25868:944;;25898:663;13273:1;13266:14;;;13310:4;13297:18;;-1:-1:-1;;25934:20:1;;;26052:236;26066:7;26063:1;26060:14;26052:236;;;26155:19;;;26149:26;26134:42;;26247:27;;;;26215:1;26203:14;;;;26082:19;;26052:236;;;26056:3;26316:6;26307:7;26304:19;26301:201;;;26377:19;;;26371:26;-1:-1:-1;;26460:1:1;26456:14;;;26472:3;26452:24;26448:37;26444:42;26429:58;26414:74;;26301:201;-1:-1:-1;;;;;26548:1:1;26532:14;;;26528:22;26515:36;;-1:-1:-1;25466:1352:1:o;28199:624::-;-1:-1:-1;;;28557:3:1;28550:23;28532:3;28602:6;28596:13;28618:74;28685:6;28681:1;28676:3;28672:11;28665:4;28657:6;28653:17;28618:74;:::i;:::-;28755:34;28751:1;28711:16;;;;28743:10;;;28736:54;-1:-1:-1;28814:2:1;28806:11;;28199:624;-1:-1:-1;28199:624:1:o;28828:410::-;29030:2;29012:21;;;29069:2;29049:18;;;29042:30;29108:34;29103:2;29088:18;;29081:62;-1:-1:-1;;;29174:2:1;29159:18;;29152:44;29228:3;29213:19;;28828:410::o;30462:1050::-;30974:66;30969:3;30962:79;30944:3;31070:6;31064:13;31086:75;31154:6;31149:2;31144:3;31140:12;31133:4;31125:6;31121:17;31086:75;:::i;:::-;-1:-1:-1;;;31220:2:1;31180:16;;;31212:11;;;31205:71;31301:13;;31323:76;31301:13;31385:2;31377:11;;31370:4;31358:17;;31323:76;:::i;:::-;-1:-1:-1;;;31459:2:1;31418:17;;;;31451:11;;;31444:35;31503:2;31495:11;;30462:1050;-1:-1:-1;;;;30462:1050:1:o;31517:461::-;31779:31;31774:3;31767:44;31749:3;31840:6;31834:13;31856:75;31924:6;31919:2;31914:3;31910:12;31903:4;31895:6;31891:17;31856:75;:::i;:::-;31951:16;;;;31969:2;31947:25;;31517:461;-1:-1:-1;;31517:461:1:o;31983:136::-;32022:3;32050:5;32040:39;;32059:18;;:::i;:::-;-1:-1:-1;;;32095:18:1;;31983:136::o;32485:561::-;-1:-1:-1;;;;;32782:15:1;;;32764:34;;32834:15;;32829:2;32814:18;;32807:43;32881:2;32866:18;;32859:34;;;32924:2;32909:18;;32902:34;;;32744:3;32967;32952:19;;32945:32;;;32707:4;;32994:46;;33020:19;;33012:6;32994:46;:::i;:::-;32986:54;32485:561;-1:-1:-1;;;;;;;32485:561:1:o;33051:249::-;33120:6;33173:2;33161:9;33152:7;33148:23;33144:32;33141:52;;;33189:1;33186;33179:12;33141:52;33221:9;33215:16;33240:30;33264:5;33240:30;:::i;33305:179::-;33340:3;33382:1;33364:16;33361:23;33358:120;;;33428:1;33425;33422;33407:23;-1:-1:-1;33465:1:1;33459:8;33454:3;33450:18;33358:120;33305:179;:::o;33489:671::-;33528:3;33570:4;33552:16;33549:26;33546:39;;;33489:671;:::o;33546:39::-;33612:2;33606:9;-1:-1:-1;;33677:16:1;33673:25;;33670:1;33606:9;33649:50;33728:4;33722:11;33752:16;-1:-1:-1;;;;;33858:2:1;33851:4;33843:6;33839:17;33836:25;33831:2;33823:6;33820:14;33817:45;33814:58;;;33865:5;;;;;33489:671;:::o;33814:58::-;33902:6;33896:4;33892:17;33881:28;;33938:3;33932:10;33965:2;33957:6;33954:14;33951:27;;;33971:5;;;;;;33489:671;:::o;33951:27::-;34055:2;34036:16;34030:4;34026:27;34022:36;34015:4;34006:6;34001:3;33997:16;33993:27;33990:69;33987:82;;;34062:5;;;;;;33489:671;:::o;33987:82::-;34078:57;34129:4;34120:6;34112;34108:19;34104:30;34098:4;34078:57;:::i;:::-;-1:-1:-1;34151:3:1;;33489:671;-1:-1:-1;;;;;33489:671:1:o;34586:404::-;34788:2;34770:21;;;34827:2;34807:18;;;34800:30;34866:34;34861:2;34846:18;;34839:62;-1:-1:-1;;;34932:2:1;34917:18;;34910:38;34980:3;34965:19;;34586:404::o;35404:401::-;35606:2;35588:21;;;35645:2;35625:18;;;35618:30;35684:34;35679:2;35664:18;;35657:62;-1:-1:-1;;;35750:2:1;35735:18;;35728:35;35795:3;35780:19;;35404:401::o;35810:406::-;36012:2;35994:21;;;36051:2;36031:18;;;36024:30;36090:34;36085:2;36070:18;;36063:62;-1:-1:-1;;;36156:2:1;36141:18;;36134:40;36206:3;36191:19;;35810:406::o;36221:465::-;36478:2;36467:9;36460:21;36441:4;36504:56;36556:2;36545:9;36541:18;36533:6;36504:56;:::i;:::-;36608:9;36600:6;36596:22;36591:2;36580:9;36576:18;36569:50;36636:44;36673:6;36665;36636:44;:::i;:::-;36628:52;36221:465;-1:-1:-1;;;;;36221:465:1:o;36691:827::-;-1:-1:-1;;;;;37088:15:1;;;37070:34;;37140:15;;37135:2;37120:18;;37113:43;37050:3;37187:2;37172:18;;37165:31;;;37013:4;;37219:57;;37256:19;;37248:6;37219:57;:::i;:::-;37324:9;37316:6;37312:22;37307:2;37296:9;37292:18;37285:50;37358:44;37395:6;37387;37358:44;:::i;:::-;37344:58;;37451:9;37443:6;37439:22;37433:3;37422:9;37418:19;37411:51;37479:33;37505:6;37497;37479:33;:::i;:::-;37471:41;36691:827;-1:-1:-1;;;;;;;;36691:827:1:o

Swarm Source

ipfs://c403ed69b558a876595eb1d3ba68bc258e5c1d0c67a5f5396133854193459cc2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.