ETH Price: $3,169.25 (+2.29%)

Token

Dispatch-Messaging-ETH (DISPATCH)
 

Overview

Max Total Supply

223 DISPATCH

Holders

212

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
alexanderwu.eth
0xdd6fb752119a17098b11649cac6caaee72f5fff1
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:
DispatchMessenger

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @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);
}

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)
/**
 * @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;
}

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)
/**
 * @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);
}

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

        return account.code.length > 0;
    }

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
 * @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;
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
/**
 * @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;
    }
}

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)
/**
 * @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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        address operator = _msgSender();

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

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

        _doSafeTransferAcceptanceCheck(operator, address(0), to, 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 `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `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.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

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

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

        return array;
    }
}

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

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

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

    /**
     * @dev 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 {
        _transferOwnership(address(0));
    }

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

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

/// @title Base NFT contract - used to reduce shared code between Messenger and Admin contracts
/// @author Dispatch.xyz
/// @notice this is an abstract contract and is meant to be extended
/// @dev remember that Admin and Messenger use their own instance of this same base contract
abstract contract NFTMetadata is ERC1155, Ownable {
  // we increment the counter for a new message campaign
  uint256 public tokenCounter;
  // token mint + token admin have their own unique name + symbol
  string public name;
  string public symbol;
  // maps the nftID to a particular tokenURI
  mapping(uint256 => string) internal tokenURI;

  /**
        @notice Sets the URI metadata for a particular nftID
        @param _tokenCounter the nftID
        @param _metadata metadata for the MESSAGE NFT
     */
  function _setTokenURI(uint256 _tokenCounter, string memory _metadata) internal {
    // sets the metadata - internal to this contract
    tokenURI[_tokenCounter] = _metadata;
  }

  /**
        @notice Returns the metadata URI of an nftID
        @param _id the nftID
     */
  function uri(uint256 _id) public view override returns (string memory) {
    // returns the metadata - readonly
    return tokenURI[_id];
  }
}

/// @title NFT Messenger Contract - sends messages on behalf of the Admin contract (which is the Owner)
/// @author Dispatch.xyz
/// @notice after deploying the contract, transfer the ownership to DispatchAdmin contract.
/// @dev this contract is entirely controlled by the Admin contract
contract DispatchMessenger is NFTMetadata {
  constructor() ERC1155("https://ipfs.io/ipfs/") {
    name = "Dispatch-Messaging-ETH";
    symbol = "DISPATCH";
  }

  /**
        @notice Mints tokens to an address. Meant to be TokenOrg's wallet address
        @param _to where we send the NFT. Meant to be TokenOrg's wallet address
        @param _amount of tokens to mint
        @param _metadata metadata for the MESSAGE NFT
     */
  function mint(
    address _to,
    uint256 _amount,
    string memory _metadata
  ) external onlyOwner returns (uint256) {
    // mint N nfts to the _to address which will be the TokenOrgWallet
    _mint(_to, ++tokenCounter, _amount, "");
    // sets the URI metadata for the newly minted token
    _setTokenURI(tokenCounter, _metadata);
    return (tokenCounter);
  }

  /**
        @notice Burns tokens at an address. Allows for owner to burn messages
        @param _from where we send the NFT. Meant to be TokenOrg's wallet address
        @param _id of token to burn
        @param _amount quantity to burn
     */
  function burnMessage(
    address _from,
    uint256 _id,
    uint256 _amount
  ) external onlyOwner {
    _burn(_from, _id, _amount);
  }

  /**
   * @notice Override isApprovedForAll to auto-approve OS's proxy contract
   * @param _owner of the token
   * @param _operator to be approved
   */
  function isApprovedForAll(address _owner, address _operator) public view override returns (bool isOperator) {
    if (_operator == address(owner())) {
      return true;
    }
    // otherwise, use the default ERC1155.isApprovedForAll()
    return ERC1155.isApprovedForAll(_owner, _operator);
  }
}

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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_metadata","type":"string"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":[],"name":"tokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060408051808201909152601581527f68747470733a2f2f697066732e696f2f697066732f000000000000000000000060208201526200005181620000dc565b506200005d33620000f5565b6040805180820190915260168082527f44697370617463682d4d6573736167696e672d455448000000000000000000006020909201918252620000a39160059162000147565b506040805180820190915260088082526708892a6a082a886960c31b6020909201918252620000d59160069162000147565b5062000229565b8051620000f190600290602084019062000147565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200015590620001ed565b90600052602060002090601f016020900481019282620001795760008555620001c4565b82601f106200019457805160ff1916838001178555620001c4565b82800160010185558215620001c4579182015b82811115620001c4578251825591602001919060010190620001a7565b50620001d2929150620001d6565b5090565b5b80821115620001d25760008155600101620001d7565b600181811c908216806200020257607f821691505b6020821081036200022357634e487b7160e01b600052602260045260246000fd5b50919050565b611b7f80620002396000396000f3fe608060405234801561001057600080fd5b50600436106100ff5760003560e01c806395d89b4111610097578063db401f1b11610066578063db401f1b14610204578063e985e9c514610217578063f242432a1461022a578063f2fde38b1461023d57600080fd5b806395d89b41146101cd578063a22cb465146101d5578063d082e381146101e8578063d3fc9864146101f157600080fd5b80632eb2c2d6116100d35780632eb2c2d6146101755780634e1273f41461018a578063715018a6146101aa5780638da5cb5b146101b257600080fd5b8062fdd58e1461010457806301ffc9a71461012a57806306fdde031461014d5780630e89341c14610162575b600080fd5b610117610112366004611296565b610250565b6040519081526020015b60405180910390f35b61013d6101383660046112d6565b6102ea565b6040519015158152602001610121565b61015561033a565b6040516101219190611340565b610155610170366004611353565b6103c8565b6101886101833660046114c2565b61046a565b005b61019d61019836600461156c565b610501565b6040516101219190611672565b61018861062b565b6003546040516001600160a01b039091168152602001610121565b610155610661565b6101886101e3366004611685565b61066e565b61011760045481565b6101176101ff3660046116c1565b61067d565b61018861021236600461172c565b6106f0565b61013d61022536600461175f565b61072a565b610188610238366004611792565b61078f565b61018861024b3660046117f7565b610816565b60006001600160a01b0383166102c15760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061031b57506001600160e01b031982166303a24d0760e21b145b806102e457506301ffc9a760e01b6001600160e01b03198316146102e4565b6005805461034790611812565b80601f016020809104026020016040519081016040528092919081815260200182805461037390611812565b80156103c05780601f10610395576101008083540402835291602001916103c0565b820191906000526020600020905b8154815290600101906020018083116103a357829003601f168201915b505050505081565b60008181526007602052604090208054606091906103e590611812565b80601f016020809104026020016040519081016040528092919081815260200182805461041190611812565b801561045e5780601f106104335761010080835404028352916020019161045e565b820191906000526020600020905b81548152906001019060200180831161044157829003601f168201915b50505050509050919050565b6001600160a01b0385163314806104865750610486853361072a565b6104ed5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016102b8565b6104fa85858585856108b1565b5050505050565b606081518351146105665760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016102b8565b6000835167ffffffffffffffff8111156105825761058261136c565b6040519080825280602002602001820160405280156105ab578160200160208202803683370190505b50905060005b8451811015610623576105f68582815181106105cf576105cf61184c565b60200260200101518583815181106105e9576105e961184c565b6020026020010151610250565b8282815181106106085761060861184c565b602090810291909101015261061c81611878565b90506105b1565b509392505050565b6003546001600160a01b031633146106555760405162461bcd60e51b81526004016102b890611891565b61065f6000610a8e565b565b6006805461034790611812565b610679338383610ae0565b5050565b6003546000906001600160a01b031633146106aa5760405162461bcd60e51b81526004016102b890611891565b6106d9846004600081546106bd90611878565b9190508190558560405180602001604052806000815250610bc0565b6106e560045483610cca565b506004549392505050565b6003546001600160a01b0316331461071a5760405162461bcd60e51b81526004016102b890611891565b610725838383610ce9565b505050565b600061073e6003546001600160a01b031690565b6001600160a01b0316826001600160a01b03160361075e575060016102e4565b6001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b6001600160a01b0385163314806107ab57506107ab853361072a565b6108095760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016102b8565b6104fa8585858585610e63565b6003546001600160a01b031633146108405760405162461bcd60e51b81526004016102b890611891565b6001600160a01b0381166108a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102b8565b6108ae81610a8e565b50565b81518351146109135760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016102b8565b6001600160a01b0384166109395760405162461bcd60e51b81526004016102b8906118c6565b3360005b8451811015610a2057600085828151811061095a5761095a61184c565b6020026020010151905060008583815181106109785761097861184c565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156109c85760405162461bcd60e51b81526004016102b89061190b565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610a05908490611955565b9250508190555050505080610a1990611878565b905061093d565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610a7092919061196d565b60405180910390a4610a86818787878787610f80565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603610b535760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016102b8565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416610c205760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016102b8565b33610c3a81600087610c31886110db565b6104fa886110db565b6000848152602081815260408083206001600160a01b038916845290915281208054859290610c6a908490611955565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46104fa81600087878787611126565b60008281526007602090815260409091208251610725928401906111e1565b6001600160a01b038316610d4b5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016102b8565b33610d7b81856000610d5c876110db565b610d65876110db565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b038816845290915290205482811015610df85760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016102b8565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b038416610e895760405162461bcd60e51b81526004016102b8906118c6565b33610e99818787610c31886110db565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015610eda5760405162461bcd60e51b81526004016102b89061190b565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290610f17908490611955565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610f77828888888888611126565b50505050505050565b6001600160a01b0384163b15610a865760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190610fc4908990899088908890889060040161199b565b6020604051808303816000875af1925050508015610fff575060408051601f3d908101601f19168201909252610ffc918101906119f9565b60015b6110ab5761100b611a16565b806308c379a003611044575061101f611a32565b8061102a5750611046565b8060405162461bcd60e51b81526004016102b89190611340565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016102b8565b6001600160e01b0319811663bc197c8160e01b14610f775760405162461bcd60e51b81526004016102b890611abc565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106111155761111561184c565b602090810291909101015292915050565b6001600160a01b0384163b15610a865760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061116a9089908990889088908890600401611b04565b6020604051808303816000875af19250505080156111a5575060408051601f3d908101601f191682019092526111a2918101906119f9565b60015b6111b15761100b611a16565b6001600160e01b0319811663f23a6e6160e01b14610f775760405162461bcd60e51b81526004016102b890611abc565b8280546111ed90611812565b90600052602060002090601f01602090048101928261120f5760008555611255565b82601f1061122857805160ff1916838001178555611255565b82800160010185558215611255579182015b8281111561125557825182559160200191906001019061123a565b50611261929150611265565b5090565b5b808211156112615760008155600101611266565b80356001600160a01b038116811461129157600080fd5b919050565b600080604083850312156112a957600080fd5b6112b28361127a565b946020939093013593505050565b6001600160e01b0319811681146108ae57600080fd5b6000602082840312156112e857600080fd5b8135610788816112c0565b6000815180845260005b81811015611319576020818501810151868301820152016112fd565b8181111561132b576000602083870101525b50601f01601f19169290920160200192915050565b60208152600061078860208301846112f3565b60006020828403121561136557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156113a8576113a861136c565b6040525050565b600067ffffffffffffffff8211156113c9576113c961136c565b5060051b60200190565b600082601f8301126113e457600080fd5b813560206113f1826113af565b6040516113fe8282611382565b83815260059390931b850182019282810191508684111561141e57600080fd5b8286015b848110156114395780358352918301918301611422565b509695505050505050565b600067ffffffffffffffff83111561145e5761145e61136c565b604051611475601f8501601f191660200182611382565b80915083815284848401111561148a57600080fd5b83836020830137600060208583010152509392505050565b600082601f8301126114b357600080fd5b61078883833560208501611444565b600080600080600060a086880312156114da57600080fd5b6114e38661127a565b94506114f16020870161127a565b9350604086013567ffffffffffffffff8082111561150e57600080fd5b61151a89838a016113d3565b9450606088013591508082111561153057600080fd5b61153c89838a016113d3565b9350608088013591508082111561155257600080fd5b5061155f888289016114a2565b9150509295509295909350565b6000806040838503121561157f57600080fd5b823567ffffffffffffffff8082111561159757600080fd5b818501915085601f8301126115ab57600080fd5b813560206115b8826113af565b6040516115c58282611382565b83815260059390931b85018201928281019150898411156115e557600080fd5b948201945b8386101561160a576115fb8661127a565b825294820194908201906115ea565b9650508601359250508082111561162057600080fd5b5061162d858286016113d3565b9150509250929050565b600081518084526020808501945080840160005b838110156116675781518752958201959082019060010161164b565b509495945050505050565b6020815260006107886020830184611637565b6000806040838503121561169857600080fd5b6116a18361127a565b9150602083013580151581146116b657600080fd5b809150509250929050565b6000806000606084860312156116d657600080fd5b6116df8461127a565b925060208401359150604084013567ffffffffffffffff81111561170257600080fd5b8401601f8101861361171357600080fd5b61172286823560208401611444565b9150509250925092565b60008060006060848603121561174157600080fd5b61174a8461127a565b95602085013595506040909401359392505050565b6000806040838503121561177257600080fd5b61177b8361127a565b91506117896020840161127a565b90509250929050565b600080600080600060a086880312156117aa57600080fd5b6117b38661127a565b94506117c16020870161127a565b93506040860135925060608601359150608086013567ffffffffffffffff8111156117eb57600080fd5b61155f888289016114a2565b60006020828403121561180957600080fd5b6107888261127a565b600181811c9082168061182657607f821691505b60208210810361184657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161188a5761188a611862565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6000821982111561196857611968611862565b500190565b6040815260006119806040830185611637565b82810360208401526119928185611637565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906119c790830186611637565b82810360608401526119d98186611637565b905082810360808401526119ed81856112f3565b98975050505050505050565b600060208284031215611a0b57600080fd5b8151610788816112c0565b600060033d1115611a2f5760046000803e5060005160e01c5b90565b600060443d1015611a405790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611a7057505050505090565b8285019150815181811115611a885750505050505090565b843d8701016020828501011115611aa25750505050505090565b611ab160208286010187611382565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611b3e908301846112f3565b97965050505050505056fea264697066735822122085d09765f134e94e9c1391cb7907176cb53d642b6b616661992b2277a9d2fba864736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ff5760003560e01c806395d89b4111610097578063db401f1b11610066578063db401f1b14610204578063e985e9c514610217578063f242432a1461022a578063f2fde38b1461023d57600080fd5b806395d89b41146101cd578063a22cb465146101d5578063d082e381146101e8578063d3fc9864146101f157600080fd5b80632eb2c2d6116100d35780632eb2c2d6146101755780634e1273f41461018a578063715018a6146101aa5780638da5cb5b146101b257600080fd5b8062fdd58e1461010457806301ffc9a71461012a57806306fdde031461014d5780630e89341c14610162575b600080fd5b610117610112366004611296565b610250565b6040519081526020015b60405180910390f35b61013d6101383660046112d6565b6102ea565b6040519015158152602001610121565b61015561033a565b6040516101219190611340565b610155610170366004611353565b6103c8565b6101886101833660046114c2565b61046a565b005b61019d61019836600461156c565b610501565b6040516101219190611672565b61018861062b565b6003546040516001600160a01b039091168152602001610121565b610155610661565b6101886101e3366004611685565b61066e565b61011760045481565b6101176101ff3660046116c1565b61067d565b61018861021236600461172c565b6106f0565b61013d61022536600461175f565b61072a565b610188610238366004611792565b61078f565b61018861024b3660046117f7565b610816565b60006001600160a01b0383166102c15760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061031b57506001600160e01b031982166303a24d0760e21b145b806102e457506301ffc9a760e01b6001600160e01b03198316146102e4565b6005805461034790611812565b80601f016020809104026020016040519081016040528092919081815260200182805461037390611812565b80156103c05780601f10610395576101008083540402835291602001916103c0565b820191906000526020600020905b8154815290600101906020018083116103a357829003601f168201915b505050505081565b60008181526007602052604090208054606091906103e590611812565b80601f016020809104026020016040519081016040528092919081815260200182805461041190611812565b801561045e5780601f106104335761010080835404028352916020019161045e565b820191906000526020600020905b81548152906001019060200180831161044157829003601f168201915b50505050509050919050565b6001600160a01b0385163314806104865750610486853361072a565b6104ed5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016102b8565b6104fa85858585856108b1565b5050505050565b606081518351146105665760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016102b8565b6000835167ffffffffffffffff8111156105825761058261136c565b6040519080825280602002602001820160405280156105ab578160200160208202803683370190505b50905060005b8451811015610623576105f68582815181106105cf576105cf61184c565b60200260200101518583815181106105e9576105e961184c565b6020026020010151610250565b8282815181106106085761060861184c565b602090810291909101015261061c81611878565b90506105b1565b509392505050565b6003546001600160a01b031633146106555760405162461bcd60e51b81526004016102b890611891565b61065f6000610a8e565b565b6006805461034790611812565b610679338383610ae0565b5050565b6003546000906001600160a01b031633146106aa5760405162461bcd60e51b81526004016102b890611891565b6106d9846004600081546106bd90611878565b9190508190558560405180602001604052806000815250610bc0565b6106e560045483610cca565b506004549392505050565b6003546001600160a01b0316331461071a5760405162461bcd60e51b81526004016102b890611891565b610725838383610ce9565b505050565b600061073e6003546001600160a01b031690565b6001600160a01b0316826001600160a01b03160361075e575060016102e4565b6001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b6001600160a01b0385163314806107ab57506107ab853361072a565b6108095760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016102b8565b6104fa8585858585610e63565b6003546001600160a01b031633146108405760405162461bcd60e51b81526004016102b890611891565b6001600160a01b0381166108a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102b8565b6108ae81610a8e565b50565b81518351146109135760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016102b8565b6001600160a01b0384166109395760405162461bcd60e51b81526004016102b8906118c6565b3360005b8451811015610a2057600085828151811061095a5761095a61184c565b6020026020010151905060008583815181106109785761097861184c565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156109c85760405162461bcd60e51b81526004016102b89061190b565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610a05908490611955565b9250508190555050505080610a1990611878565b905061093d565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610a7092919061196d565b60405180910390a4610a86818787878787610f80565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603610b535760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016102b8565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416610c205760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016102b8565b33610c3a81600087610c31886110db565b6104fa886110db565b6000848152602081815260408083206001600160a01b038916845290915281208054859290610c6a908490611955565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46104fa81600087878787611126565b60008281526007602090815260409091208251610725928401906111e1565b6001600160a01b038316610d4b5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016102b8565b33610d7b81856000610d5c876110db565b610d65876110db565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b038816845290915290205482811015610df85760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016102b8565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b038416610e895760405162461bcd60e51b81526004016102b8906118c6565b33610e99818787610c31886110db565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015610eda5760405162461bcd60e51b81526004016102b89061190b565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290610f17908490611955565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610f77828888888888611126565b50505050505050565b6001600160a01b0384163b15610a865760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190610fc4908990899088908890889060040161199b565b6020604051808303816000875af1925050508015610fff575060408051601f3d908101601f19168201909252610ffc918101906119f9565b60015b6110ab5761100b611a16565b806308c379a003611044575061101f611a32565b8061102a5750611046565b8060405162461bcd60e51b81526004016102b89190611340565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016102b8565b6001600160e01b0319811663bc197c8160e01b14610f775760405162461bcd60e51b81526004016102b890611abc565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106111155761111561184c565b602090810291909101015292915050565b6001600160a01b0384163b15610a865760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061116a9089908990889088908890600401611b04565b6020604051808303816000875af19250505080156111a5575060408051601f3d908101601f191682019092526111a2918101906119f9565b60015b6111b15761100b611a16565b6001600160e01b0319811663f23a6e6160e01b14610f775760405162461bcd60e51b81526004016102b890611abc565b8280546111ed90611812565b90600052602060002090601f01602090048101928261120f5760008555611255565b82601f1061122857805160ff1916838001178555611255565b82800160010185558215611255579182015b8281111561125557825182559160200191906001019061123a565b50611261929150611265565b5090565b5b808211156112615760008155600101611266565b80356001600160a01b038116811461129157600080fd5b919050565b600080604083850312156112a957600080fd5b6112b28361127a565b946020939093013593505050565b6001600160e01b0319811681146108ae57600080fd5b6000602082840312156112e857600080fd5b8135610788816112c0565b6000815180845260005b81811015611319576020818501810151868301820152016112fd565b8181111561132b576000602083870101525b50601f01601f19169290920160200192915050565b60208152600061078860208301846112f3565b60006020828403121561136557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156113a8576113a861136c565b6040525050565b600067ffffffffffffffff8211156113c9576113c961136c565b5060051b60200190565b600082601f8301126113e457600080fd5b813560206113f1826113af565b6040516113fe8282611382565b83815260059390931b850182019282810191508684111561141e57600080fd5b8286015b848110156114395780358352918301918301611422565b509695505050505050565b600067ffffffffffffffff83111561145e5761145e61136c565b604051611475601f8501601f191660200182611382565b80915083815284848401111561148a57600080fd5b83836020830137600060208583010152509392505050565b600082601f8301126114b357600080fd5b61078883833560208501611444565b600080600080600060a086880312156114da57600080fd5b6114e38661127a565b94506114f16020870161127a565b9350604086013567ffffffffffffffff8082111561150e57600080fd5b61151a89838a016113d3565b9450606088013591508082111561153057600080fd5b61153c89838a016113d3565b9350608088013591508082111561155257600080fd5b5061155f888289016114a2565b9150509295509295909350565b6000806040838503121561157f57600080fd5b823567ffffffffffffffff8082111561159757600080fd5b818501915085601f8301126115ab57600080fd5b813560206115b8826113af565b6040516115c58282611382565b83815260059390931b85018201928281019150898411156115e557600080fd5b948201945b8386101561160a576115fb8661127a565b825294820194908201906115ea565b9650508601359250508082111561162057600080fd5b5061162d858286016113d3565b9150509250929050565b600081518084526020808501945080840160005b838110156116675781518752958201959082019060010161164b565b509495945050505050565b6020815260006107886020830184611637565b6000806040838503121561169857600080fd5b6116a18361127a565b9150602083013580151581146116b657600080fd5b809150509250929050565b6000806000606084860312156116d657600080fd5b6116df8461127a565b925060208401359150604084013567ffffffffffffffff81111561170257600080fd5b8401601f8101861361171357600080fd5b61172286823560208401611444565b9150509250925092565b60008060006060848603121561174157600080fd5b61174a8461127a565b95602085013595506040909401359392505050565b6000806040838503121561177257600080fd5b61177b8361127a565b91506117896020840161127a565b90509250929050565b600080600080600060a086880312156117aa57600080fd5b6117b38661127a565b94506117c16020870161127a565b93506040860135925060608601359150608086013567ffffffffffffffff8111156117eb57600080fd5b61155f888289016114a2565b60006020828403121561180957600080fd5b6107888261127a565b600181811c9082168061182657607f821691505b60208210810361184657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161188a5761188a611862565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6000821982111561196857611968611862565b500190565b6040815260006119806040830185611637565b82810360208401526119928185611637565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906119c790830186611637565b82810360608401526119d98186611637565b905082810360808401526119ed81856112f3565b98975050505050505050565b600060208284031215611a0b57600080fd5b8151610788816112c0565b600060033d1115611a2f5760046000803e5060005160e01c5b90565b600060443d1015611a405790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611a7057505050505090565b8285019150815181811115611a885750505050505090565b843d8701016020828501011115611aa25750505050505090565b611ab160208286010187611382565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611b3e908301846112f3565b97965050505050505056fea264697066735822122085d09765f134e94e9c1391cb7907176cb53d642b6b616661992b2277a9d2fba864736f6c634300080d0033

Deployed Bytecode Sourcemap

37611:1704:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20118:231;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;20118:231:0;;;;;;;;19141:310;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;19141:310:0;1019:187:1;36562:18:0;;;:::i;:::-;;;;;;;:::i;37167:144::-;;;;;;:::i;:::-;;:::i;22057:442::-;;;;;;:::i;:::-;;:::i;:::-;;20515:524;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35246:103::-;;;:::i;34595:87::-;34668:6;;34595:87;;-1:-1:-1;;;;;34668:6:0;;;7112:51:1;;7100:2;7085:18;34595:87:0;6966:203:1;36585:20:0;;;:::i;21112:155::-;;;;;;:::i;:::-;;:::i;36463:27::-;;;;;;38058:379;;;;;;:::i;:::-;;:::i;38699:144::-;;;;;;:::i;:::-;;:::i;39010:302::-;;;;;;:::i;:::-;;:::i;21579:401::-;;;;;;:::i;:::-;;:::i;35504:201::-;;;;;;:::i;:::-;;:::i;20118:231::-;20204:7;-1:-1:-1;;;;;20232:21:0;;20224:77;;;;-1:-1:-1;;;20224:77:0;;9719:2:1;20224:77:0;;;9701:21:1;9758:2;9738:18;;;9731:30;9797:34;9777:18;;;9770:62;-1:-1:-1;;;9848:18:1;;;9841:41;9899:19;;20224:77:0;;;;;;;;;-1:-1:-1;20319:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;20319:22:0;;;;;;;;;;20118:231;;;;;:::o;19141:310::-;19243:4;-1:-1:-1;;;;;;19280:41:0;;-1:-1:-1;;;19280:41:0;;:110;;-1:-1:-1;;;;;;;19338:52:0;;-1:-1:-1;;;19338:52:0;19280:110;:163;;;-1:-1:-1;;;;;;;;;;18114:40:0;;;19407:36;18005:157;36562:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37167:144::-;37292:13;;;;:8;:13;;;;;37285:20;;37223:13;;37292;37285:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37167:144;;;:::o;22057:442::-;-1:-1:-1;;;;;22290:20:0;;17106:10;22290:20;;:60;;-1:-1:-1;22314:36:0;22331:4;17106:10;39010:302;:::i;22314:36::-;22268:160;;;;-1:-1:-1;;;22268:160:0;;10516:2:1;22268:160:0;;;10498:21:1;10555:2;10535:18;;;10528:30;10594:34;10574:18;;;10567:62;-1:-1:-1;;;10645:18:1;;;10638:48;10703:19;;22268:160:0;10314:414:1;22268:160:0;22439:52;22462:4;22468:2;22472:3;22477:7;22486:4;22439:22;:52::i;:::-;22057:442;;;;;:::o;20515:524::-;20671:16;20732:3;:10;20713:8;:15;:29;20705:83;;;;-1:-1:-1;;;20705:83:0;;10935:2:1;20705:83:0;;;10917:21:1;10974:2;10954:18;;;10947:30;11013:34;10993:18;;;10986:62;-1:-1:-1;;;11064:18:1;;;11057:39;11113:19;;20705:83:0;10733:405:1;20705:83:0;20801:30;20848:8;:15;20834:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20834:30:0;;20801:63;;20882:9;20877:122;20901:8;:15;20897:1;:19;20877:122;;;20957:30;20967:8;20976:1;20967:11;;;;;;;;:::i;:::-;;;;;;;20980:3;20984:1;20980:6;;;;;;;;:::i;:::-;;;;;;;20957:9;:30::i;:::-;20938:13;20952:1;20938:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;20918:3;;;:::i;:::-;;;20877:122;;;-1:-1:-1;21018:13:0;20515:524;-1:-1:-1;;;20515:524:0:o;35246:103::-;34668:6;;-1:-1:-1;;;;;34668:6:0;17106:10;34815:23;34807:68;;;;-1:-1:-1;;;34807:68:0;;;;;;;:::i;:::-;35311:30:::1;35338:1;35311:18;:30::i;:::-;35246:103::o:0;36585:20::-;;;;;;;:::i;21112:155::-;21207:52;17106:10;21240:8;21250;21207:18;:52::i;:::-;21112:155;;:::o;38058:379::-;34668:6;;38175:7;;-1:-1:-1;;;;;34668:6:0;17106:10;34815:23;34807:68;;;;-1:-1:-1;;;34807:68:0;;;;;;;:::i;:::-;38263:39:::1;38269:3;38276:12;;38274:14;;;;;:::i;:::-;;;;;;;38290:7;38263:39;;;;;;;;;;;::::0;:5:::1;:39::i;:::-;38366:37;38379:12;;38393:9;38366:12;:37::i;:::-;-1:-1:-1::0;38418:12:0::1;::::0;38058:379;;;;;:::o;38699:144::-;34668:6;;-1:-1:-1;;;;;34668:6:0;17106:10;34815:23;34807:68;;;;-1:-1:-1;;;34807:68:0;;;;;;;:::i;:::-;38811:26:::1;38817:5;38824:3;38829:7;38811:5;:26::i;:::-;38699:144:::0;;;:::o;39010:302::-;39101:15;39150:7;34668:6;;-1:-1:-1;;;;;34668:6:0;;34595:87;39150:7;-1:-1:-1;;;;;39129:29:0;:9;-1:-1:-1;;;;;39129:29:0;;39125:63;;-1:-1:-1;39176:4:0;39169:11;;39125:63;-1:-1:-1;;;;;21462:27:0;;;21438:4;21462:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;39263:43;39256:50;39010:302;-1:-1:-1;;;39010:302:0:o;21579:401::-;-1:-1:-1;;;;;21787:20:0;;17106:10;21787:20;;:60;;-1:-1:-1;21811:36:0;21828:4;17106:10;39010:302;:::i;21811:36::-;21765:151;;;;-1:-1:-1;;;21765:151:0;;12110:2:1;21765:151:0;;;12092:21:1;12149:2;12129:18;;;12122:30;12188:34;12168:18;;;12161:62;-1:-1:-1;;;12239:18:1;;;12232:39;12288:19;;21765:151:0;11908:405:1;21765:151:0;21927:45;21945:4;21951:2;21955;21959:6;21967:4;21927:17;:45::i;35504:201::-;34668:6;;-1:-1:-1;;;;;34668:6:0;17106:10;34815:23;34807:68;;;;-1:-1:-1;;;34807:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35593:22:0;::::1;35585:73;;;::::0;-1:-1:-1;;;35585:73:0;;12520:2:1;35585:73:0::1;::::0;::::1;12502:21:1::0;12559:2;12539:18;;;12532:30;12598:34;12578:18;;;12571:62;-1:-1:-1;;;12649:18:1;;;12642:36;12695:19;;35585:73:0::1;12318:402:1::0;35585:73:0::1;35669:28;35688:8;35669:18;:28::i;:::-;35504:201:::0;:::o;24141:1074::-;24368:7;:14;24354:3;:10;:28;24346:81;;;;-1:-1:-1;;;24346:81:0;;12927:2:1;24346:81:0;;;12909:21:1;12966:2;12946:18;;;12939:30;13005:34;12985:18;;;12978:62;-1:-1:-1;;;13056:18:1;;;13049:38;13104:19;;24346:81:0;12725:404:1;24346:81:0;-1:-1:-1;;;;;24446:16:0;;24438:66;;;;-1:-1:-1;;;24438:66:0;;;;;;;:::i;:::-;17106:10;24517:16;24634:421;24658:3;:10;24654:1;:14;24634:421;;;24690:10;24703:3;24707:1;24703:6;;;;;;;;:::i;:::-;;;;;;;24690:19;;24724:14;24741:7;24749:1;24741:10;;;;;;;;:::i;:::-;;;;;;;;;;;;24768:19;24790:13;;;;;;;;;;-1:-1:-1;;;;;24790:19:0;;;;;;;;;;;;24741:10;;-1:-1:-1;24832:21:0;;;;24824:76;;;;-1:-1:-1;;;24824:76:0;;;;;;;:::i;:::-;24944:9;:13;;;;;;;;;;;-1:-1:-1;;;;;24944:19:0;;;;;;;;;;24966:20;;;24944:42;;25016:17;;;;;;;:27;;24966:20;;24944:9;25016:27;;24966:20;;25016:27;:::i;:::-;;;;;;;;24675:380;;;24670:3;;;;:::i;:::-;;;24634:421;;;;25102:2;-1:-1:-1;;;;;25072:47:0;25096:4;-1:-1:-1;;;;;25072:47:0;25086:8;-1:-1:-1;;;;;25072:47:0;;25106:3;25111:7;25072:47;;;;;;;:::i;:::-;;;;;;;;25132:75;25168:8;25178:4;25184:2;25188:3;25193:7;25202:4;25132:35;:75::i;:::-;24335:880;24141:1074;;;;;:::o;35865:191::-;35958:6;;;-1:-1:-1;;;;;35975:17:0;;;-1:-1:-1;;;;;;35975:17:0;;;;;;;36008:40;;35958:6;;;35975:17;35958:6;;36008:40;;35939:16;;36008:40;35928:128;35865:191;:::o;30327:331::-;30482:8;-1:-1:-1;;;;;30473:17:0;:5;-1:-1:-1;;;;;30473:17:0;;30465:71;;;;-1:-1:-1;;;30465:71:0;;14756:2:1;30465:71:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:34;14814:18;;;14807:62;-1:-1:-1;;;14885:18:1;;;14878:39;14934:19;;30465:71:0;14554:405:1;30465:71:0;-1:-1:-1;;;;;30547:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;30547:46:0;;;;;;;;;;30609:41;;1159::1;;;30609::0;;1132:18:1;30609:41:0;;;;;;;30327:331;;;:::o;26533:569::-;-1:-1:-1;;;;;26686:16:0;;26678:62;;;;-1:-1:-1;;;26678:62:0;;15166:2:1;26678:62:0;;;15148:21:1;15205:2;15185:18;;;15178:30;15244:34;15224:18;;;15217:62;-1:-1:-1;;;15295:18:1;;;15288:31;15336:19;;26678:62:0;14964:397:1;26678:62:0;17106:10;26797:102;17106:10;26753:16;26840:2;26844:21;26862:2;26844:17;:21::i;:::-;26867:25;26885:6;26867:17;:25::i;26797:102::-;26912:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26912:17:0;;;;;;;;;:27;;26933:6;;26912:9;:27;;26933:6;;26912:27;:::i;:::-;;;;-1:-1:-1;;26955:52:0;;;15540:25:1;;;15596:2;15581:18;;15574:34;;;-1:-1:-1;;;;;26955:52:0;;;;26988:1;;26955:52;;;;;;15513:18:1;26955:52:0;;;;;;;27020:74;27051:8;27069:1;27073:2;27077;27081:6;27089:4;27020:30;:74::i;36880:181::-;37020:23;;;;:8;:23;;;;;;;;:35;;;;;;;;:::i;28443:648::-;-1:-1:-1;;;;;28570:18:0;;28562:66;;;;-1:-1:-1;;;28562:66:0;;15821:2:1;28562:66:0;;;15803:21:1;15860:2;15840:18;;;15833:30;15899:34;15879:18;;;15872:62;-1:-1:-1;;;15950:18:1;;;15943:33;15993:19;;28562:66:0;15619:399:1;28562:66:0;17106:10;28685:102;17106:10;28716:4;28641:16;28734:21;28752:2;28734:17;:21::i;:::-;28757:25;28775:6;28757:17;:25::i;:::-;-1:-1:-1;;28685:102:0;;;;;;;;;-1:-1:-1;28685:102:0;;-1:-1:-1;;;24141:1074:0;28685:102;28800:19;28822:13;;;;;;;;;;;-1:-1:-1;;;;;28822:19:0;;;;;;;;;;28860:21;;;;28852:70;;;;-1:-1:-1;;;28852:70:0;;16225:2:1;28852:70:0;;;16207:21:1;16264:2;16244:18;;;16237:30;16303:34;16283:18;;;16276:62;-1:-1:-1;;;16354:18:1;;;16347:34;16398:19;;28852:70:0;16023:400:1;28852:70:0;28958:9;:13;;;;;;;;;;;-1:-1:-1;;;;;28958:19:0;;;;;;;;;;;;28980:20;;;28958:42;;29029:54;;15540:25:1;;;15581:18;;;15574:34;;;28958:19:0;;29029:54;;;;;;15513:18:1;29029:54:0;;;;;;;28551:540;;28443:648;;;:::o;22963:820::-;-1:-1:-1;;;;;23151:16:0;;23143:66;;;;-1:-1:-1;;;23143:66:0;;;;;;;:::i;:::-;17106:10;23266:96;17106:10;23297:4;23303:2;23307:21;23325:2;23307:17;:21::i;23266:96::-;23375:19;23397:13;;;;;;;;;;;-1:-1:-1;;;;;23397:19:0;;;;;;;;;;23435:21;;;;23427:76;;;;-1:-1:-1;;;23427:76:0;;;;;;;:::i;:::-;23539:9;:13;;;;;;;;;;;-1:-1:-1;;;;;23539:19:0;;;;;;;;;;23561:20;;;23539:42;;23603:17;;;;;;;:27;;23561:20;;23539:9;23603:27;;23561:20;;23603:27;:::i;:::-;;;;-1:-1:-1;;23648:46:0;;;15540:25:1;;;15596:2;15581:18;;15574:34;;;-1:-1:-1;;;;;23648:46:0;;;;;;;;;;;;;;15513:18:1;23648:46:0;;;;;;;23707:68;23738:8;23748:4;23754:2;23758;23762:6;23770:4;23707:30;:68::i;:::-;23132:651;;22963:820;;;;;:::o;32595:813::-;-1:-1:-1;;;;;32835:13:0;;9457:19;:23;32831:570;;32871:79;;-1:-1:-1;;;32871:79:0;;-1:-1:-1;;;;;32871:43:0;;;;;:79;;32915:8;;32925:4;;32931:3;;32936:7;;32945:4;;32871:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32871:79:0;;;;;;;;-1:-1:-1;;32871:79:0;;;;;;;;;;;;:::i;:::-;;;32867:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;33263:6;33256:14;;-1:-1:-1;;;33256:14:0;;;;;;;;:::i;32867:523::-;;;33312:62;;-1:-1:-1;;;33312:62:0;;18576:2:1;33312:62:0;;;18558:21:1;18615:2;18595:18;;;18588:30;18654:34;18634:18;;;18627:62;-1:-1:-1;;;18705:18:1;;;18698:50;18765:19;;33312:62:0;18374:416:1;32867:523:0;-1:-1:-1;;;;;;33032:60:0;;-1:-1:-1;;;33032:60:0;33028:159;;33117:50;;-1:-1:-1;;;33117:50:0;;;;;;;:::i;33416:198::-;33536:16;;;33550:1;33536:16;;;;;;;;;33482;;33511:22;;33536:16;;;;;;;;;;;;-1:-1:-1;33536:16:0;33511:41;;33574:7;33563:5;33569:1;33563:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;33601:5;33416:198;-1:-1:-1;;33416:198:0:o;31843:744::-;-1:-1:-1;;;;;32058:13:0;;9457:19;:23;32054:526;;32094:72;;-1:-1:-1;;;32094:72:0;;-1:-1:-1;;;;;32094:38:0;;;;;:72;;32133:8;;32143:4;;32149:2;;32153:6;;32161:4;;32094:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32094:72:0;;;;;;;;-1:-1:-1;;32094:72:0;;;;;;;;;;;;:::i;:::-;;;32090:479;;;;:::i;:::-;-1:-1:-1;;;;;;32216:55:0;;-1:-1:-1;;;32216:55:0;32212:154;;32296:50;;-1:-1:-1;;;32296:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:472::-;1253:3;1291:5;1285:12;1318:6;1313:3;1306:19;1343:1;1353:162;1367:6;1364:1;1361:13;1353:162;;;1429:4;1485:13;;;1481:22;;1475:29;1457:11;;;1453:20;;1446:59;1382:12;1353:162;;;1533:6;1530:1;1527:13;1524:87;;;1599:1;1592:4;1583:6;1578:3;1574:16;1570:27;1563:38;1524:87;-1:-1:-1;1665:2:1;1644:15;-1:-1:-1;;1640:29:1;1631:39;;;;1672:4;1627:50;;1211:472;-1:-1:-1;;1211:472:1:o;1688:220::-;1837:2;1826:9;1819:21;1800:4;1857:45;1898:2;1887:9;1883:18;1875:6;1857:45;:::i;1913:180::-;1972:6;2025:2;2013:9;2004:7;2000:23;1996:32;1993:52;;;2041:1;2038;2031:12;1993:52;-1:-1:-1;2064:23:1;;1913:180;-1:-1:-1;1913:180:1:o;2098:127::-;2159:10;2154:3;2150:20;2147:1;2140:31;2190:4;2187:1;2180:15;2214:4;2211:1;2204:15;2230:249;2340:2;2321:13;;-1:-1:-1;;2317:27:1;2305:40;;2375:18;2360:34;;2396:22;;;2357:62;2354:88;;;2422:18;;:::i;:::-;2458:2;2451:22;-1:-1:-1;;2230:249:1:o;2484:183::-;2544:4;2577:18;2569:6;2566:30;2563:56;;;2599:18;;:::i;:::-;-1:-1:-1;2644:1:1;2640:14;2656:4;2636:25;;2484:183::o;2672:724::-;2726:5;2779:3;2772:4;2764:6;2760:17;2756:27;2746:55;;2797:1;2794;2787:12;2746:55;2833:6;2820:20;2859:4;2882:43;2922:2;2882:43;:::i;:::-;2954:2;2948:9;2966:31;2994:2;2986:6;2966:31;:::i;:::-;3032:18;;;3124:1;3120:10;;;;3108:23;;3104:32;;;3066:15;;;;-1:-1:-1;3148:15:1;;;3145:35;;;3176:1;3173;3166:12;3145:35;3212:2;3204:6;3200:15;3224:142;3240:6;3235:3;3232:15;3224:142;;;3306:17;;3294:30;;3344:12;;;;3257;;3224:142;;;-1:-1:-1;3384:6:1;2672:724;-1:-1:-1;;;;;;2672:724:1:o;3401:468::-;3465:5;3499:18;3491:6;3488:30;3485:56;;;3521:18;;:::i;:::-;3570:2;3564:9;3582:69;3639:2;3618:15;;-1:-1:-1;;3614:29:1;3645:4;3610:40;3564:9;3582:69;:::i;:::-;3669:6;3660:15;;3699:6;3691;3684:22;3739:3;3730:6;3725:3;3721:16;3718:25;3715:45;;;3756:1;3753;3746:12;3715:45;3806:6;3801:3;3794:4;3786:6;3782:17;3769:44;3861:1;3854:4;3845:6;3837;3833:19;3829:30;3822:41;;3401:468;;;;;:::o;3874:220::-;3916:5;3969:3;3962:4;3954:6;3950:17;3946:27;3936:55;;3987:1;3984;3977:12;3936:55;4009:79;4084:3;4075:6;4062:20;4055:4;4047:6;4043:17;4009:79;:::i;4099:943::-;4253:6;4261;4269;4277;4285;4338:3;4326:9;4317:7;4313:23;4309:33;4306:53;;;4355:1;4352;4345:12;4306:53;4378:29;4397:9;4378:29;:::i;:::-;4368:39;;4426:38;4460:2;4449:9;4445:18;4426:38;:::i;:::-;4416:48;;4515:2;4504:9;4500:18;4487:32;4538:18;4579:2;4571:6;4568:14;4565:34;;;4595:1;4592;4585:12;4565:34;4618:61;4671:7;4662:6;4651:9;4647:22;4618:61;:::i;:::-;4608:71;;4732:2;4721:9;4717:18;4704:32;4688:48;;4761:2;4751:8;4748:16;4745:36;;;4777:1;4774;4767:12;4745:36;4800:63;4855:7;4844:8;4833:9;4829:24;4800:63;:::i;:::-;4790:73;;4916:3;4905:9;4901:19;4888:33;4872:49;;4946:2;4936:8;4933:16;4930:36;;;4962:1;4959;4952:12;4930:36;;4985:51;5028:7;5017:8;5006:9;5002:24;4985:51;:::i;:::-;4975:61;;;4099:943;;;;;;;;:::o;5047:1208::-;5165:6;5173;5226:2;5214:9;5205:7;5201:23;5197:32;5194:52;;;5242:1;5239;5232:12;5194:52;5282:9;5269:23;5311:18;5352:2;5344:6;5341:14;5338:34;;;5368:1;5365;5358:12;5338:34;5406:6;5395:9;5391:22;5381:32;;5451:7;5444:4;5440:2;5436:13;5432:27;5422:55;;5473:1;5470;5463:12;5422:55;5509:2;5496:16;5531:4;5554:43;5594:2;5554:43;:::i;:::-;5626:2;5620:9;5638:31;5666:2;5658:6;5638:31;:::i;:::-;5704:18;;;5792:1;5788:10;;;;5780:19;;5776:28;;;5738:15;;;;-1:-1:-1;5816:19:1;;;5813:39;;;5848:1;5845;5838:12;5813:39;5872:11;;;;5892:148;5908:6;5903:3;5900:15;5892:148;;;5974:23;5993:3;5974:23;:::i;:::-;5962:36;;5925:12;;;;6018;;;;5892:148;;;6059:6;-1:-1:-1;;6103:18:1;;6090:32;;-1:-1:-1;;6134:16:1;;;6131:36;;;6163:1;6160;6153:12;6131:36;;6186:63;6241:7;6230:8;6219:9;6215:24;6186:63;:::i;:::-;6176:73;;;5047:1208;;;;;:::o;6260:435::-;6313:3;6351:5;6345:12;6378:6;6373:3;6366:19;6404:4;6433:2;6428:3;6424:12;6417:19;;6470:2;6463:5;6459:14;6491:1;6501:169;6515:6;6512:1;6509:13;6501:169;;;6576:13;;6564:26;;6610:12;;;;6645:15;;;;6537:1;6530:9;6501:169;;;-1:-1:-1;6686:3:1;;6260:435;-1:-1:-1;;;;;6260:435:1:o;6700:261::-;6879:2;6868:9;6861:21;6842:4;6899:56;6951:2;6940:9;6936:18;6928:6;6899:56;:::i;7174:347::-;7239:6;7247;7300:2;7288:9;7279:7;7275:23;7271:32;7268:52;;;7316:1;7313;7306:12;7268:52;7339:29;7358:9;7339:29;:::i;:::-;7329:39;;7418:2;7407:9;7403:18;7390:32;7465:5;7458:13;7451:21;7444:5;7441:32;7431:60;;7487:1;7484;7477:12;7431:60;7510:5;7500:15;;;7174:347;;;;;:::o;7526:592::-;7613:6;7621;7629;7682:2;7670:9;7661:7;7657:23;7653:32;7650:52;;;7698:1;7695;7688:12;7650:52;7721:29;7740:9;7721:29;:::i;:::-;7711:39;;7797:2;7786:9;7782:18;7769:32;7759:42;;7852:2;7841:9;7837:18;7824:32;7879:18;7871:6;7868:30;7865:50;;;7911:1;7908;7901:12;7865:50;7934:22;;7987:4;7979:13;;7975:27;-1:-1:-1;7965:55:1;;8016:1;8013;8006:12;7965:55;8039:73;8104:7;8099:2;8086:16;8081:2;8077;8073:11;8039:73;:::i;:::-;8029:83;;;7526:592;;;;;:::o;8123:322::-;8200:6;8208;8216;8269:2;8257:9;8248:7;8244:23;8240:32;8237:52;;;8285:1;8282;8275:12;8237:52;8308:29;8327:9;8308:29;:::i;:::-;8298:39;8384:2;8369:18;;8356:32;;-1:-1:-1;8435:2:1;8420:18;;;8407:32;;8123:322;-1:-1:-1;;;8123:322:1:o;8450:260::-;8518:6;8526;8579:2;8567:9;8558:7;8554:23;8550:32;8547:52;;;8595:1;8592;8585:12;8547:52;8618:29;8637:9;8618:29;:::i;:::-;8608:39;;8666:38;8700:2;8689:9;8685:18;8666:38;:::i;:::-;8656:48;;8450:260;;;;;:::o;8715:606::-;8819:6;8827;8835;8843;8851;8904:3;8892:9;8883:7;8879:23;8875:33;8872:53;;;8921:1;8918;8911:12;8872:53;8944:29;8963:9;8944:29;:::i;:::-;8934:39;;8992:38;9026:2;9015:9;9011:18;8992:38;:::i;:::-;8982:48;;9077:2;9066:9;9062:18;9049:32;9039:42;;9128:2;9117:9;9113:18;9100:32;9090:42;;9183:3;9172:9;9168:19;9155:33;9211:18;9203:6;9200:30;9197:50;;;9243:1;9240;9233:12;9197:50;9266:49;9307:7;9298:6;9287:9;9283:22;9266:49;:::i;9326:186::-;9385:6;9438:2;9426:9;9417:7;9413:23;9409:32;9406:52;;;9454:1;9451;9444:12;9406:52;9477:29;9496:9;9477:29;:::i;9929:380::-;10008:1;10004:12;;;;10051;;;10072:61;;10126:4;10118:6;10114:17;10104:27;;10072:61;10179:2;10171:6;10168:14;10148:18;10145:38;10142:161;;10225:10;10220:3;10216:20;10213:1;10206:31;10260:4;10257:1;10250:15;10288:4;10285:1;10278:15;10142:161;;9929:380;;;:::o;11143:127::-;11204:10;11199:3;11195:20;11192:1;11185:31;11235:4;11232:1;11225:15;11259:4;11256:1;11249:15;11275:127;11336:10;11331:3;11327:20;11324:1;11317:31;11367:4;11364:1;11357:15;11391:4;11388:1;11381:15;11407:135;11446:3;11467:17;;;11464:43;;11487:18;;:::i;:::-;-1:-1:-1;11534:1:1;11523:13;;11407:135::o;11547:356::-;11749:2;11731:21;;;11768:18;;;11761:30;11827:34;11822:2;11807:18;;11800:62;11894:2;11879:18;;11547:356::o;13134:401::-;13336:2;13318:21;;;13375:2;13355:18;;;13348:30;13414:34;13409:2;13394:18;;13387:62;-1:-1:-1;;;13480:2:1;13465:18;;13458:35;13525:3;13510:19;;13134:401::o;13540:406::-;13742:2;13724:21;;;13781:2;13761:18;;;13754:30;13820:34;13815:2;13800:18;;13793:62;-1:-1:-1;;;13886:2:1;13871:18;;13864:40;13936:3;13921:19;;13540:406::o;13951:128::-;13991:3;14022:1;14018:6;14015:1;14012:13;14009:39;;;14028:18;;:::i;:::-;-1:-1:-1;14064:9:1;;13951:128::o;14084:465::-;14341:2;14330:9;14323:21;14304:4;14367:56;14419:2;14408:9;14404:18;14396:6;14367:56;:::i;:::-;14471:9;14463:6;14459:22;14454:2;14443:9;14439:18;14432:50;14499:44;14536:6;14528;14499:44;:::i;:::-;14491:52;14084:465;-1:-1:-1;;;;;14084:465:1:o;16428:827::-;-1:-1:-1;;;;;16825:15:1;;;16807:34;;16877:15;;16872:2;16857:18;;16850:43;16787:3;16924:2;16909:18;;16902:31;;;16750:4;;16956:57;;16993:19;;16985:6;16956:57;:::i;:::-;17061:9;17053:6;17049:22;17044:2;17033:9;17029:18;17022:50;17095:44;17132:6;17124;17095:44;:::i;:::-;17081:58;;17188:9;17180:6;17176:22;17170:3;17159:9;17155:19;17148:51;17216:33;17242:6;17234;17216:33;:::i;:::-;17208:41;16428:827;-1:-1:-1;;;;;;;;16428:827:1:o;17260:249::-;17329:6;17382:2;17370:9;17361:7;17357:23;17353:32;17350:52;;;17398:1;17395;17388:12;17350:52;17430:9;17424:16;17449:30;17473:5;17449:30;:::i;17514:179::-;17549:3;17591:1;17573:16;17570:23;17567:120;;;17637:1;17634;17631;17616:23;-1:-1:-1;17674:1:1;17668:8;17663:3;17659:18;17567:120;17514:179;:::o;17698:671::-;17737:3;17779:4;17761:16;17758:26;17755:39;;;17698:671;:::o;17755:39::-;17821:2;17815:9;-1:-1:-1;;17886:16:1;17882:25;;17879:1;17815:9;17858:50;17937:4;17931:11;17961:16;17996:18;18067:2;18060:4;18052:6;18048:17;18045:25;18040:2;18032:6;18029:14;18026:45;18023:58;;;18074:5;;;;;17698:671;:::o;18023:58::-;18111:6;18105:4;18101:17;18090:28;;18147:3;18141:10;18174:2;18166:6;18163:14;18160:27;;;18180:5;;;;;;17698:671;:::o;18160:27::-;18264:2;18245:16;18239:4;18235:27;18231:36;18224:4;18215:6;18210:3;18206:16;18202:27;18199:69;18196:82;;;18271:5;;;;;;17698:671;:::o;18196:82::-;18287:57;18338:4;18329:6;18321;18317:19;18313:30;18307:4;18287:57;:::i;:::-;-1:-1:-1;18360:3:1;;17698:671;-1:-1:-1;;;;;17698:671:1:o;18795:404::-;18997:2;18979:21;;;19036:2;19016:18;;;19009:30;19075:34;19070:2;19055:18;;19048:62;-1:-1:-1;;;19141:2:1;19126:18;;19119:38;19189:3;19174:19;;18795:404::o;19204:561::-;-1:-1:-1;;;;;19501:15:1;;;19483:34;;19553:15;;19548:2;19533:18;;19526:43;19600:2;19585:18;;19578:34;;;19643:2;19628:18;;19621:34;;;19463:3;19686;19671:19;;19664:32;;;19426:4;;19713:46;;19739:19;;19731:6;19713:46;:::i;:::-;19705:54;19204:561;-1:-1:-1;;;;;;;19204:561:1:o

Swarm Source

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