ETH Price: $3,271.12 (-4.08%)
Gas: 9 Gwei

Token

AokiGTAnthem (PISS)
 

Overview

Max Total Supply

500 PISS

Holders

360

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mf2f5.eth
0xf96a23502c48b3c7ee053db35367ee9b7660f2f5
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:
AokiGTAnthem

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-25
*/

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

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @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] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
// File: 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: 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() {
        _setOwner(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: Address.sol



pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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 functionCall(target, data, "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");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: IERC721Receiver.sol



pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
// File: 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: 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.
        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. 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: 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 be 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: 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: 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: 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: balance query for the zero address");
        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 {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 owner nor 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: transfer caller is not owner nor 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();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), 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);

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

        _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 `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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);

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

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

        emit TransferSingle(operator, account, address(0), id, amount);
    }

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

        address operator = _msgSender();

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

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

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

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @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 `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 _beforeTokenTransfer(
        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(to).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(to).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: IERC721.sol



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}
// File: IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: ERC721.sol


pragma solidity ^0.8.10;







abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    string private _name;
    string private _symbol;
    address[] internal _owners;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;     
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }     
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        uint count = 0;
        uint length = _owners.length;
        for( uint i = 0; i < length; ++i ){
          if( owner == _owners[i] ){
            ++count;
          }
        }
        delete length;
        return count;
    }
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }     
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }
	function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }
	function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }
	function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }
	function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }
	function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);
        _owners.push(to);

        emit Transfer(address(0), to, tokenId);
    }
	function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }
	function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
	function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }
	function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
	function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

pragma solidity ^0.8.0;

abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

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

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

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

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

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

// File: ERC721Enumerable.sol


pragma solidity ^0.8.10;


abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) {
        require(index < ERC721.balanceOf(owner), "ERC721Enum: owner ioob");
        uint count;
        for( uint i; i < _owners.length; ++i ){
            if( owner == _owners[i] ){
                if( count == index )
                    return i;
                else
                    ++count;
            }
        }
        require(false, "ERC721Enum: owner ioob");
    }
    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        require(0 < ERC721.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }
    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enum: global ioob");
        return index;
    }
}

// File: ECDSA.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

pragma solidity ^0.8.9;

contract AokiGTAnthem is ERC1155, Ownable {
	using Strings for string;

	mapping(address => bool) public hevyooBINheararreddy;
    mapping(bytes32 => bool) public howYOOgotinnahear;

    address private unkaSTEEVzbakpokket = 0x01d7cFB4bcEb9Dd6e917B59434590698c953e36C;

	uint256 public BEETSONDAFLOOR = 521;
    uint256 public donbefukkingreedy = 1;

	string public _stufwatmakesdapicherz;
	bool public GOorNO = false;
    uint public lossastompinz;

    string waddawekallit_;
    string gimmedat_;   

	constructor() ERC1155(_stufwatmakesdapicherz) { waddawekallit_ = "AokiGTAnthem"; gimmedat_ = "PISS"; }

    modifier iZunkaSTEEVzbakpokketn {
        require(msg.sender == unkaSTEEVzbakpokket);
     _;
    }

    function MAKEdatSWEATmoozik(address plaseweartingshappn, bytes calldata sekretwordzes) external {		
	   require(GOorNO);
       require(lossastompinz + 1 <= BEETSONDAFLOOR);
       require(msg.sender == plaseweartingshappn);
       require(hevyooBINheararreddy[plaseweartingshappn] == false);
       hevyooBINheararreddy[plaseweartingshappn] = true;

       bytes32 makkewlfraze = keccak256(abi.encodePacked(plaseweartingshappn));
       require(howYOOgotinnahear[makkewlfraze] == false);
       require(_verifySignature(unkaSTEEVzbakpokket, makkewlfraze, sekretwordzes));
       howYOOgotinnahear[makkewlfraze] = true;
 
       _mint(msg.sender, 0, 1, "");
       lossastompinz += 1;
    }

    function POOdatSWEATmoozik(address[] calldata plaseweartingshappn) public iZunkaSTEEVzbakpokketn {	

        require(lossastompinz + plaseweartingshappn.length <= BEETSONDAFLOOR);	

		for(uint256 x = 0; x < plaseweartingshappn.length; x++) {
        _mint(plaseweartingshappn[x], 0, 1, "");
        }

        lossastompinz += plaseweartingshappn.length;
    }

	function makGOorNO(bool _doodoo) external iZunkaSTEEVzbakpokketn {
		GOorNO = _doodoo;
	}

	function makePicherz(string memory makesdapicherz) public iZunkaSTEEVzbakpokketn {
		_stufwatmakesdapicherz = makesdapicherz;
	}
 
    function setSteevzPokket(address _newtroll) external iZunkaSTEEVzbakpokketn {
       unkaSTEEVzbakpokket = _newtroll;
    }   

	function uri(uint256 tokenId) public view override returns (string memory) {
        require(tokenId == 0);
		return _stufwatmakesdapicherz;
	}

    function name() public view returns (string memory) {
        return waddawekallit_;
    }

    function symbol() public view returns (string memory) {
        return gimmedat_;
    }    

    function _verifySignature(address unkaSTEEV, bytes32 makkewlfraze, bytes memory sekretwordzes) private pure returns (bool) {
       return unkaSTEEV == ECDSA.recover(ECDSA.toEthSignedMessageHash(makkewlfraze), sekretwordzes);
    }

	function withdrawToOwner() external onlyOwner {
		payable(msg.sender).transfer(address(this).balance);
	}

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"BEETSONDAFLOOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOorNO","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"plaseweartingshappn","type":"address"},{"internalType":"bytes","name":"sekretwordzes","type":"bytes"}],"name":"MAKEdatSWEATmoozik","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"plaseweartingshappn","type":"address[]"}],"name":"POOdatSWEATmoozik","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_stufwatmakesdapicherz","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"donbefukkingreedy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hevyooBINheararreddy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"howYOOgotinnahear","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lossastompinz","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_doodoo","type":"bool"}],"name":"makGOorNO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"makesdapicherz","type":"string"}],"name":"makePicherz","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newtroll","type":"address"}],"name":"setSteevzPokket","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":"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":"withdrawToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527301d7cfb4bceb9dd6e917b59434590698c953e36c600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061020960075560016008556000600a60006101000a81548160ff0219169083151502179055503480156200008c57600080fd5b50600980546200009c90620003bd565b80601f0160208091040260200160405190810160405280929190818152602001828054620000ca90620003bd565b80156200011b5780601f10620000ef576101008083540402835291602001916200011b565b820191906000526020600020905b815481529060010190602001808311620000fd57829003601f168201915b50505050506200013181620001f460201b60201c565b5062000152620001466200021060201b60201c565b6200021860201b60201c565b6040518060400160405280600c81526020017f416f6b694754416e7468656d0000000000000000000000000000000000000000815250600c90805190602001906200019f929190620002de565b506040518060400160405280600481526020017f5049535300000000000000000000000000000000000000000000000000000000815250600d9080519060200190620001ed929190620002de565b50620003f2565b80600290805190602001906200020c929190620002de565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002ec90620003bd565b90600052602060002090601f0160209004810192826200031057600085556200035c565b82601f106200032b57805160ff19168380011785556200035c565b828001600101855582156200035c579182015b828111156200035b5782518255916020019190600101906200033e565b5b5090506200036b91906200036f565b5090565b5b808211156200038a57600081600090555060010162000370565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003d657607f821691505b602082108103620003ec57620003eb6200038e565b5b50919050565b6141a480620004026000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80635c1d7e14116100de578063a22cb46511610097578063da66505411610071578063da6650541461045c578063e985e9c51461047a578063f242432a146104aa578063f2fde38b146104c65761018d565b8063a22cb46514610404578063bb25e25e14610420578063d02c1e291461043e5761018d565b80635c1d7e14146103545780635cae68a114610384578063715018a6146103a05780638da5cb5b146103aa5780639204fafe146103c857806395d89b41146103e65761018d565b806324c0c5ee1161014b57806335eedda71161012557806335eedda7146102e25780633cb40e16146102fe5780634e1273f4146103085780635379db5b146103385761018d565b806324c0c5ee1461027a57806326300326146102965780632eb2c2d6146102c65761018d565b8062fdd58e1461019257806301ffc9a7146101c257806302e6ac0c146101f257806306fdde03146102105780630e89341c1461022e578063196c3c2d1461025e575b600080fd5b6101ac60048036038101906101a79190612754565b6104e2565b6040516101b991906127a3565b60405180910390f35b6101dc60048036038101906101d79190612816565b6105aa565b6040516101e9919061285e565b60405180910390f35b6101fa61068c565b604051610207919061285e565b60405180910390f35b61021861069f565b6040516102259190612912565b60405180910390f35b61024860048036038101906102439190612934565b610731565b6040516102559190612912565b60405180910390f35b610278600480360381019061027391906129c6565b6107d2565b005b610294600480360381019061028f9190612a13565b6108d1565b005b6102b060048036038101906102ab9190612a13565b61096f565b6040516102bd919061285e565b60405180910390f35b6102e060048036038101906102db9190612c33565b61098f565b005b6102fc60048036038101906102f79190612d58565b610a30565b005b610306610c92565b005b610322600480360381019061031d9190612e7b565b610d57565b60405161032f9190612fb1565b60405180910390f35b610352600480360381019061034d9190613074565b610e70565b005b61036e600480360381019061036991906130f3565b610ee4565b60405161037b919061285e565b60405180910390f35b61039e6004803603810190610399919061314c565b610f04565b005b6103a8610f7b565b005b6103b2611003565b6040516103bf9190613188565b60405180910390f35b6103d061102d565b6040516103dd91906127a3565b60405180910390f35b6103ee611033565b6040516103fb9190612912565b60405180910390f35b61041e600480360381019061041991906131a3565b6110c5565b005b610428611245565b60405161043591906127a3565b60405180910390f35b61044661124b565b60405161045391906127a3565b60405180910390f35b610464611251565b6040516104719190612912565b60405180910390f35b610494600480360381019061048f91906131e3565b6112df565b6040516104a1919061285e565b60405180910390f35b6104c460048036038101906104bf9190613223565b611373565b005b6104e060048036038101906104db9190612a13565b611414565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610552576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105499061332c565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067557507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061068557506106848261150b565b5b9050919050565b600a60009054906101000a900460ff1681565b6060600c80546106ae9061337b565b80601f01602080910402602001604051908101604052809291908181526020018280546106da9061337b565b80156107275780601f106106fc57610100808354040283529160200191610727565b820191906000526020600020905b81548152906001019060200180831161070a57829003601f168201915b5050505050905090565b60606000821461074057600080fd5b6009805461074d9061337b565b80601f01602080910402602001604051908101604052809291908181526020018280546107799061337b565b80156107c65780601f1061079b576101008083540402835291602001916107c6565b820191906000526020600020905b8154815290600101906020018083116107a957829003601f168201915b50505050509050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461082c57600080fd5b60075482829050600b5461084091906133db565b111561084b57600080fd5b60005b828290508110156108b05761089d83838381811061086f5761086e613431565b5b90506020020160208101906108849190612a13565b6000600160405180602001604052806000815250611575565b80806108a890613460565b91505061084e565b5081819050600b60008282546108c691906133db565b925050819055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461092b57600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60046020528060005260406000206000915054906101000a900460ff1681565b61099761170a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806109dd57506109dc856109d761170a565b6112df565b5b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a139061351a565b60405180910390fd5b610a298585858585611712565b5050505050565b600a60009054906101000a900460ff16610a4957600080fd5b6007546001600b54610a5b91906133db565b1115610a6657600080fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a9e57600080fd5b60001515600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610afb57600080fd5b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600083604051602001610b669190613582565b604051602081830303815290604052805190602001209050600015156005600083815260200190815260200160002060009054906101000a900460ff16151514610baf57600080fd5b610c20600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611a25565b610c2957600080fd5b60016005600083815260200190815260200160002060006101000a81548160ff021916908315150217905550610c72336000600160405180602001604052806000815250611575565b6001600b6000828254610c8591906133db565b9250508190555050505050565b610c9a61170a565b73ffffffffffffffffffffffffffffffffffffffff16610cb8611003565b73ffffffffffffffffffffffffffffffffffffffff1614610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d05906135e9565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d54573d6000803e3d6000fd5b50565b60608151835114610d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d949061367b565b60405180910390fd5b6000835167ffffffffffffffff811115610dba57610db9612a40565b5b604051908082528060200260200182016040528015610de85781602001602082028036833780820191505090505b50905060005b8451811015610e6557610e35858281518110610e0d57610e0c613431565b5b6020026020010151858381518110610e2857610e27613431565b5b60200260200101516104e2565b828281518110610e4857610e47613431565b5b60200260200101818152505080610e5e90613460565b9050610dee565b508091505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eca57600080fd5b8060099080519060200190610ee0929190612609565b5050565b60056020528060005260406000206000915054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f5e57600080fd5b80600a60006101000a81548160ff02191690831515021790555050565b610f8361170a565b73ffffffffffffffffffffffffffffffffffffffff16610fa1611003565b73ffffffffffffffffffffffffffffffffffffffff1614610ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fee906135e9565b60405180910390fd5b6110016000611a70565b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b5481565b6060600d80546110429061337b565b80601f016020809104026020016040519081016040528092919081815260200182805461106e9061337b565b80156110bb5780601f10611090576101008083540402835291602001916110bb565b820191906000526020600020905b81548152906001019060200180831161109e57829003601f168201915b5050505050905090565b8173ffffffffffffffffffffffffffffffffffffffff166110e461170a565b73ffffffffffffffffffffffffffffffffffffffff160361113a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111319061370d565b60405180910390fd5b806001600061114761170a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111f461170a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611239919061285e565b60405180910390a35050565b60075481565b60085481565b6009805461125e9061337b565b80601f016020809104026020016040519081016040528092919081815260200182805461128a9061337b565b80156112d75780601f106112ac576101008083540402835291602001916112d7565b820191906000526020600020905b8154815290600101906020018083116112ba57829003601f168201915b505050505081565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61137b61170a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806113c157506113c0856113bb61170a565b6112df565b5b611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f79061379f565b60405180910390fd5b61140d8585858585611b36565b5050505050565b61141c61170a565b73ffffffffffffffffffffffffffffffffffffffff1661143a611003565b73ffffffffffffffffffffffffffffffffffffffff1614611490576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611487906135e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690613831565b60405180910390fd5b61150881611a70565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db906138c3565b60405180910390fd5b60006115ee61170a565b905061160f8160008761160088611db7565b61160988611db7565b87611e31565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461166e91906133db565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516116ec9291906138e3565b60405180910390a461170381600087878787611e39565b5050505050565b600033905090565b8151835114611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d9061397e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc90613a10565b60405180910390fd5b60006117cf61170a565b90506117df818787878787611e31565b60005b8451811015611990576000858281518110611800576117ff613431565b5b60200260200101519050600085838151811061181f5761181e613431565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b790613aa2565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461197591906133db565b925050819055505050508061198990613460565b90506117e2565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611a07929190613ac2565b60405180910390a4611a1d818787878787612010565b505050505050565b6000611a39611a33846121e7565b83612217565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161490509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9c90613a10565b60405180910390fd5b6000611baf61170a565b9050611bcf818787611bc088611db7565b611bc988611db7565b87611e31565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5d90613aa2565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d1b91906133db565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051611d989291906138e3565b60405180910390a4611dae828888888888611e39565b50505050505050565b60606000600167ffffffffffffffff811115611dd657611dd5612a40565b5b604051908082528060200260200182016040528015611e045781602001602082028036833780820191505090505b5090508281600081518110611e1c57611e1b613431565b5b60200260200101818152505080915050919050565b505050505050565b611e588473ffffffffffffffffffffffffffffffffffffffff1661223e565b15612008578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611e9e959493929190613b4e565b6020604051808303816000875af1925050508015611eda57506040513d601f19601f82011682018060405250810190611ed79190613bbd565b60015b611f7f57611ee6613bf7565b806308c379a003611f425750611efa613c19565b80611f055750611f44565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f399190612912565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7690613d1b565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffd90613dad565b60405180910390fd5b505b505050505050565b61202f8473ffffffffffffffffffffffffffffffffffffffff1661223e565b156121df578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612075959493929190613dcd565b6020604051808303816000875af19250505080156120b157506040513d601f19601f820116820180604052508101906120ae9190613bbd565b60015b612156576120bd613bf7565b806308c379a00361211957506120d1613c19565b806120dc575061211b565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121109190612912565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d90613d1b565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146121dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d490613dad565b60405180910390fd5b505b505050505050565b6000816040516020016121fa9190613ead565b604051602081830303815290604052805190602001209050919050565b60008060006122268585612251565b91509150612233816122d2565b819250505092915050565b600080823b905060008111915050919050565b60008060418351036122925760008060006020860151925060408601519150606086015160001a90506122868782858561249e565b945094505050506122cb565b60408351036122c25760008060208501519150604085015190506122b78683836125aa565b9350935050506122cb565b60006002915091505b9250929050565b600060048111156122e6576122e5613ed3565b5b8160048111156122f9576122f8613ed3565b5b031561249b576001600481111561231357612312613ed3565b5b81600481111561232657612325613ed3565b5b03612366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235d90613f4e565b60405180910390fd5b6002600481111561237a57612379613ed3565b5b81600481111561238d5761238c613ed3565b5b036123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c490613fba565b60405180910390fd5b600360048111156123e1576123e0613ed3565b5b8160048111156123f4576123f3613ed3565b5b03612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b9061404c565b60405180910390fd5b60048081111561244757612446613ed3565b5b81600481111561245a57612459613ed3565b5b0361249a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612491906140de565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156124d95760006003915091506125a1565b601b8560ff16141580156124f15750601c8560ff1614155b156125035760006004915091506125a1565b6000600187878787604051600081526020016040526040516125289493929190614129565b6020604051602081039080840390855afa15801561254a573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612598576000600192509250506125a1565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6125ed91906133db565b90506125fb8782888561249e565b935093505050935093915050565b8280546126159061337b565b90600052602060002090601f016020900481019282612637576000855561267e565b82601f1061265057805160ff191683800117855561267e565b8280016001018555821561267e579182015b8281111561267d578251825591602001919060010190612662565b5b50905061268b919061268f565b5090565b5b808211156126a8576000816000905550600101612690565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126eb826126c0565b9050919050565b6126fb816126e0565b811461270657600080fd5b50565b600081359050612718816126f2565b92915050565b6000819050919050565b6127318161271e565b811461273c57600080fd5b50565b60008135905061274e81612728565b92915050565b6000806040838503121561276b5761276a6126b6565b5b600061277985828601612709565b925050602061278a8582860161273f565b9150509250929050565b61279d8161271e565b82525050565b60006020820190506127b86000830184612794565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127f3816127be565b81146127fe57600080fd5b50565b600081359050612810816127ea565b92915050565b60006020828403121561282c5761282b6126b6565b5b600061283a84828501612801565b91505092915050565b60008115159050919050565b61285881612843565b82525050565b6000602082019050612873600083018461284f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128b3578082015181840152602081019050612898565b838111156128c2576000848401525b50505050565b6000601f19601f8301169050919050565b60006128e482612879565b6128ee8185612884565b93506128fe818560208601612895565b612907816128c8565b840191505092915050565b6000602082019050818103600083015261292c81846128d9565b905092915050565b60006020828403121561294a576129496126b6565b5b60006129588482850161273f565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261298657612985612961565b5b8235905067ffffffffffffffff8111156129a3576129a2612966565b5b6020830191508360208202830111156129bf576129be61296b565b5b9250929050565b600080602083850312156129dd576129dc6126b6565b5b600083013567ffffffffffffffff8111156129fb576129fa6126bb565b5b612a0785828601612970565b92509250509250929050565b600060208284031215612a2957612a286126b6565b5b6000612a3784828501612709565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a78826128c8565b810181811067ffffffffffffffff82111715612a9757612a96612a40565b5b80604052505050565b6000612aaa6126ac565b9050612ab68282612a6f565b919050565b600067ffffffffffffffff821115612ad657612ad5612a40565b5b602082029050602081019050919050565b6000612afa612af584612abb565b612aa0565b90508083825260208201905060208402830185811115612b1d57612b1c61296b565b5b835b81811015612b465780612b32888261273f565b845260208401935050602081019050612b1f565b5050509392505050565b600082601f830112612b6557612b64612961565b5b8135612b75848260208601612ae7565b91505092915050565b600080fd5b600067ffffffffffffffff821115612b9e57612b9d612a40565b5b612ba7826128c8565b9050602081019050919050565b82818337600083830152505050565b6000612bd6612bd184612b83565b612aa0565b905082815260208101848484011115612bf257612bf1612b7e565b5b612bfd848285612bb4565b509392505050565b600082601f830112612c1a57612c19612961565b5b8135612c2a848260208601612bc3565b91505092915050565b600080600080600060a08688031215612c4f57612c4e6126b6565b5b6000612c5d88828901612709565b9550506020612c6e88828901612709565b945050604086013567ffffffffffffffff811115612c8f57612c8e6126bb565b5b612c9b88828901612b50565b935050606086013567ffffffffffffffff811115612cbc57612cbb6126bb565b5b612cc888828901612b50565b925050608086013567ffffffffffffffff811115612ce957612ce86126bb565b5b612cf588828901612c05565b9150509295509295909350565b60008083601f840112612d1857612d17612961565b5b8235905067ffffffffffffffff811115612d3557612d34612966565b5b602083019150836001820283011115612d5157612d5061296b565b5b9250929050565b600080600060408486031215612d7157612d706126b6565b5b6000612d7f86828701612709565b935050602084013567ffffffffffffffff811115612da057612d9f6126bb565b5b612dac86828701612d02565b92509250509250925092565b600067ffffffffffffffff821115612dd357612dd2612a40565b5b602082029050602081019050919050565b6000612df7612df284612db8565b612aa0565b90508083825260208201905060208402830185811115612e1a57612e1961296b565b5b835b81811015612e435780612e2f8882612709565b845260208401935050602081019050612e1c565b5050509392505050565b600082601f830112612e6257612e61612961565b5b8135612e72848260208601612de4565b91505092915050565b60008060408385031215612e9257612e916126b6565b5b600083013567ffffffffffffffff811115612eb057612eaf6126bb565b5b612ebc85828601612e4d565b925050602083013567ffffffffffffffff811115612edd57612edc6126bb565b5b612ee985828601612b50565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612f288161271e565b82525050565b6000612f3a8383612f1f565b60208301905092915050565b6000602082019050919050565b6000612f5e82612ef3565b612f688185612efe565b9350612f7383612f0f565b8060005b83811015612fa4578151612f8b8882612f2e565b9750612f9683612f46565b925050600181019050612f77565b5085935050505092915050565b60006020820190508181036000830152612fcb8184612f53565b905092915050565b600067ffffffffffffffff821115612fee57612fed612a40565b5b612ff7826128c8565b9050602081019050919050565b600061301761301284612fd3565b612aa0565b90508281526020810184848401111561303357613032612b7e565b5b61303e848285612bb4565b509392505050565b600082601f83011261305b5761305a612961565b5b813561306b848260208601613004565b91505092915050565b60006020828403121561308a576130896126b6565b5b600082013567ffffffffffffffff8111156130a8576130a76126bb565b5b6130b484828501613046565b91505092915050565b6000819050919050565b6130d0816130bd565b81146130db57600080fd5b50565b6000813590506130ed816130c7565b92915050565b600060208284031215613109576131086126b6565b5b6000613117848285016130de565b91505092915050565b61312981612843565b811461313457600080fd5b50565b60008135905061314681613120565b92915050565b600060208284031215613162576131616126b6565b5b600061317084828501613137565b91505092915050565b613182816126e0565b82525050565b600060208201905061319d6000830184613179565b92915050565b600080604083850312156131ba576131b96126b6565b5b60006131c885828601612709565b92505060206131d985828601613137565b9150509250929050565b600080604083850312156131fa576131f96126b6565b5b600061320885828601612709565b925050602061321985828601612709565b9150509250929050565b600080600080600060a0868803121561323f5761323e6126b6565b5b600061324d88828901612709565b955050602061325e88828901612709565b945050604061326f8882890161273f565b93505060606132808882890161273f565b925050608086013567ffffffffffffffff8111156132a1576132a06126bb565b5b6132ad88828901612c05565b9150509295509295909350565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613316602b83612884565b9150613321826132ba565b604082019050919050565b6000602082019050818103600083015261334581613309565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061339357607f821691505b6020821081036133a6576133a561334c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133e68261271e565b91506133f18361271e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613426576134256133ac565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061346b8261271e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361349d5761349c6133ac565b5b600182019050919050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000613504603283612884565b915061350f826134a8565b604082019050919050565b60006020820190508181036000830152613533816134f7565b9050919050565b60008160601b9050919050565b60006135528261353a565b9050919050565b600061356482613547565b9050919050565b61357c613577826126e0565b613559565b82525050565b600061358e828461356b565b60148201915081905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135d3602083612884565b91506135de8261359d565b602082019050919050565b60006020820190508181036000830152613602816135c6565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000613665602983612884565b915061367082613609565b604082019050919050565b6000602082019050818103600083015261369481613658565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006136f7602983612884565b91506137028261369b565b604082019050919050565b60006020820190508181036000830152613726816136ea565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000613789602983612884565b91506137948261372d565b604082019050919050565b600060208201905081810360008301526137b88161377c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061381b602683612884565b9150613826826137bf565b604082019050919050565b6000602082019050818103600083015261384a8161380e565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006138ad602183612884565b91506138b882613851565b604082019050919050565b600060208201905081810360008301526138dc816138a0565b9050919050565b60006040820190506138f86000830185612794565b6139056020830184612794565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000613968602883612884565b91506139738261390c565b604082019050919050565b600060208201905081810360008301526139978161395b565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006139fa602583612884565b9150613a058261399e565b604082019050919050565b60006020820190508181036000830152613a29816139ed565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000613a8c602a83612884565b9150613a9782613a30565b604082019050919050565b60006020820190508181036000830152613abb81613a7f565b9050919050565b60006040820190508181036000830152613adc8185612f53565b90508181036020830152613af08184612f53565b90509392505050565b600081519050919050565b600082825260208201905092915050565b6000613b2082613af9565b613b2a8185613b04565b9350613b3a818560208601612895565b613b43816128c8565b840191505092915050565b600060a082019050613b636000830188613179565b613b706020830187613179565b613b7d6040830186612794565b613b8a6060830185612794565b8181036080830152613b9c8184613b15565b90509695505050505050565b600081519050613bb7816127ea565b92915050565b600060208284031215613bd357613bd26126b6565b5b6000613be184828501613ba8565b91505092915050565b60008160e01c9050919050565b600060033d1115613c165760046000803e613c13600051613bea565b90505b90565b600060443d10613ca657613c2b6126ac565b60043d036004823e80513d602482011167ffffffffffffffff82111715613c53575050613ca6565b808201805167ffffffffffffffff811115613c715750505050613ca6565b80602083010160043d038501811115613c8e575050505050613ca6565b613c9d82602001850186612a6f565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000613d05603483612884565b9150613d1082613ca9565b604082019050919050565b60006020820190508181036000830152613d3481613cf8565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000613d97602883612884565b9150613da282613d3b565b604082019050919050565b60006020820190508181036000830152613dc681613d8a565b9050919050565b600060a082019050613de26000830188613179565b613def6020830187613179565b8181036040830152613e018186612f53565b90508181036060830152613e158185612f53565b90508181036080830152613e298184613b15565b90509695505050505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613e76601c83613e35565b9150613e8182613e40565b601c82019050919050565b6000819050919050565b613ea7613ea2826130bd565b613e8c565b82525050565b6000613eb882613e69565b9150613ec48284613e96565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613f38601883612884565b9150613f4382613f02565b602082019050919050565b60006020820190508181036000830152613f6781613f2b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613fa4601f83612884565b9150613faf82613f6e565b602082019050919050565b60006020820190508181036000830152613fd381613f97565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614036602283612884565b915061404182613fda565b604082019050919050565b6000602082019050818103600083015261406581614029565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006140c8602283612884565b91506140d38261406c565b604082019050919050565b600060208201905081810360008301526140f7816140bb565b9050919050565b614107816130bd565b82525050565b600060ff82169050919050565b6141238161410d565b82525050565b600060808201905061413e60008301876140fe565b61414b602083018661411a565b61415860408301856140fe565b61416560608301846140fe565b9594505050505056fea26469706673582212207c156e67e55ad7399f6d2a934988e404bbcbb936d5ccc428f9ed35d6a2cd364564736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018d5760003560e01c80635c1d7e14116100de578063a22cb46511610097578063da66505411610071578063da6650541461045c578063e985e9c51461047a578063f242432a146104aa578063f2fde38b146104c65761018d565b8063a22cb46514610404578063bb25e25e14610420578063d02c1e291461043e5761018d565b80635c1d7e14146103545780635cae68a114610384578063715018a6146103a05780638da5cb5b146103aa5780639204fafe146103c857806395d89b41146103e65761018d565b806324c0c5ee1161014b57806335eedda71161012557806335eedda7146102e25780633cb40e16146102fe5780634e1273f4146103085780635379db5b146103385761018d565b806324c0c5ee1461027a57806326300326146102965780632eb2c2d6146102c65761018d565b8062fdd58e1461019257806301ffc9a7146101c257806302e6ac0c146101f257806306fdde03146102105780630e89341c1461022e578063196c3c2d1461025e575b600080fd5b6101ac60048036038101906101a79190612754565b6104e2565b6040516101b991906127a3565b60405180910390f35b6101dc60048036038101906101d79190612816565b6105aa565b6040516101e9919061285e565b60405180910390f35b6101fa61068c565b604051610207919061285e565b60405180910390f35b61021861069f565b6040516102259190612912565b60405180910390f35b61024860048036038101906102439190612934565b610731565b6040516102559190612912565b60405180910390f35b610278600480360381019061027391906129c6565b6107d2565b005b610294600480360381019061028f9190612a13565b6108d1565b005b6102b060048036038101906102ab9190612a13565b61096f565b6040516102bd919061285e565b60405180910390f35b6102e060048036038101906102db9190612c33565b61098f565b005b6102fc60048036038101906102f79190612d58565b610a30565b005b610306610c92565b005b610322600480360381019061031d9190612e7b565b610d57565b60405161032f9190612fb1565b60405180910390f35b610352600480360381019061034d9190613074565b610e70565b005b61036e600480360381019061036991906130f3565b610ee4565b60405161037b919061285e565b60405180910390f35b61039e6004803603810190610399919061314c565b610f04565b005b6103a8610f7b565b005b6103b2611003565b6040516103bf9190613188565b60405180910390f35b6103d061102d565b6040516103dd91906127a3565b60405180910390f35b6103ee611033565b6040516103fb9190612912565b60405180910390f35b61041e600480360381019061041991906131a3565b6110c5565b005b610428611245565b60405161043591906127a3565b60405180910390f35b61044661124b565b60405161045391906127a3565b60405180910390f35b610464611251565b6040516104719190612912565b60405180910390f35b610494600480360381019061048f91906131e3565b6112df565b6040516104a1919061285e565b60405180910390f35b6104c460048036038101906104bf9190613223565b611373565b005b6104e060048036038101906104db9190612a13565b611414565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610552576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105499061332c565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067557507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061068557506106848261150b565b5b9050919050565b600a60009054906101000a900460ff1681565b6060600c80546106ae9061337b565b80601f01602080910402602001604051908101604052809291908181526020018280546106da9061337b565b80156107275780601f106106fc57610100808354040283529160200191610727565b820191906000526020600020905b81548152906001019060200180831161070a57829003601f168201915b5050505050905090565b60606000821461074057600080fd5b6009805461074d9061337b565b80601f01602080910402602001604051908101604052809291908181526020018280546107799061337b565b80156107c65780601f1061079b576101008083540402835291602001916107c6565b820191906000526020600020905b8154815290600101906020018083116107a957829003601f168201915b50505050509050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461082c57600080fd5b60075482829050600b5461084091906133db565b111561084b57600080fd5b60005b828290508110156108b05761089d83838381811061086f5761086e613431565b5b90506020020160208101906108849190612a13565b6000600160405180602001604052806000815250611575565b80806108a890613460565b91505061084e565b5081819050600b60008282546108c691906133db565b925050819055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461092b57600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60046020528060005260406000206000915054906101000a900460ff1681565b61099761170a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806109dd57506109dc856109d761170a565b6112df565b5b610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a139061351a565b60405180910390fd5b610a298585858585611712565b5050505050565b600a60009054906101000a900460ff16610a4957600080fd5b6007546001600b54610a5b91906133db565b1115610a6657600080fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a9e57600080fd5b60001515600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610afb57600080fd5b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600083604051602001610b669190613582565b604051602081830303815290604052805190602001209050600015156005600083815260200190815260200160002060009054906101000a900460ff16151514610baf57600080fd5b610c20600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611a25565b610c2957600080fd5b60016005600083815260200190815260200160002060006101000a81548160ff021916908315150217905550610c72336000600160405180602001604052806000815250611575565b6001600b6000828254610c8591906133db565b9250508190555050505050565b610c9a61170a565b73ffffffffffffffffffffffffffffffffffffffff16610cb8611003565b73ffffffffffffffffffffffffffffffffffffffff1614610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d05906135e9565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d54573d6000803e3d6000fd5b50565b60608151835114610d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d949061367b565b60405180910390fd5b6000835167ffffffffffffffff811115610dba57610db9612a40565b5b604051908082528060200260200182016040528015610de85781602001602082028036833780820191505090505b50905060005b8451811015610e6557610e35858281518110610e0d57610e0c613431565b5b6020026020010151858381518110610e2857610e27613431565b5b60200260200101516104e2565b828281518110610e4857610e47613431565b5b60200260200101818152505080610e5e90613460565b9050610dee565b508091505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eca57600080fd5b8060099080519060200190610ee0929190612609565b5050565b60056020528060005260406000206000915054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f5e57600080fd5b80600a60006101000a81548160ff02191690831515021790555050565b610f8361170a565b73ffffffffffffffffffffffffffffffffffffffff16610fa1611003565b73ffffffffffffffffffffffffffffffffffffffff1614610ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fee906135e9565b60405180910390fd5b6110016000611a70565b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b5481565b6060600d80546110429061337b565b80601f016020809104026020016040519081016040528092919081815260200182805461106e9061337b565b80156110bb5780601f10611090576101008083540402835291602001916110bb565b820191906000526020600020905b81548152906001019060200180831161109e57829003601f168201915b5050505050905090565b8173ffffffffffffffffffffffffffffffffffffffff166110e461170a565b73ffffffffffffffffffffffffffffffffffffffff160361113a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111319061370d565b60405180910390fd5b806001600061114761170a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111f461170a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611239919061285e565b60405180910390a35050565b60075481565b60085481565b6009805461125e9061337b565b80601f016020809104026020016040519081016040528092919081815260200182805461128a9061337b565b80156112d75780601f106112ac576101008083540402835291602001916112d7565b820191906000526020600020905b8154815290600101906020018083116112ba57829003601f168201915b505050505081565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61137b61170a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806113c157506113c0856113bb61170a565b6112df565b5b611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f79061379f565b60405180910390fd5b61140d8585858585611b36565b5050505050565b61141c61170a565b73ffffffffffffffffffffffffffffffffffffffff1661143a611003565b73ffffffffffffffffffffffffffffffffffffffff1614611490576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611487906135e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690613831565b60405180910390fd5b61150881611a70565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db906138c3565b60405180910390fd5b60006115ee61170a565b905061160f8160008761160088611db7565b61160988611db7565b87611e31565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461166e91906133db565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516116ec9291906138e3565b60405180910390a461170381600087878787611e39565b5050505050565b600033905090565b8151835114611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d9061397e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc90613a10565b60405180910390fd5b60006117cf61170a565b90506117df818787878787611e31565b60005b8451811015611990576000858281518110611800576117ff613431565b5b60200260200101519050600085838151811061181f5761181e613431565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b790613aa2565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461197591906133db565b925050819055505050508061198990613460565b90506117e2565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611a07929190613ac2565b60405180910390a4611a1d818787878787612010565b505050505050565b6000611a39611a33846121e7565b83612217565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161490509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9c90613a10565b60405180910390fd5b6000611baf61170a565b9050611bcf818787611bc088611db7565b611bc988611db7565b87611e31565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5d90613aa2565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d1b91906133db565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051611d989291906138e3565b60405180910390a4611dae828888888888611e39565b50505050505050565b60606000600167ffffffffffffffff811115611dd657611dd5612a40565b5b604051908082528060200260200182016040528015611e045781602001602082028036833780820191505090505b5090508281600081518110611e1c57611e1b613431565b5b60200260200101818152505080915050919050565b505050505050565b611e588473ffffffffffffffffffffffffffffffffffffffff1661223e565b15612008578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611e9e959493929190613b4e565b6020604051808303816000875af1925050508015611eda57506040513d601f19601f82011682018060405250810190611ed79190613bbd565b60015b611f7f57611ee6613bf7565b806308c379a003611f425750611efa613c19565b80611f055750611f44565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f399190612912565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7690613d1b565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffd90613dad565b60405180910390fd5b505b505050505050565b61202f8473ffffffffffffffffffffffffffffffffffffffff1661223e565b156121df578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612075959493929190613dcd565b6020604051808303816000875af19250505080156120b157506040513d601f19601f820116820180604052508101906120ae9190613bbd565b60015b612156576120bd613bf7565b806308c379a00361211957506120d1613c19565b806120dc575061211b565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121109190612912565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d90613d1b565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146121dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d490613dad565b60405180910390fd5b505b505050505050565b6000816040516020016121fa9190613ead565b604051602081830303815290604052805190602001209050919050565b60008060006122268585612251565b91509150612233816122d2565b819250505092915050565b600080823b905060008111915050919050565b60008060418351036122925760008060006020860151925060408601519150606086015160001a90506122868782858561249e565b945094505050506122cb565b60408351036122c25760008060208501519150604085015190506122b78683836125aa565b9350935050506122cb565b60006002915091505b9250929050565b600060048111156122e6576122e5613ed3565b5b8160048111156122f9576122f8613ed3565b5b031561249b576001600481111561231357612312613ed3565b5b81600481111561232657612325613ed3565b5b03612366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235d90613f4e565b60405180910390fd5b6002600481111561237a57612379613ed3565b5b81600481111561238d5761238c613ed3565b5b036123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c490613fba565b60405180910390fd5b600360048111156123e1576123e0613ed3565b5b8160048111156123f4576123f3613ed3565b5b03612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b9061404c565b60405180910390fd5b60048081111561244757612446613ed3565b5b81600481111561245a57612459613ed3565b5b0361249a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612491906140de565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156124d95760006003915091506125a1565b601b8560ff16141580156124f15750601c8560ff1614155b156125035760006004915091506125a1565b6000600187878787604051600081526020016040526040516125289493929190614129565b6020604051602081039080840390855afa15801561254a573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612598576000600192509250506125a1565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6125ed91906133db565b90506125fb8782888561249e565b935093505050935093915050565b8280546126159061337b565b90600052602060002090601f016020900481019282612637576000855561267e565b82601f1061265057805160ff191683800117855561267e565b8280016001018555821561267e579182015b8281111561267d578251825591602001919060010190612662565b5b50905061268b919061268f565b5090565b5b808211156126a8576000816000905550600101612690565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126eb826126c0565b9050919050565b6126fb816126e0565b811461270657600080fd5b50565b600081359050612718816126f2565b92915050565b6000819050919050565b6127318161271e565b811461273c57600080fd5b50565b60008135905061274e81612728565b92915050565b6000806040838503121561276b5761276a6126b6565b5b600061277985828601612709565b925050602061278a8582860161273f565b9150509250929050565b61279d8161271e565b82525050565b60006020820190506127b86000830184612794565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127f3816127be565b81146127fe57600080fd5b50565b600081359050612810816127ea565b92915050565b60006020828403121561282c5761282b6126b6565b5b600061283a84828501612801565b91505092915050565b60008115159050919050565b61285881612843565b82525050565b6000602082019050612873600083018461284f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128b3578082015181840152602081019050612898565b838111156128c2576000848401525b50505050565b6000601f19601f8301169050919050565b60006128e482612879565b6128ee8185612884565b93506128fe818560208601612895565b612907816128c8565b840191505092915050565b6000602082019050818103600083015261292c81846128d9565b905092915050565b60006020828403121561294a576129496126b6565b5b60006129588482850161273f565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261298657612985612961565b5b8235905067ffffffffffffffff8111156129a3576129a2612966565b5b6020830191508360208202830111156129bf576129be61296b565b5b9250929050565b600080602083850312156129dd576129dc6126b6565b5b600083013567ffffffffffffffff8111156129fb576129fa6126bb565b5b612a0785828601612970565b92509250509250929050565b600060208284031215612a2957612a286126b6565b5b6000612a3784828501612709565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a78826128c8565b810181811067ffffffffffffffff82111715612a9757612a96612a40565b5b80604052505050565b6000612aaa6126ac565b9050612ab68282612a6f565b919050565b600067ffffffffffffffff821115612ad657612ad5612a40565b5b602082029050602081019050919050565b6000612afa612af584612abb565b612aa0565b90508083825260208201905060208402830185811115612b1d57612b1c61296b565b5b835b81811015612b465780612b32888261273f565b845260208401935050602081019050612b1f565b5050509392505050565b600082601f830112612b6557612b64612961565b5b8135612b75848260208601612ae7565b91505092915050565b600080fd5b600067ffffffffffffffff821115612b9e57612b9d612a40565b5b612ba7826128c8565b9050602081019050919050565b82818337600083830152505050565b6000612bd6612bd184612b83565b612aa0565b905082815260208101848484011115612bf257612bf1612b7e565b5b612bfd848285612bb4565b509392505050565b600082601f830112612c1a57612c19612961565b5b8135612c2a848260208601612bc3565b91505092915050565b600080600080600060a08688031215612c4f57612c4e6126b6565b5b6000612c5d88828901612709565b9550506020612c6e88828901612709565b945050604086013567ffffffffffffffff811115612c8f57612c8e6126bb565b5b612c9b88828901612b50565b935050606086013567ffffffffffffffff811115612cbc57612cbb6126bb565b5b612cc888828901612b50565b925050608086013567ffffffffffffffff811115612ce957612ce86126bb565b5b612cf588828901612c05565b9150509295509295909350565b60008083601f840112612d1857612d17612961565b5b8235905067ffffffffffffffff811115612d3557612d34612966565b5b602083019150836001820283011115612d5157612d5061296b565b5b9250929050565b600080600060408486031215612d7157612d706126b6565b5b6000612d7f86828701612709565b935050602084013567ffffffffffffffff811115612da057612d9f6126bb565b5b612dac86828701612d02565b92509250509250925092565b600067ffffffffffffffff821115612dd357612dd2612a40565b5b602082029050602081019050919050565b6000612df7612df284612db8565b612aa0565b90508083825260208201905060208402830185811115612e1a57612e1961296b565b5b835b81811015612e435780612e2f8882612709565b845260208401935050602081019050612e1c565b5050509392505050565b600082601f830112612e6257612e61612961565b5b8135612e72848260208601612de4565b91505092915050565b60008060408385031215612e9257612e916126b6565b5b600083013567ffffffffffffffff811115612eb057612eaf6126bb565b5b612ebc85828601612e4d565b925050602083013567ffffffffffffffff811115612edd57612edc6126bb565b5b612ee985828601612b50565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612f288161271e565b82525050565b6000612f3a8383612f1f565b60208301905092915050565b6000602082019050919050565b6000612f5e82612ef3565b612f688185612efe565b9350612f7383612f0f565b8060005b83811015612fa4578151612f8b8882612f2e565b9750612f9683612f46565b925050600181019050612f77565b5085935050505092915050565b60006020820190508181036000830152612fcb8184612f53565b905092915050565b600067ffffffffffffffff821115612fee57612fed612a40565b5b612ff7826128c8565b9050602081019050919050565b600061301761301284612fd3565b612aa0565b90508281526020810184848401111561303357613032612b7e565b5b61303e848285612bb4565b509392505050565b600082601f83011261305b5761305a612961565b5b813561306b848260208601613004565b91505092915050565b60006020828403121561308a576130896126b6565b5b600082013567ffffffffffffffff8111156130a8576130a76126bb565b5b6130b484828501613046565b91505092915050565b6000819050919050565b6130d0816130bd565b81146130db57600080fd5b50565b6000813590506130ed816130c7565b92915050565b600060208284031215613109576131086126b6565b5b6000613117848285016130de565b91505092915050565b61312981612843565b811461313457600080fd5b50565b60008135905061314681613120565b92915050565b600060208284031215613162576131616126b6565b5b600061317084828501613137565b91505092915050565b613182816126e0565b82525050565b600060208201905061319d6000830184613179565b92915050565b600080604083850312156131ba576131b96126b6565b5b60006131c885828601612709565b92505060206131d985828601613137565b9150509250929050565b600080604083850312156131fa576131f96126b6565b5b600061320885828601612709565b925050602061321985828601612709565b9150509250929050565b600080600080600060a0868803121561323f5761323e6126b6565b5b600061324d88828901612709565b955050602061325e88828901612709565b945050604061326f8882890161273f565b93505060606132808882890161273f565b925050608086013567ffffffffffffffff8111156132a1576132a06126bb565b5b6132ad88828901612c05565b9150509295509295909350565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613316602b83612884565b9150613321826132ba565b604082019050919050565b6000602082019050818103600083015261334581613309565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061339357607f821691505b6020821081036133a6576133a561334c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133e68261271e565b91506133f18361271e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613426576134256133ac565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061346b8261271e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361349d5761349c6133ac565b5b600182019050919050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000613504603283612884565b915061350f826134a8565b604082019050919050565b60006020820190508181036000830152613533816134f7565b9050919050565b60008160601b9050919050565b60006135528261353a565b9050919050565b600061356482613547565b9050919050565b61357c613577826126e0565b613559565b82525050565b600061358e828461356b565b60148201915081905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135d3602083612884565b91506135de8261359d565b602082019050919050565b60006020820190508181036000830152613602816135c6565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000613665602983612884565b915061367082613609565b604082019050919050565b6000602082019050818103600083015261369481613658565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006136f7602983612884565b91506137028261369b565b604082019050919050565b60006020820190508181036000830152613726816136ea565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000613789602983612884565b91506137948261372d565b604082019050919050565b600060208201905081810360008301526137b88161377c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061381b602683612884565b9150613826826137bf565b604082019050919050565b6000602082019050818103600083015261384a8161380e565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006138ad602183612884565b91506138b882613851565b604082019050919050565b600060208201905081810360008301526138dc816138a0565b9050919050565b60006040820190506138f86000830185612794565b6139056020830184612794565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000613968602883612884565b91506139738261390c565b604082019050919050565b600060208201905081810360008301526139978161395b565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006139fa602583612884565b9150613a058261399e565b604082019050919050565b60006020820190508181036000830152613a29816139ed565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000613a8c602a83612884565b9150613a9782613a30565b604082019050919050565b60006020820190508181036000830152613abb81613a7f565b9050919050565b60006040820190508181036000830152613adc8185612f53565b90508181036020830152613af08184612f53565b90509392505050565b600081519050919050565b600082825260208201905092915050565b6000613b2082613af9565b613b2a8185613b04565b9350613b3a818560208601612895565b613b43816128c8565b840191505092915050565b600060a082019050613b636000830188613179565b613b706020830187613179565b613b7d6040830186612794565b613b8a6060830185612794565b8181036080830152613b9c8184613b15565b90509695505050505050565b600081519050613bb7816127ea565b92915050565b600060208284031215613bd357613bd26126b6565b5b6000613be184828501613ba8565b91505092915050565b60008160e01c9050919050565b600060033d1115613c165760046000803e613c13600051613bea565b90505b90565b600060443d10613ca657613c2b6126ac565b60043d036004823e80513d602482011167ffffffffffffffff82111715613c53575050613ca6565b808201805167ffffffffffffffff811115613c715750505050613ca6565b80602083010160043d038501811115613c8e575050505050613ca6565b613c9d82602001850186612a6f565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000613d05603483612884565b9150613d1082613ca9565b604082019050919050565b60006020820190508181036000830152613d3481613cf8565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000613d97602883612884565b9150613da282613d3b565b604082019050919050565b60006020820190508181036000830152613dc681613d8a565b9050919050565b600060a082019050613de26000830188613179565b613def6020830187613179565b8181036040830152613e018186612f53565b90508181036060830152613e158185612f53565b90508181036080830152613e298184613b15565b90509695505050505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613e76601c83613e35565b9150613e8182613e40565b601c82019050919050565b6000819050919050565b613ea7613ea2826130bd565b613e8c565b82525050565b6000613eb882613e69565b9150613ec48284613e96565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613f38601883612884565b9150613f4382613f02565b602082019050919050565b60006020820190508181036000830152613f6781613f2b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613fa4601f83612884565b9150613faf82613f6e565b602082019050919050565b60006020820190508181036000830152613fd381613f97565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614036602283612884565b915061404182613fda565b604082019050919050565b6000602082019050818103600083015261406581614029565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006140c8602283612884565b91506140d38261406c565b604082019050919050565b600060208201905081810360008301526140f7816140bb565b9050919050565b614107816130bd565b82525050565b600060ff82169050919050565b6141238161410d565b82525050565b600060808201905061413e60008301876140fe565b61414b602083018661411a565b61415860408301856140fe565b61416560608301846140fe565b9594505050505056fea26469706673582212207c156e67e55ad7399f6d2a934988e404bbcbb936d5ccc428f9ed35d6a2cd364564736f6c634300080d0033

Deployed Bytecode Sourcemap

63968:2902:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24592:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23615:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64371:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66319:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66165:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65423:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66032:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64044:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26687:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64711:704;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66758:107;;;:::i;:::-;;24989:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65893:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64103:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65797:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4467:94;;;:::i;:::-;;3816:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64404:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66419:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25586:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64247:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64289:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64331;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25969:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26209:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4716:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24592:231;24678:7;24725:1;24706:21;;:7;:21;;;24698:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;24793:9;:13;24803:2;24793:13;;;;;;;;;;;:22;24807:7;24793:22;;;;;;;;;;;;;;;;24786:29;;24592:231;;;;:::o;23615:310::-;23717:4;23769:26;23754:41;;;:11;:41;;;;:110;;;;23827:37;23812:52;;;:11;:52;;;;23754:110;:163;;;;23881:36;23905:11;23881:23;:36::i;:::-;23754:163;23734:183;;23615:310;;;:::o;64371:26::-;;;;;;;;;;;;;:::o;66319:92::-;66356:13;66389:14;66382:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66319:92;:::o;66165:146::-;66225:13;66270:1;66259:7;:12;66251:21;;;;;;66284:22;66277:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66165:146;;;:::o;65423:369::-;64666:19;;;;;;;;;;;64652:33;;:10;:33;;;64644:42;;;;;;65588:14:::1;;65558:19;;:26;;65542:13;;:42;;;;:::i;:::-;:60;;65534:69;;;::::0;::::1;;65615:9;65611:118;65634:19;;:26;;65630:1;:30;65611:118;;;65678:39;65684:19;;65704:1;65684:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;65708:1;65711;65678:39;;;;;;;;;;;::::0;:5:::1;:39::i;:::-;65662:3;;;;;:::i;:::-;;;;65611:118;;;;65758:19;;:26;;65741:13;;:43;;;;;;;:::i;:::-;;;;;;;;65423:369:::0;;:::o;66032:125::-;64666:19;;;;;;;;;;;64652:33;;:10;:33;;;64644:42;;;;;;66140:9:::1;66118:19;;:31;;;;;;;;;;;;;;;;;;66032:125:::0;:::o;64044:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;26687:442::-;26928:12;:10;:12::i;:::-;26920:20;;:4;:20;;;:60;;;;26944:36;26961:4;26967:12;:10;:12::i;:::-;26944:16;:36::i;:::-;26920:60;26898:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;27069:52;27092:4;27098:2;27102:3;27107:7;27116:4;27069:22;:52::i;:::-;26687:442;;;;;:::o;64711:704::-;64824:6;;;;;;;;;;;64816:15;;;;;;64870:14;;64865:1;64849:13;;:17;;;;:::i;:::-;:35;;64841:44;;;;;;64917:19;64903:33;;:10;:33;;;64895:42;;;;;;65000:5;64955:50;;:20;:41;64976:19;64955:41;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;64947:59;;;;;;65060:4;65016:20;:41;65037:19;65016:41;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;65076:20;65126:19;65109:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;65099:48;;;;;;65076:71;;65200:5;65165:40;;:17;:31;65183:12;65165:31;;;;;;;;;;;;;;;;;;;;;:40;;;65157:49;;;;;;65224:66;65241:19;;;;;;;;;;;65262:12;65276:13;;65224:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:66::i;:::-;65216:75;;;;;;65335:4;65301:17;:31;65319:12;65301:31;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;65352:27;65358:10;65370:1;65373;65352:27;;;;;;;;;;;;:5;:27::i;:::-;65406:1;65389:13;;:18;;;;;;;:::i;:::-;;;;;;;;64807:608;64711:704;;;:::o;66758:107::-;4047:12;:10;:12::i;:::-;4036:23;;:7;:5;:7::i;:::-;:23;;;4028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66817:10:::1;66809:28;;:51;66838:21;66809:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;66758:107::o:0;24989:524::-;25145:16;25206:3;:10;25187:8;:15;:29;25179:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;25275:30;25322:8;:15;25308:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25275:63;;25356:9;25351:122;25375:8;:15;25371:1;:19;25351:122;;;25431:30;25441:8;25450:1;25441:11;;;;;;;;:::i;:::-;;;;;;;;25454:3;25458:1;25454:6;;;;;;;;:::i;:::-;;;;;;;;25431:9;:30::i;:::-;25412:13;25426:1;25412:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;25392:3;;;;:::i;:::-;;;25351:122;;;;25492:13;25485:20;;;24989:524;;;;:::o;65893:130::-;64666:19;;;;;;;;;;;64652:33;;:10;:33;;;64644:42;;;;;;66004:14:::1;65979:22;:39;;;;;;;;;;;;:::i;:::-;;65893:130:::0;:::o;64103:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;65797:91::-;64666:19;;;;;;;;;;;64652:33;;:10;:33;;;64644:42;;;;;;65876:7:::1;65867:6;;:16;;;;;;;;;;;;;;;;;;65797:91:::0;:::o;4467:94::-;4047:12;:10;:12::i;:::-;4036:23;;:7;:5;:7::i;:::-;:23;;;4028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4532:21:::1;4550:1;4532:9;:21::i;:::-;4467:94::o:0;3816:87::-;3862:7;3889:6;;;;;;;;;;;3882:13;;3816:87;:::o;64404:25::-;;;;:::o;66419:89::-;66458:13;66491:9;66484:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66419:89;:::o;25586:311::-;25705:8;25689:24;;:12;:10;:12::i;:::-;:24;;;25681:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;25817:8;25772:18;:32;25791:12;:10;:12::i;:::-;25772:32;;;;;;;;;;;;;;;:42;25805:8;25772:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25870:8;25841:48;;25856:12;:10;:12::i;:::-;25841:48;;;25880:8;25841:48;;;;;;:::i;:::-;;;;;;;;25586:311;;:::o;64247:35::-;;;;:::o;64289:36::-;;;;:::o;64331:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25969:168::-;26068:4;26092:18;:27;26111:7;26092:27;;;;;;;;;;;;;;;:37;26120:8;26092:37;;;;;;;;;;;;;;;;;;;;;;;;;26085:44;;25969:168;;;;:::o;26209:401::-;26425:12;:10;:12::i;:::-;26417:20;;:4;:20;;;:60;;;;26441:36;26458:4;26464:12;:10;:12::i;:::-;26441:16;:36::i;:::-;26417:60;26395:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;26557:45;26575:4;26581:2;26585;26589:6;26597:4;26557:17;:45::i;:::-;26209:401;;;;;:::o;4716:192::-;4047:12;:10;:12::i;:::-;4036:23;;:7;:5;:7::i;:::-;:23;;;4028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4825:1:::1;4805:22;;:8;:22;;::::0;4797:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;4881:19;4891:8;4881:9;:19::i;:::-;4716:192:::0;:::o;22476:157::-;22561:4;22600:25;22585:40;;;:11;:40;;;;22578:47;;22476:157;;;:::o;31178:599::-;31355:1;31336:21;;:7;:21;;;31328:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31408:16;31427:12;:10;:12::i;:::-;31408:31;;31452:107;31473:8;31491:1;31495:7;31504:21;31522:2;31504:17;:21::i;:::-;31527:25;31545:6;31527:17;:25::i;:::-;31554:4;31452:20;:107::i;:::-;31598:6;31572:9;:13;31582:2;31572:13;;;;;;;;;;;:22;31586:7;31572:22;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;31657:7;31620:57;;31653:1;31620:57;;31635:8;31620:57;;;31666:2;31670:6;31620:57;;;;;;;:::i;:::-;;;;;;;;31690:79;31721:8;31739:1;31743:7;31752:2;31756:6;31764:4;31690:30;:79::i;:::-;31317:460;31178:599;;;;:::o;2637:98::-;2690:7;2717:10;2710:17;;2637:98;:::o;28771:1074::-;28998:7;:14;28984:3;:10;:28;28976:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;29090:1;29076:16;;:2;:16;;;29068:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;29147:16;29166:12;:10;:12::i;:::-;29147:31;;29191:60;29212:8;29222:4;29228:2;29232:3;29237:7;29246:4;29191:20;:60::i;:::-;29269:9;29264:421;29288:3;:10;29284:1;:14;29264:421;;;29320:10;29333:3;29337:1;29333:6;;;;;;;;:::i;:::-;;;;;;;;29320:19;;29354:14;29371:7;29379:1;29371:10;;;;;;;;:::i;:::-;;;;;;;;29354:27;;29398:19;29420:9;:13;29430:2;29420:13;;;;;;;;;;;:19;29434:4;29420:19;;;;;;;;;;;;;;;;29398:41;;29477:6;29462:11;:21;;29454:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29610:6;29596:11;:20;29574:9;:13;29584:2;29574:13;;;;;;;;;;;:19;29588:4;29574:19;;;;;;;;;;;;;;;:42;;;;29667:6;29646:9;:13;29656:2;29646:13;;;;;;;;;;;:17;29660:2;29646:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;29305:380;;;29300:3;;;;:::i;:::-;;;29264:421;;;;29732:2;29702:47;;29726:4;29702:47;;29716:8;29702:47;;;29736:3;29741:7;29702:47;;;;;;;:::i;:::-;;;;;;;;29762:75;29798:8;29808:4;29814:2;29818:3;29823:7;29832:4;29762:35;:75::i;:::-;28965:880;28771:1074;;;;;:::o;66520:233::-;66637:4;66673:72;66687:42;66716:12;66687:28;:42::i;:::-;66731:13;66673;:72::i;:::-;66660:85;;:9;:85;;;66653:92;;66520:233;;;;;:::o;4916:173::-;4972:16;4991:6;;;;;;;;;;;4972:25;;5017:8;5008:6;;:17;;;;;;;;;;;;;;;;;;5072:8;5041:40;;5062:8;5041:40;;;;;;;;;;;;4961:128;4916:173;:::o;27593:820::-;27795:1;27781:16;;:2;:16;;;27773:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27852:16;27871:12;:10;:12::i;:::-;27852:31;;27896:96;27917:8;27927:4;27933:2;27937:21;27955:2;27937:17;:21::i;:::-;27960:25;27978:6;27960:17;:25::i;:::-;27987:4;27896:20;:96::i;:::-;28005:19;28027:9;:13;28037:2;28027:13;;;;;;;;;;;:19;28041:4;28027:19;;;;;;;;;;;;;;;;28005:41;;28080:6;28065:11;:21;;28057:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28205:6;28191:11;:20;28169:9;:13;28179:2;28169:13;;;;;;;;;;;:19;28183:4;28169:19;;;;;;;;;;;;;;;:42;;;;28254:6;28233:9;:13;28243:2;28233:13;;;;;;;;;;;:17;28247:2;28233:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;28309:2;28278:46;;28303:4;28278:46;;28293:8;28278:46;;;28313:2;28317:6;28278:46;;;;;;;:::i;:::-;;;;;;;;28337:68;28368:8;28378:4;28384:2;28388;28392:6;28400:4;28337:30;:68::i;:::-;27762:651;;27593:820;;;;;:::o;37689:198::-;37755:16;37784:22;37823:1;37809:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37784:41;;37847:7;37836:5;37842:1;37836:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;37874:5;37867:12;;;37689:198;;;:::o;35879:221::-;;;;;;;:::o;36108:748::-;36323:15;:2;:13;;;:15::i;:::-;36319:530;;;36376:2;36359:38;;;36398:8;36408:4;36414:2;36418:6;36426:4;36359:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36355:483;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;36711:6;36704:14;;;;;;;;;;;:::i;:::-;;;;;;;;36355:483;;;36760:62;;;;;;;;;;:::i;:::-;;;;;;;;36355:483;36493:47;;;36481:59;;;:8;:59;;;;36477:158;;36565:50;;;;;;;;;;:::i;:::-;;;;;;;;36477:158;36432:218;36319:530;36108:748;;;;;;:::o;36864:817::-;37104:15;:2;:13;;;:15::i;:::-;37100:574;;;37157:2;37140:43;;;37184:8;37194:4;37200:3;37205:7;37214:4;37140:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37136:527;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;37536:6;37529:14;;;;;;;;;;;:::i;:::-;;;;;;;;37136:527;;;37585:62;;;;;;;;;;:::i;:::-;;;;;;;;37136:527;37313:52;;;37301:64;;;:8;:64;;;;37297:163;;37390:50;;;;;;;;;;:::i;:::-;;;;;;;;37297:163;37220:255;37100:574;36864:817;;;;;;:::o;62626:269::-;62695:7;62881:4;62828:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;62818:69;;;;;;62811:76;;62626:269;;;:::o;58824:231::-;58902:7;58923:17;58942:18;58964:27;58975:4;58981:9;58964:10;:27::i;:::-;58922:69;;;;59002:18;59014:5;59002:11;:18::i;:::-;59038:9;59031:16;;;;58824:231;;;;:::o;5830:387::-;5890:4;6098:12;6165:7;6153:20;6145:28;;6208:1;6201:4;:8;6194:15;;;5830:387;;;:::o;56714:1308::-;56795:7;56804:12;57049:2;57029:9;:16;:22;57025:990;;57068:9;57092;57116:7;57325:4;57314:9;57310:20;57304:27;57299:32;;57375:4;57364:9;57360:20;57354:27;57349:32;;57433:4;57422:9;57418:20;57412:27;57409:1;57404:36;57399:41;;57476:25;57487:4;57493:1;57496;57499;57476:10;:25::i;:::-;57469:32;;;;;;;;;57025:990;57543:2;57523:9;:16;:22;57519:496;;57562:9;57586:10;57798:4;57787:9;57783:20;57777:27;57772:32;;57849:4;57838:9;57834:20;57828:27;57822:33;;57891:23;57902:4;57908:1;57911:2;57891:10;:23::i;:::-;57884:30;;;;;;;;57519:496;57963:1;57967:35;57947:56;;;;56714:1308;;;;;;:::o;54985:643::-;55063:20;55054:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;55050:571;55100:7;55050:571;55161:29;55152:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;55148:473;;55207:34;;;;;;;;;;:::i;:::-;;;;;;;;55148:473;55272:35;55263:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;55259:362;;55324:41;;;;;;;;;;:::i;:::-;;;;;;;;55259:362;55396:30;55387:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;55383:238;;55443:44;;;;;;;;;;:::i;:::-;;;;;;;;55383:238;55518:30;55509:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;55505:116;;55565:44;;;;;;;;;;:::i;:::-;;;;;;;;55505:116;54985:643;;:::o;60276:1632::-;60407:7;60416:12;61341:66;61336:1;61328:10;;:79;61324:163;;;61440:1;61444:30;61424:51;;;;;;61324:163;61506:2;61501:1;:7;;;;:18;;;;;61517:2;61512:1;:7;;;;61501:18;61497:102;;;61552:1;61556:30;61536:51;;;;;;61497:102;61696:14;61713:24;61723:4;61729:1;61732;61735;61713:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61696:41;;61770:1;61752:20;;:6;:20;;;61748:103;;61805:1;61809:29;61789:50;;;;;;;61748:103;61871:6;61879:20;61863:37;;;;;60276:1632;;;;;;;;:::o;59318:344::-;59432:7;59441:12;59466:9;59491:66;59483:75;;59478:2;:80;59466:92;;59569:7;59608:2;59601:3;59594:2;59586:11;;:18;;59585:25;;;;:::i;:::-;59569:42;;59629:25;59640:4;59646:1;59649;59652;59629:10;:25::i;:::-;59622:32;;;;;;59318:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:99::-;3265:6;3299:5;3293:12;3283:22;;3213:99;;;:::o;3318:169::-;3402:11;3436:6;3431:3;3424:19;3476:4;3471:3;3467:14;3452:29;;3318:169;;;;:::o;3493:307::-;3561:1;3571:113;3585:6;3582:1;3579:13;3571:113;;;3670:1;3665:3;3661:11;3655:18;3651:1;3646:3;3642:11;3635:39;3607:2;3604:1;3600:10;3595:15;;3571:113;;;3702:6;3699:1;3696:13;3693:101;;;3782:1;3773:6;3768:3;3764:16;3757:27;3693:101;3542:258;3493:307;;;:::o;3806:102::-;3847:6;3898:2;3894:7;3889:2;3882:5;3878:14;3874:28;3864:38;;3806:102;;;:::o;3914:364::-;4002:3;4030:39;4063:5;4030:39;:::i;:::-;4085:71;4149:6;4144:3;4085:71;:::i;:::-;4078:78;;4165:52;4210:6;4205:3;4198:4;4191:5;4187:16;4165:52;:::i;:::-;4242:29;4264:6;4242:29;:::i;:::-;4237:3;4233:39;4226:46;;4006:272;3914:364;;;;:::o;4284:313::-;4397:4;4435:2;4424:9;4420:18;4412:26;;4484:9;4478:4;4474:20;4470:1;4459:9;4455:17;4448:47;4512:78;4585:4;4576:6;4512:78;:::i;:::-;4504:86;;4284:313;;;;:::o;4603:329::-;4662:6;4711:2;4699:9;4690:7;4686:23;4682:32;4679:119;;;4717:79;;:::i;:::-;4679:119;4837:1;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4808:117;4603:329;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:117;5293:1;5290;5283:12;5324:568;5397:8;5407:6;5457:3;5450:4;5442:6;5438:17;5434:27;5424:122;;5465:79;;:::i;:::-;5424:122;5578:6;5565:20;5555:30;;5608:18;5600:6;5597:30;5594:117;;;5630:79;;:::i;:::-;5594:117;5744:4;5736:6;5732:17;5720:29;;5798:3;5790:4;5782:6;5778:17;5768:8;5764:32;5761:41;5758:128;;;5805:79;;:::i;:::-;5758:128;5324:568;;;;;:::o;5898:559::-;5984:6;5992;6041:2;6029:9;6020:7;6016:23;6012:32;6009:119;;;6047:79;;:::i;:::-;6009:119;6195:1;6184:9;6180:17;6167:31;6225:18;6217:6;6214:30;6211:117;;;6247:79;;:::i;:::-;6211:117;6360:80;6432:7;6423:6;6412:9;6408:22;6360:80;:::i;:::-;6342:98;;;;6138:312;5898:559;;;;;:::o;6463:329::-;6522:6;6571:2;6559:9;6550:7;6546:23;6542:32;6539:119;;;6577:79;;:::i;:::-;6539:119;6697:1;6722:53;6767:7;6758:6;6747:9;6743:22;6722:53;:::i;:::-;6712:63;;6668:117;6463:329;;;;:::o;6798:180::-;6846:77;6843:1;6836:88;6943:4;6940:1;6933:15;6967:4;6964:1;6957:15;6984:281;7067:27;7089:4;7067:27;:::i;:::-;7059:6;7055:40;7197:6;7185:10;7182:22;7161:18;7149:10;7146:34;7143:62;7140:88;;;7208:18;;:::i;:::-;7140:88;7248:10;7244:2;7237:22;7027:238;6984:281;;:::o;7271:129::-;7305:6;7332:20;;:::i;:::-;7322:30;;7361:33;7389:4;7381:6;7361:33;:::i;:::-;7271:129;;;:::o;7406:311::-;7483:4;7573:18;7565:6;7562:30;7559:56;;;7595:18;;:::i;:::-;7559:56;7645:4;7637:6;7633:17;7625:25;;7705:4;7699;7695:15;7687:23;;7406:311;;;:::o;7740:710::-;7836:5;7861:81;7877:64;7934:6;7877:64;:::i;:::-;7861:81;:::i;:::-;7852:90;;7962:5;7991:6;7984:5;7977:21;8025:4;8018:5;8014:16;8007:23;;8078:4;8070:6;8066:17;8058:6;8054:30;8107:3;8099:6;8096:15;8093:122;;;8126:79;;:::i;:::-;8093:122;8241:6;8224:220;8258:6;8253:3;8250:15;8224:220;;;8333:3;8362:37;8395:3;8383:10;8362:37;:::i;:::-;8357:3;8350:50;8429:4;8424:3;8420:14;8413:21;;8300:144;8284:4;8279:3;8275:14;8268:21;;8224:220;;;8228:21;7842:608;;7740:710;;;;;:::o;8473:370::-;8544:5;8593:3;8586:4;8578:6;8574:17;8570:27;8560:122;;8601:79;;:::i;:::-;8560:122;8718:6;8705:20;8743:94;8833:3;8825:6;8818:4;8810:6;8806:17;8743:94;:::i;:::-;8734:103;;8550:293;8473:370;;;;:::o;8849:117::-;8958:1;8955;8948:12;8972:307;9033:4;9123:18;9115:6;9112:30;9109:56;;;9145:18;;:::i;:::-;9109:56;9183:29;9205:6;9183:29;:::i;:::-;9175:37;;9267:4;9261;9257:15;9249:23;;8972:307;;;:::o;9285:154::-;9369:6;9364:3;9359;9346:30;9431:1;9422:6;9417:3;9413:16;9406:27;9285:154;;;:::o;9445:410::-;9522:5;9547:65;9563:48;9604:6;9563:48;:::i;:::-;9547:65;:::i;:::-;9538:74;;9635:6;9628:5;9621:21;9673:4;9666:5;9662:16;9711:3;9702:6;9697:3;9693:16;9690:25;9687:112;;;9718:79;;:::i;:::-;9687:112;9808:41;9842:6;9837:3;9832;9808:41;:::i;:::-;9528:327;9445:410;;;;;:::o;9874:338::-;9929:5;9978:3;9971:4;9963:6;9959:17;9955:27;9945:122;;9986:79;;:::i;:::-;9945:122;10103:6;10090:20;10128:78;10202:3;10194:6;10187:4;10179:6;10175:17;10128:78;:::i;:::-;10119:87;;9935:277;9874:338;;;;:::o;10218:1509::-;10372:6;10380;10388;10396;10404;10453:3;10441:9;10432:7;10428:23;10424:33;10421:120;;;10460:79;;:::i;:::-;10421:120;10580:1;10605:53;10650:7;10641:6;10630:9;10626:22;10605:53;:::i;:::-;10595:63;;10551:117;10707:2;10733:53;10778:7;10769:6;10758:9;10754:22;10733:53;:::i;:::-;10723:63;;10678:118;10863:2;10852:9;10848:18;10835:32;10894:18;10886:6;10883:30;10880:117;;;10916:79;;:::i;:::-;10880:117;11021:78;11091:7;11082:6;11071:9;11067:22;11021:78;:::i;:::-;11011:88;;10806:303;11176:2;11165:9;11161:18;11148:32;11207:18;11199:6;11196:30;11193:117;;;11229:79;;:::i;:::-;11193:117;11334:78;11404:7;11395:6;11384:9;11380:22;11334:78;:::i;:::-;11324:88;;11119:303;11489:3;11478:9;11474:19;11461:33;11521:18;11513:6;11510:30;11507:117;;;11543:79;;:::i;:::-;11507:117;11648:62;11702:7;11693:6;11682:9;11678:22;11648:62;:::i;:::-;11638:72;;11432:288;10218:1509;;;;;;;;:::o;11746:552::-;11803:8;11813:6;11863:3;11856:4;11848:6;11844:17;11840:27;11830:122;;11871:79;;:::i;:::-;11830:122;11984:6;11971:20;11961:30;;12014:18;12006:6;12003:30;12000:117;;;12036:79;;:::i;:::-;12000:117;12150:4;12142:6;12138:17;12126:29;;12204:3;12196:4;12188:6;12184:17;12174:8;12170:32;12167:41;12164:128;;;12211:79;;:::i;:::-;12164:128;11746:552;;;;;:::o;12304:672::-;12383:6;12391;12399;12448:2;12436:9;12427:7;12423:23;12419:32;12416:119;;;12454:79;;:::i;:::-;12416:119;12574:1;12599:53;12644:7;12635:6;12624:9;12620:22;12599:53;:::i;:::-;12589:63;;12545:117;12729:2;12718:9;12714:18;12701:32;12760:18;12752:6;12749:30;12746:117;;;12782:79;;:::i;:::-;12746:117;12895:64;12951:7;12942:6;12931:9;12927:22;12895:64;:::i;:::-;12877:82;;;;12672:297;12304:672;;;;;:::o;12982:311::-;13059:4;13149:18;13141:6;13138:30;13135:56;;;13171:18;;:::i;:::-;13135:56;13221:4;13213:6;13209:17;13201:25;;13281:4;13275;13271:15;13263:23;;12982:311;;;:::o;13316:710::-;13412:5;13437:81;13453:64;13510:6;13453:64;:::i;:::-;13437:81;:::i;:::-;13428:90;;13538:5;13567:6;13560:5;13553:21;13601:4;13594:5;13590:16;13583:23;;13654:4;13646:6;13642:17;13634:6;13630:30;13683:3;13675:6;13672:15;13669:122;;;13702:79;;:::i;:::-;13669:122;13817:6;13800:220;13834:6;13829:3;13826:15;13800:220;;;13909:3;13938:37;13971:3;13959:10;13938:37;:::i;:::-;13933:3;13926:50;14005:4;14000:3;13996:14;13989:21;;13876:144;13860:4;13855:3;13851:14;13844:21;;13800:220;;;13804:21;13418:608;;13316:710;;;;;:::o;14049:370::-;14120:5;14169:3;14162:4;14154:6;14150:17;14146:27;14136:122;;14177:79;;:::i;:::-;14136:122;14294:6;14281:20;14319:94;14409:3;14401:6;14394:4;14386:6;14382:17;14319:94;:::i;:::-;14310:103;;14126:293;14049:370;;;;:::o;14425:894::-;14543:6;14551;14600:2;14588:9;14579:7;14575:23;14571:32;14568:119;;;14606:79;;:::i;:::-;14568:119;14754:1;14743:9;14739:17;14726:31;14784:18;14776:6;14773:30;14770:117;;;14806:79;;:::i;:::-;14770:117;14911:78;14981:7;14972:6;14961:9;14957:22;14911:78;:::i;:::-;14901:88;;14697:302;15066:2;15055:9;15051:18;15038:32;15097:18;15089:6;15086:30;15083:117;;;15119:79;;:::i;:::-;15083:117;15224:78;15294:7;15285:6;15274:9;15270:22;15224:78;:::i;:::-;15214:88;;15009:303;14425:894;;;;;:::o;15325:114::-;15392:6;15426:5;15420:12;15410:22;;15325:114;;;:::o;15445:184::-;15544:11;15578:6;15573:3;15566:19;15618:4;15613:3;15609:14;15594:29;;15445:184;;;;:::o;15635:132::-;15702:4;15725:3;15717:11;;15755:4;15750:3;15746:14;15738:22;;15635:132;;;:::o;15773:108::-;15850:24;15868:5;15850:24;:::i;:::-;15845:3;15838:37;15773:108;;:::o;15887:179::-;15956:10;15977:46;16019:3;16011:6;15977:46;:::i;:::-;16055:4;16050:3;16046:14;16032:28;;15887:179;;;;:::o;16072:113::-;16142:4;16174;16169:3;16165:14;16157:22;;16072:113;;;:::o;16221:732::-;16340:3;16369:54;16417:5;16369:54;:::i;:::-;16439:86;16518:6;16513:3;16439:86;:::i;:::-;16432:93;;16549:56;16599:5;16549:56;:::i;:::-;16628:7;16659:1;16644:284;16669:6;16666:1;16663:13;16644:284;;;16745:6;16739:13;16772:63;16831:3;16816:13;16772:63;:::i;:::-;16765:70;;16858:60;16911:6;16858:60;:::i;:::-;16848:70;;16704:224;16691:1;16688;16684:9;16679:14;;16644:284;;;16648:14;16944:3;16937:10;;16345:608;;;16221:732;;;;:::o;16959:373::-;17102:4;17140:2;17129:9;17125:18;17117:26;;17189:9;17183:4;17179:20;17175:1;17164:9;17160:17;17153:47;17217:108;17320:4;17311:6;17217:108;:::i;:::-;17209:116;;16959:373;;;;:::o;17338:308::-;17400:4;17490:18;17482:6;17479:30;17476:56;;;17512:18;;:::i;:::-;17476:56;17550:29;17572:6;17550:29;:::i;:::-;17542:37;;17634:4;17628;17624:15;17616:23;;17338:308;;;:::o;17652:412::-;17730:5;17755:66;17771:49;17813:6;17771:49;:::i;:::-;17755:66;:::i;:::-;17746:75;;17844:6;17837:5;17830:21;17882:4;17875:5;17871:16;17920:3;17911:6;17906:3;17902:16;17899:25;17896:112;;;17927:79;;:::i;:::-;17896:112;18017:41;18051:6;18046:3;18041;18017:41;:::i;:::-;17736:328;17652:412;;;;;:::o;18084:340::-;18140:5;18189:3;18182:4;18174:6;18170:17;18166:27;18156:122;;18197:79;;:::i;:::-;18156:122;18314:6;18301:20;18339:79;18414:3;18406:6;18399:4;18391:6;18387:17;18339:79;:::i;:::-;18330:88;;18146:278;18084:340;;;;:::o;18430:509::-;18499:6;18548:2;18536:9;18527:7;18523:23;18519:32;18516:119;;;18554:79;;:::i;:::-;18516:119;18702:1;18691:9;18687:17;18674:31;18732:18;18724:6;18721:30;18718:117;;;18754:79;;:::i;:::-;18718:117;18859:63;18914:7;18905:6;18894:9;18890:22;18859:63;:::i;:::-;18849:73;;18645:287;18430:509;;;;:::o;18945:77::-;18982:7;19011:5;19000:16;;18945:77;;;:::o;19028:122::-;19101:24;19119:5;19101:24;:::i;:::-;19094:5;19091:35;19081:63;;19140:1;19137;19130:12;19081:63;19028:122;:::o;19156:139::-;19202:5;19240:6;19227:20;19218:29;;19256:33;19283:5;19256:33;:::i;:::-;19156:139;;;;:::o;19301:329::-;19360:6;19409:2;19397:9;19388:7;19384:23;19380:32;19377:119;;;19415:79;;:::i;:::-;19377:119;19535:1;19560:53;19605:7;19596:6;19585:9;19581:22;19560:53;:::i;:::-;19550:63;;19506:117;19301:329;;;;:::o;19636:116::-;19706:21;19721:5;19706:21;:::i;:::-;19699:5;19696:32;19686:60;;19742:1;19739;19732:12;19686:60;19636:116;:::o;19758:133::-;19801:5;19839:6;19826:20;19817:29;;19855:30;19879:5;19855:30;:::i;:::-;19758:133;;;;:::o;19897:323::-;19953:6;20002:2;19990:9;19981:7;19977:23;19973:32;19970:119;;;20008:79;;:::i;:::-;19970:119;20128:1;20153:50;20195:7;20186:6;20175:9;20171:22;20153:50;:::i;:::-;20143:60;;20099:114;19897:323;;;;:::o;20226:118::-;20313:24;20331:5;20313:24;:::i;:::-;20308:3;20301:37;20226:118;;:::o;20350:222::-;20443:4;20481:2;20470:9;20466:18;20458:26;;20494:71;20562:1;20551:9;20547:17;20538:6;20494:71;:::i;:::-;20350:222;;;;:::o;20578:468::-;20643:6;20651;20700:2;20688:9;20679:7;20675:23;20671:32;20668:119;;;20706:79;;:::i;:::-;20668:119;20826:1;20851:53;20896:7;20887:6;20876:9;20872:22;20851:53;:::i;:::-;20841:63;;20797:117;20953:2;20979:50;21021:7;21012:6;21001:9;20997:22;20979:50;:::i;:::-;20969:60;;20924:115;20578:468;;;;;:::o;21052:474::-;21120:6;21128;21177:2;21165:9;21156:7;21152:23;21148:32;21145:119;;;21183:79;;:::i;:::-;21145:119;21303:1;21328:53;21373:7;21364:6;21353:9;21349:22;21328:53;:::i;:::-;21318:63;;21274:117;21430:2;21456:53;21501:7;21492:6;21481:9;21477:22;21456:53;:::i;:::-;21446:63;;21401:118;21052:474;;;;;:::o;21532:1089::-;21636:6;21644;21652;21660;21668;21717:3;21705:9;21696:7;21692:23;21688:33;21685:120;;;21724:79;;:::i;:::-;21685:120;21844:1;21869:53;21914:7;21905:6;21894:9;21890:22;21869:53;:::i;:::-;21859:63;;21815:117;21971:2;21997:53;22042:7;22033:6;22022:9;22018:22;21997:53;:::i;:::-;21987:63;;21942:118;22099:2;22125:53;22170:7;22161:6;22150:9;22146:22;22125:53;:::i;:::-;22115:63;;22070:118;22227:2;22253:53;22298:7;22289:6;22278:9;22274:22;22253:53;:::i;:::-;22243:63;;22198:118;22383:3;22372:9;22368:19;22355:33;22415:18;22407:6;22404:30;22401:117;;;22437:79;;:::i;:::-;22401:117;22542:62;22596:7;22587:6;22576:9;22572:22;22542:62;:::i;:::-;22532:72;;22326:288;21532:1089;;;;;;;;:::o;22627:230::-;22767:34;22763:1;22755:6;22751:14;22744:58;22836:13;22831:2;22823:6;22819:15;22812:38;22627:230;:::o;22863:366::-;23005:3;23026:67;23090:2;23085:3;23026:67;:::i;:::-;23019:74;;23102:93;23191:3;23102:93;:::i;:::-;23220:2;23215:3;23211:12;23204:19;;22863:366;;;:::o;23235:419::-;23401:4;23439:2;23428:9;23424:18;23416:26;;23488:9;23482:4;23478:20;23474:1;23463:9;23459:17;23452:47;23516:131;23642:4;23516:131;:::i;:::-;23508:139;;23235:419;;;:::o;23660:180::-;23708:77;23705:1;23698:88;23805:4;23802:1;23795:15;23829:4;23826:1;23819:15;23846:320;23890:6;23927:1;23921:4;23917:12;23907:22;;23974:1;23968:4;23964:12;23995:18;23985:81;;24051:4;24043:6;24039:17;24029:27;;23985:81;24113:2;24105:6;24102:14;24082:18;24079:38;24076:84;;24132:18;;:::i;:::-;24076:84;23897:269;23846:320;;;:::o;24172:180::-;24220:77;24217:1;24210:88;24317:4;24314:1;24307:15;24341:4;24338:1;24331:15;24358:305;24398:3;24417:20;24435:1;24417:20;:::i;:::-;24412:25;;24451:20;24469:1;24451:20;:::i;:::-;24446:25;;24605:1;24537:66;24533:74;24530:1;24527:81;24524:107;;;24611:18;;:::i;:::-;24524:107;24655:1;24652;24648:9;24641:16;;24358:305;;;;:::o;24669:180::-;24717:77;24714:1;24707:88;24814:4;24811:1;24804:15;24838:4;24835:1;24828:15;24855:233;24894:3;24917:24;24935:5;24917:24;:::i;:::-;24908:33;;24963:66;24956:5;24953:77;24950:103;;25033:18;;:::i;:::-;24950:103;25080:1;25073:5;25069:13;25062:20;;24855:233;;;:::o;25094:237::-;25234:34;25230:1;25222:6;25218:14;25211:58;25303:20;25298:2;25290:6;25286:15;25279:45;25094:237;:::o;25337:366::-;25479:3;25500:67;25564:2;25559:3;25500:67;:::i;:::-;25493:74;;25576:93;25665:3;25576:93;:::i;:::-;25694:2;25689:3;25685:12;25678:19;;25337:366;;;:::o;25709:419::-;25875:4;25913:2;25902:9;25898:18;25890:26;;25962:9;25956:4;25952:20;25948:1;25937:9;25933:17;25926:47;25990:131;26116:4;25990:131;:::i;:::-;25982:139;;25709:419;;;:::o;26134:94::-;26167:8;26215:5;26211:2;26207:14;26186:35;;26134:94;;;:::o;26234:::-;26273:7;26302:20;26316:5;26302:20;:::i;:::-;26291:31;;26234:94;;;:::o;26334:100::-;26373:7;26402:26;26422:5;26402:26;:::i;:::-;26391:37;;26334:100;;;:::o;26440:157::-;26545:45;26565:24;26583:5;26565:24;:::i;:::-;26545:45;:::i;:::-;26540:3;26533:58;26440:157;;:::o;26603:256::-;26715:3;26730:75;26801:3;26792:6;26730:75;:::i;:::-;26830:2;26825:3;26821:12;26814:19;;26850:3;26843:10;;26603:256;;;;:::o;26865:182::-;27005:34;27001:1;26993:6;26989:14;26982:58;26865:182;:::o;27053:366::-;27195:3;27216:67;27280:2;27275:3;27216:67;:::i;:::-;27209:74;;27292:93;27381:3;27292:93;:::i;:::-;27410:2;27405:3;27401:12;27394:19;;27053:366;;;:::o;27425:419::-;27591:4;27629:2;27618:9;27614:18;27606:26;;27678:9;27672:4;27668:20;27664:1;27653:9;27649:17;27642:47;27706:131;27832:4;27706:131;:::i;:::-;27698:139;;27425:419;;;:::o;27850:228::-;27990:34;27986:1;27978:6;27974:14;27967:58;28059:11;28054:2;28046:6;28042:15;28035:36;27850:228;:::o;28084:366::-;28226:3;28247:67;28311:2;28306:3;28247:67;:::i;:::-;28240:74;;28323:93;28412:3;28323:93;:::i;:::-;28441:2;28436:3;28432:12;28425:19;;28084:366;;;:::o;28456:419::-;28622:4;28660:2;28649:9;28645:18;28637:26;;28709:9;28703:4;28699:20;28695:1;28684:9;28680:17;28673:47;28737:131;28863:4;28737:131;:::i;:::-;28729:139;;28456:419;;;:::o;28881:228::-;29021:34;29017:1;29009:6;29005:14;28998:58;29090:11;29085:2;29077:6;29073:15;29066:36;28881:228;:::o;29115:366::-;29257:3;29278:67;29342:2;29337:3;29278:67;:::i;:::-;29271:74;;29354:93;29443:3;29354:93;:::i;:::-;29472:2;29467:3;29463:12;29456:19;;29115:366;;;:::o;29487:419::-;29653:4;29691:2;29680:9;29676:18;29668:26;;29740:9;29734:4;29730:20;29726:1;29715:9;29711:17;29704:47;29768:131;29894:4;29768:131;:::i;:::-;29760:139;;29487:419;;;:::o;29912:228::-;30052:34;30048:1;30040:6;30036:14;30029:58;30121:11;30116:2;30108:6;30104:15;30097:36;29912:228;:::o;30146:366::-;30288:3;30309:67;30373:2;30368:3;30309:67;:::i;:::-;30302:74;;30385:93;30474:3;30385:93;:::i;:::-;30503:2;30498:3;30494:12;30487:19;;30146:366;;;:::o;30518:419::-;30684:4;30722:2;30711:9;30707:18;30699:26;;30771:9;30765:4;30761:20;30757:1;30746:9;30742:17;30735:47;30799:131;30925:4;30799:131;:::i;:::-;30791:139;;30518:419;;;:::o;30943:225::-;31083:34;31079:1;31071:6;31067:14;31060:58;31152:8;31147:2;31139:6;31135:15;31128:33;30943:225;:::o;31174:366::-;31316:3;31337:67;31401:2;31396:3;31337:67;:::i;:::-;31330:74;;31413:93;31502:3;31413:93;:::i;:::-;31531:2;31526:3;31522:12;31515:19;;31174:366;;;:::o;31546:419::-;31712:4;31750:2;31739:9;31735:18;31727:26;;31799:9;31793:4;31789:20;31785:1;31774:9;31770:17;31763:47;31827:131;31953:4;31827:131;:::i;:::-;31819:139;;31546:419;;;:::o;31971:220::-;32111:34;32107:1;32099:6;32095:14;32088:58;32180:3;32175:2;32167:6;32163:15;32156:28;31971:220;:::o;32197:366::-;32339:3;32360:67;32424:2;32419:3;32360:67;:::i;:::-;32353:74;;32436:93;32525:3;32436:93;:::i;:::-;32554:2;32549:3;32545:12;32538:19;;32197:366;;;:::o;32569:419::-;32735:4;32773:2;32762:9;32758:18;32750:26;;32822:9;32816:4;32812:20;32808:1;32797:9;32793:17;32786:47;32850:131;32976:4;32850:131;:::i;:::-;32842:139;;32569:419;;;:::o;32994:332::-;33115:4;33153:2;33142:9;33138:18;33130:26;;33166:71;33234:1;33223:9;33219:17;33210:6;33166:71;:::i;:::-;33247:72;33315:2;33304:9;33300:18;33291:6;33247:72;:::i;:::-;32994:332;;;;;:::o;33332:227::-;33472:34;33468:1;33460:6;33456:14;33449:58;33541:10;33536:2;33528:6;33524:15;33517:35;33332:227;:::o;33565:366::-;33707:3;33728:67;33792:2;33787:3;33728:67;:::i;:::-;33721:74;;33804:93;33893:3;33804:93;:::i;:::-;33922:2;33917:3;33913:12;33906:19;;33565:366;;;:::o;33937:419::-;34103:4;34141:2;34130:9;34126:18;34118:26;;34190:9;34184:4;34180:20;34176:1;34165:9;34161:17;34154:47;34218:131;34344:4;34218:131;:::i;:::-;34210:139;;33937:419;;;:::o;34362:224::-;34502:34;34498:1;34490:6;34486:14;34479:58;34571:7;34566:2;34558:6;34554:15;34547:32;34362:224;:::o;34592:366::-;34734:3;34755:67;34819:2;34814:3;34755:67;:::i;:::-;34748:74;;34831:93;34920:3;34831:93;:::i;:::-;34949:2;34944:3;34940:12;34933:19;;34592:366;;;:::o;34964:419::-;35130:4;35168:2;35157:9;35153:18;35145:26;;35217:9;35211:4;35207:20;35203:1;35192:9;35188:17;35181:47;35245:131;35371:4;35245:131;:::i;:::-;35237:139;;34964:419;;;:::o;35389:229::-;35529:34;35525:1;35517:6;35513:14;35506:58;35598:12;35593:2;35585:6;35581:15;35574:37;35389:229;:::o;35624:366::-;35766:3;35787:67;35851:2;35846:3;35787:67;:::i;:::-;35780:74;;35863:93;35952:3;35863:93;:::i;:::-;35981:2;35976:3;35972:12;35965:19;;35624:366;;;:::o;35996:419::-;36162:4;36200:2;36189:9;36185:18;36177:26;;36249:9;36243:4;36239:20;36235:1;36224:9;36220:17;36213:47;36277:131;36403:4;36277:131;:::i;:::-;36269:139;;35996:419;;;:::o;36421:634::-;36642:4;36680:2;36669:9;36665:18;36657:26;;36729:9;36723:4;36719:20;36715:1;36704:9;36700:17;36693:47;36757:108;36860:4;36851:6;36757:108;:::i;:::-;36749:116;;36912:9;36906:4;36902:20;36897:2;36886:9;36882:18;36875:48;36940:108;37043:4;37034:6;36940:108;:::i;:::-;36932:116;;36421:634;;;;;:::o;37061:98::-;37112:6;37146:5;37140:12;37130:22;;37061:98;;;:::o;37165:168::-;37248:11;37282:6;37277:3;37270:19;37322:4;37317:3;37313:14;37298:29;;37165:168;;;;:::o;37339:360::-;37425:3;37453:38;37485:5;37453:38;:::i;:::-;37507:70;37570:6;37565:3;37507:70;:::i;:::-;37500:77;;37586:52;37631:6;37626:3;37619:4;37612:5;37608:16;37586:52;:::i;:::-;37663:29;37685:6;37663:29;:::i;:::-;37658:3;37654:39;37647:46;;37429:270;37339:360;;;;:::o;37705:751::-;37928:4;37966:3;37955:9;37951:19;37943:27;;37980:71;38048:1;38037:9;38033:17;38024:6;37980:71;:::i;:::-;38061:72;38129:2;38118:9;38114:18;38105:6;38061:72;:::i;:::-;38143;38211:2;38200:9;38196:18;38187:6;38143:72;:::i;:::-;38225;38293:2;38282:9;38278:18;38269:6;38225:72;:::i;:::-;38345:9;38339:4;38335:20;38329:3;38318:9;38314:19;38307:49;38373:76;38444:4;38435:6;38373:76;:::i;:::-;38365:84;;37705:751;;;;;;;;:::o;38462:141::-;38518:5;38549:6;38543:13;38534:22;;38565:32;38591:5;38565:32;:::i;:::-;38462:141;;;;:::o;38609:349::-;38678:6;38727:2;38715:9;38706:7;38702:23;38698:32;38695:119;;;38733:79;;:::i;:::-;38695:119;38853:1;38878:63;38933:7;38924:6;38913:9;38909:22;38878:63;:::i;:::-;38868:73;;38824:127;38609:349;;;;:::o;38964:106::-;39008:8;39057:5;39052:3;39048:15;39027:36;;38964:106;;;:::o;39076:183::-;39111:3;39149:1;39131:16;39128:23;39125:128;;;39187:1;39184;39181;39166:23;39209:34;39240:1;39234:8;39209:34;:::i;:::-;39202:41;;39125:128;39076:183;:::o;39265:711::-;39304:3;39342:4;39324:16;39321:26;39350:5;39318:39;39379:20;;:::i;:::-;39454:1;39436:16;39432:24;39429:1;39423:4;39408:49;39487:4;39481:11;39586:16;39579:4;39571:6;39567:17;39564:39;39531:18;39523:6;39520:30;39504:113;39501:146;;;39632:5;;;;39501:146;39678:6;39672:4;39668:17;39714:3;39708:10;39741:18;39733:6;39730:30;39727:43;;;39763:5;;;;;;39727:43;39811:6;39804:4;39799:3;39795:14;39791:27;39870:1;39852:16;39848:24;39842:4;39838:35;39833:3;39830:44;39827:57;;;39877:5;;;;;;;39827:57;39894;39942:6;39936:4;39932:17;39924:6;39920:30;39914:4;39894:57;:::i;:::-;39967:3;39960:10;;39308:668;;;;;39265:711;;:::o;39982:239::-;40122:34;40118:1;40110:6;40106:14;40099:58;40191:22;40186:2;40178:6;40174:15;40167:47;39982:239;:::o;40227:366::-;40369:3;40390:67;40454:2;40449:3;40390:67;:::i;:::-;40383:74;;40466:93;40555:3;40466:93;:::i;:::-;40584:2;40579:3;40575:12;40568:19;;40227:366;;;:::o;40599:419::-;40765:4;40803:2;40792:9;40788:18;40780:26;;40852:9;40846:4;40842:20;40838:1;40827:9;40823:17;40816:47;40880:131;41006:4;40880:131;:::i;:::-;40872:139;;40599:419;;;:::o;41024:227::-;41164:34;41160:1;41152:6;41148:14;41141:58;41233:10;41228:2;41220:6;41216:15;41209:35;41024:227;:::o;41257:366::-;41399:3;41420:67;41484:2;41479:3;41420:67;:::i;:::-;41413:74;;41496:93;41585:3;41496:93;:::i;:::-;41614:2;41609:3;41605:12;41598:19;;41257:366;;;:::o;41629:419::-;41795:4;41833:2;41822:9;41818:18;41810:26;;41882:9;41876:4;41872:20;41868:1;41857:9;41853:17;41846:47;41910:131;42036:4;41910:131;:::i;:::-;41902:139;;41629:419;;;:::o;42054:1053::-;42377:4;42415:3;42404:9;42400:19;42392:27;;42429:71;42497:1;42486:9;42482:17;42473:6;42429:71;:::i;:::-;42510:72;42578:2;42567:9;42563:18;42554:6;42510:72;:::i;:::-;42629:9;42623:4;42619:20;42614:2;42603:9;42599:18;42592:48;42657:108;42760:4;42751:6;42657:108;:::i;:::-;42649:116;;42812:9;42806:4;42802:20;42797:2;42786:9;42782:18;42775:48;42840:108;42943:4;42934:6;42840:108;:::i;:::-;42832:116;;42996:9;42990:4;42986:20;42980:3;42969:9;42965:19;42958:49;43024:76;43095:4;43086:6;43024:76;:::i;:::-;43016:84;;42054:1053;;;;;;;;:::o;43113:148::-;43215:11;43252:3;43237:18;;43113:148;;;;:::o;43267:214::-;43407:66;43403:1;43395:6;43391:14;43384:90;43267:214;:::o;43487:402::-;43647:3;43668:85;43750:2;43745:3;43668:85;:::i;:::-;43661:92;;43762:93;43851:3;43762:93;:::i;:::-;43880:2;43875:3;43871:12;43864:19;;43487:402;;;:::o;43895:79::-;43934:7;43963:5;43952:16;;43895:79;;;:::o;43980:157::-;44085:45;44105:24;44123:5;44105:24;:::i;:::-;44085:45;:::i;:::-;44080:3;44073:58;43980:157;;:::o;44143:522::-;44356:3;44378:148;44522:3;44378:148;:::i;:::-;44371:155;;44536:75;44607:3;44598:6;44536:75;:::i;:::-;44636:2;44631:3;44627:12;44620:19;;44656:3;44649:10;;44143:522;;;;:::o;44671:180::-;44719:77;44716:1;44709:88;44816:4;44813:1;44806:15;44840:4;44837:1;44830:15;44857:174;44997:26;44993:1;44985:6;44981:14;44974:50;44857:174;:::o;45037:366::-;45179:3;45200:67;45264:2;45259:3;45200:67;:::i;:::-;45193:74;;45276:93;45365:3;45276:93;:::i;:::-;45394:2;45389:3;45385:12;45378:19;;45037:366;;;:::o;45409:419::-;45575:4;45613:2;45602:9;45598:18;45590:26;;45662:9;45656:4;45652:20;45648:1;45637:9;45633:17;45626:47;45690:131;45816:4;45690:131;:::i;:::-;45682:139;;45409:419;;;:::o;45834:181::-;45974:33;45970:1;45962:6;45958:14;45951:57;45834:181;:::o;46021:366::-;46163:3;46184:67;46248:2;46243:3;46184:67;:::i;:::-;46177:74;;46260:93;46349:3;46260:93;:::i;:::-;46378:2;46373:3;46369:12;46362:19;;46021:366;;;:::o;46393:419::-;46559:4;46597:2;46586:9;46582:18;46574:26;;46646:9;46640:4;46636:20;46632:1;46621:9;46617:17;46610:47;46674:131;46800:4;46674:131;:::i;:::-;46666:139;;46393:419;;;:::o;46818:221::-;46958:34;46954:1;46946:6;46942:14;46935:58;47027:4;47022:2;47014:6;47010:15;47003:29;46818:221;:::o;47045:366::-;47187:3;47208:67;47272:2;47267:3;47208:67;:::i;:::-;47201:74;;47284:93;47373:3;47284:93;:::i;:::-;47402:2;47397:3;47393:12;47386:19;;47045:366;;;:::o;47417:419::-;47583:4;47621:2;47610:9;47606:18;47598:26;;47670:9;47664:4;47660:20;47656:1;47645:9;47641:17;47634:47;47698:131;47824:4;47698:131;:::i;:::-;47690:139;;47417:419;;;:::o;47842:221::-;47982:34;47978:1;47970:6;47966:14;47959:58;48051:4;48046:2;48038:6;48034:15;48027:29;47842:221;:::o;48069:366::-;48211:3;48232:67;48296:2;48291:3;48232:67;:::i;:::-;48225:74;;48308:93;48397:3;48308:93;:::i;:::-;48426:2;48421:3;48417:12;48410:19;;48069:366;;;:::o;48441:419::-;48607:4;48645:2;48634:9;48630:18;48622:26;;48694:9;48688:4;48684:20;48680:1;48669:9;48665:17;48658:47;48722:131;48848:4;48722:131;:::i;:::-;48714:139;;48441:419;;;:::o;48866:118::-;48953:24;48971:5;48953:24;:::i;:::-;48948:3;48941:37;48866:118;;:::o;48990:86::-;49025:7;49065:4;49058:5;49054:16;49043:27;;48990:86;;;:::o;49082:112::-;49165:22;49181:5;49165:22;:::i;:::-;49160:3;49153:35;49082:112;;:::o;49200:545::-;49373:4;49411:3;49400:9;49396:19;49388:27;;49425:71;49493:1;49482:9;49478:17;49469:6;49425:71;:::i;:::-;49506:68;49570:2;49559:9;49555:18;49546:6;49506:68;:::i;:::-;49584:72;49652:2;49641:9;49637:18;49628:6;49584:72;:::i;:::-;49666;49734:2;49723:9;49719:18;49710:6;49666:72;:::i;:::-;49200:545;;;;;;;:::o

Swarm Source

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