ETH Price: $3,392.71 (+1.83%)

Token

mirageMembership ()
 

Overview

Max Total Supply

133

Holders

97

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xe1b040ede56a72c4239f06e7a7e3051568bf36bd
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:
mirageMembership

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-05
*/

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



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    /**
     * @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);
            }
        }
    }
}

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;







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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

        return array;
    }
}

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: mirage_membership.sol

/*
 
           M                                                 M
         M   M                                             M   M
        M  M  M                                           M  M  M
       M  M  M  M                                       M  M  M  M
      M  M  M  M  M                                    M  M  M  M  M
     M  M M  M  M  M                                 M  M  M  M  M  M  
     M  M   M  M  M  M                              M  M     M  M  M  M
     M  M     M  M  M  M                           M  M      M  M   M  M
     M  M       M  M  M  M                        M  M       M  M   M  M         
     M  M         M  M  M  M                     M  M        M  M   M  M
     M  M           M  M  M  M                  M  M         M  M   M  M
     M  M             M  M  M  M               M  M          M  M   M  M   M  M  M  M  M  M  M
     M  M               M  M  M  M            M  M        M  M  M   M  M   M  M  M  M  M  M  M  
     M  M                 M  M  M  M         M  M      M  M  M  M   M  M                  M  M
     M  M                   M  M  M  M      M  M    M  M  M  M  M   M  M                     M
     M  M                     M  M  M  M   M  M  M  M  M  M  M  M   M  M
     M  M                       M  M  M  M  M   M  M  M  M   M  M   M  M
     M  M                         M  M  M  M   M  M  M  M    M  M   M  M
     M  M                           M  M  M   M  M  M  M     M  M   M  M
     M  M                             M  M   M  M  M  M      M  M   M  M
M  M  M  M  M  M                         M   M  M  M  M   M  M  M  M  M  M  M    
                                            M  M  M  M 
                                            M  M  M  M 
                                            M  M  M  M 
                                             M  M  M  M                        M  M  M  M  M  M
                                              M  M  M  M                          M  M  M  M 
                                               M  M  M  M                         M  M  M  M 
                                                 M  M  M  M                       M  M  M  M 
                                                   M  M  M  M                     M  M  M  M 
                                                     M  M  M  M                   M  M  M  M 
                                                        M  M  M  M                M  M  M  M 
                                                           M  M  M  M             M  M  M  M 
                                                               M  M  M  M   M  M  M  M  M  M 
                                                                   M  M  M  M  M  M  M  M  M
                                                                                                                                                        
*/

pragma solidity ^0.8.0;




interface mirageContracts {
  function balanceOf(address owner) external view returns (uint256);
}

contract mirageMembership is ERC1155Supply, Ownable  {
    uint _priceIntelligent = 0.05 ether;
    uint _priceSentient = 0.5 ether;
    uint _priceDiscIntelligent = 0.0125 ether;
    uint _priceDiscSentient = 0.25 ether;
    uint256 constant _max_intelligent = 1450;
    uint256 constant _max_sentient = 50;
    uint256 sentient = 0;
    uint256 _airdrop_available = 30;
    uint256 constant intelligentID = 50;
    string intelligentURI = 'https://ipfs.io/ipfs/Qmd68aaryxxngGSXP3FqkWjG4yZG3YGbnK8Sq97ZDnMQsZ';
    string sentientURI = 'https://ipfs.io/ipfs/QmPfjJKP4YUD9ypiYZZH57DXQEvjkjv7HikthCU3sQfWnG';
    uint256 mintActive = 1;
    mirageContracts public cryptoNative;
    mirageContracts public AlejandroAndTaylor;
    mirageContracts public earlyWorks;

    constructor() ERC1155('https://ipfs.io/ipfs') {
        
        cryptoNative = mirageContracts(0x89568Fc8d04B3f833209144b77F39b71078e3CB0);
        AlejandroAndTaylor = mirageContracts(0x63400da86a6b42dac41075667cF871a5Ef93802F);
        earlyWorks = mirageContracts(0x3Cf6e4ff99D616d44Be53E90F74eAE5D150Cb726);
    }
    
    function updateURI(string memory _intelligentURI, string memory _sentientURI) public onlyOwner {
        intelligentURI = _intelligentURI;
        sentientURI = _sentientURI;
    }
    
    function updateAirdrop(uint256 airdropAvailable) public onlyOwner {
        require((totalSupply(intelligentID) + sentient) < (_max_intelligent + _max_sentient), "None available to airdrop");
        _airdrop_available = airdropAvailable;
    }
    
    function endMint() public onlyOwner {
        mintActive = 2;
    }
    
    function startMint() public onlyOwner {
        require(mintActive != 2, "Mint has been locked");
        mintActive = 0;
    }
    
    function updatePriceIntelligent(uint256 newMainPrice, uint256 newDiscPrice) public onlyOwner {
        _priceIntelligent = newMainPrice;
        _priceDiscIntelligent = newDiscPrice;
    }
    
    function updatePriceSentient(uint256 newMainPrice, uint256 newDiscPrice) public onlyOwner {
        _priceSentient = newMainPrice;
        _priceDiscSentient = newDiscPrice;
    }
    
    function mintToSender(uint numberOfTokens, uint tokenID) internal {
        require(totalSupply(intelligentID) + sentient + (numberOfTokens) <= _max_intelligent + _max_sentient, "Minting would exceed max supply");
        _mint(msg.sender, tokenID, numberOfTokens, "");
        }
    
    function mintIntelligent(uint numberOfTokens) internal virtual {
        _mint(msg.sender, intelligentID, numberOfTokens, "");
    }
    
    function mintToAddress(uint numberOfTokens, address address_to_mint, uint tokenID) internal {
        require(totalSupply(intelligentID) + sentient + numberOfTokens <= _max_intelligent + _max_sentient, "Minting would exceed max supply");
        _mint(address_to_mint, tokenID, numberOfTokens, "");
        }

    function purchaseIntelligent(uint numberOfTokens) public payable {
        require(mintActive == 0, "Mint has not opened yet or has been locked");
        require(_airdrop_available == 0, "Airdrop has not ended");
        require(totalSupply(intelligentID) + numberOfTokens <= _max_intelligent, "Purchase would exceed max supply of tokens");
        require(numberOfTokens <= 2, "Can only purchase a maximum of 2 tokens at a time");
        if (cryptoNative.balanceOf(msg.sender) > 0 || AlejandroAndTaylor.balanceOf(msg.sender) > 0 || earlyWorks.balanceOf(msg.sender) > 0) {
            require((_priceDiscIntelligent * numberOfTokens) <= msg.value, "Ether value sent is not correct");
        } else {
            require(_priceIntelligent * numberOfTokens <= msg.value, "Ether value sent is not correct");
        }
        mintIntelligent(numberOfTokens);
    }
    
    function purchaseSentient() public payable {
        require(mintActive == 0, "Mint has not opened yet or has been locked");
        require(_airdrop_available == 0, "Airdrop has not ended");
        require(sentient < _max_sentient, "Purchase would exceed max supply of tokens");
        if (cryptoNative.balanceOf(msg.sender) > 0 || AlejandroAndTaylor.balanceOf(msg.sender) > 0 || earlyWorks.balanceOf(msg.sender) > 0) {
            require(_priceDiscSentient <= msg.value, "Ether value sent is not correct");
        } else {
            require(_priceSentient <= msg.value, "Ether value sent is not correct");
        }
        mintSentient(msg.sender);
    }
    
    function mintSentient(address address_to_mint) internal virtual {
        uint tokenID = sentient;
        _mint(address_to_mint, tokenID, 1, '');
        sentient = sentient +  1; 
    }
    
    function airdrop(address addresstm, uint numberOfTokens, uint one_intelligent_two_sentient) public onlyOwner {
        require(_airdrop_available > 0, "No airdrop tokens available");
        require(numberOfTokens <= _airdrop_available);
        _airdrop_available -= numberOfTokens;
        if (one_intelligent_two_sentient == 1) {
            mintToAddress(numberOfTokens, addresstm, intelligentID);
        } else if (one_intelligent_two_sentient == 2) {
            mintSentient(addresstm);
        }
    }

    function uri(uint tokenID) public view override returns(string memory) {
        if (tokenID == intelligentID) {
            return intelligentURI;
        } else if (tokenID < 50) {
            return sentientURI;
        } else {
            return '';
        }
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"AlejandroAndTaylor","outputs":[{"internalType":"contract mirageContracts","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addresstm","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"one_intelligent_two_sentient","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cryptoNative","outputs":[{"internalType":"contract mirageContracts","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyWorks","outputs":[{"internalType":"contract mirageContracts","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchaseIntelligent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"purchaseSentient","outputs":[],"stateMutability":"payable","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":[],"name":"startMint","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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"airdropAvailable","type":"uint256"}],"name":"updateAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMainPrice","type":"uint256"},{"internalType":"uint256","name":"newDiscPrice","type":"uint256"}],"name":"updatePriceIntelligent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMainPrice","type":"uint256"},{"internalType":"uint256","name":"newDiscPrice","type":"uint256"}],"name":"updatePriceSentient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_intelligentURI","type":"string"},{"internalType":"string","name":"_sentientURI","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

66b1a2bc2ec500006005556706f05b59d3b20000600655662c68af0bb140006007556703782dace9d900006008556000600955601e600a55610100604052604360808181529062002c8460a03980516200006291600b91602090910190620001d6565b5060405180608001604052806043815260200162002c416043913980516200009391600c91602090910190620001d6565b506001600d55348015620000a657600080fd5b5060408051808201909152601481527f68747470733a2f2f697066732e696f2f697066730000000000000000000000006020820152620000e68162000167565b50620000fb620000f562000180565b62000184565b600e80546001600160a01b03199081167389568fc8d04b3f833209144b77f39b71078e3cb017909155600f805482167363400da86a6b42dac41075667cf871a5ef93802f17905560108054909116733cf6e4ff99d616d44be53e90f74eae5d150cb726179055620002b9565b80516200017c906002906020840190620001d6565b5050565b3390565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001e4906200027c565b90600052602060002090601f01602090048101928262000208576000855562000253565b82601f106200022357805160ff191683800117855562000253565b8280016001018555821562000253579182015b828111156200025357825182559160200191906001019062000236565b506200026192915062000265565b5090565b5b8082111562000261576000815560010162000266565b6002810460018216806200029157607f821691505b60208210811415620002b357634e487b7160e01b600052602260045260246000fd5b50919050565b61297880620002c96000396000f3fe6080604052600436106101805760003560e01c8063715018a6116100d1578063c2ea31441161008a578063f242432a11610064578063f242432a1461041f578063f25b477b1461043f578063f2fde38b14610454578063f8cfe0b11461047457610180565b8063c2ea3144146103d7578063e1bc2967146103df578063e985e9c5146103ff57610180565b8063715018a61461033a5780637c62290f1461034f5780638c8f07f51461036f5780638da5cb5b14610382578063a22cb46514610397578063bd85b039146103b757610180565b80631789e2d81161013e5780633ccfd60b116101185780633ccfd60b146102c35780634e1273f4146102d85780634f558e791461030557806361525bb11461032557610180565b80631789e2d81461026e5780632be095611461028e5780632eb2c2d6146102a357610180565b8062fdd58e14610185578063017043a5146101bb57806301ffc9a7146101d257806308229860146101ff5780630e89341c1461021f5780630ef9bd181461024c575b600080fd5b34801561019157600080fd5b506101a56101a0366004611df3565b610494565b6040516101b2919061274c565b60405180910390f35b3480156101c757600080fd5b506101d06104eb565b005b3480156101de57600080fd5b506101f26101ed366004611f0c565b610531565b6040516101b29190612169565b34801561020b57600080fd5b506101d061021a366004611fcb565b610579565b34801561022b57600080fd5b5061023f61023a366004611f9b565b6105c3565b6040516101b29190612174565b34801561025857600080fd5b5061026161068b565b6040516101b29190612071565b34801561027a57600080fd5b506101d0610289366004611f44565b61069a565b34801561029a57600080fd5b506101d0610705565b3480156102af57600080fd5b506101d06102be366004611cb0565b61076e565b3480156102cf57600080fd5b506101d06107cc565b3480156102e457600080fd5b506102f86102f3366004611e4e565b61083e565b6040516101b29190612128565b34801561031157600080fd5b506101f2610320366004611f9b565b61095e565b34801561033157600080fd5b50610261610971565b34801561034657600080fd5b506101d0610980565b34801561035b57600080fd5b506101d061036a366004611fcb565b6109cb565b6101d061037d366004611f9b565b610a15565b34801561038e57600080fd5b50610261610cb0565b3480156103a357600080fd5b506101d06103b2366004611db9565b610cc0565b3480156103c357600080fd5b506101a56103d2366004611f9b565b610d8e565b6101d0610da0565b3480156103eb57600080fd5b506101d06103fa366004611e1c565b610fed565b34801561040b57600080fd5b506101f261041a366004611c7e565b6110a0565b34801561042b57600080fd5b506101d061043a366004611d56565b6110ce565b34801561044b57600080fd5b50610261611125565b34801561046057600080fd5b506101d061046f366004611c5d565b611134565b34801561048057600080fd5b506101d061048f366004611f9b565b6111a2565b60006001600160a01b0383166104c55760405162461bcd60e51b81526004016104bc90612223565b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b6104f3611227565b6001600160a01b0316610504610cb0565b6001600160a01b03161461052a5760405162461bcd60e51b81526004016104bc90612568565b6002600d55565b60006001600160e01b03198216636cdb3d1360e11b148061056257506001600160e01b031982166303a24d0760e21b145b8061057157506105718261122b565b90505b919050565b610581611227565b6001600160a01b0316610592610cb0565b6001600160a01b0316146105b85760405162461bcd60e51b81526004016104bc90612568565b600691909155600855565b6060603282141561066057600b80546105db906127ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610607906127ff565b80156106545780601f1061062957610100808354040283529160200191610654565b820191906000526020600020905b81548152906001019060200180831161063757829003601f168201915b50505050509050610574565b603282101561067657600c80546105db906127ff565b50604080516020810190915260008152610574565b600e546001600160a01b031681565b6106a2611227565b6001600160a01b03166106b3610cb0565b6001600160a01b0316146106d95760405162461bcd60e51b81526004016104bc90612568565b81516106ec90600b906020850190611ad6565b50805161070090600c906020840190611ad6565b505050565b61070d611227565b6001600160a01b031661071e610cb0565b6001600160a01b0316146107445760405162461bcd60e51b81526004016104bc90612568565b600d54600214156107675760405162461bcd60e51b81526004016104bc9061259d565b6000600d55565b610776611227565b6001600160a01b0316856001600160a01b0316148061079c575061079c8561041a611227565b6107b85760405162461bcd60e51b81526004016104bc906123b0565b6107c58585858585611244565b5050505050565b6107d4611227565b6001600160a01b03166107e5610cb0565b6001600160a01b03161461080b5760405162461bcd60e51b81526004016104bc90612568565b6040514790339082156108fc029083906000818181858888f1935050505015801561083a573d6000803e3d6000fd5b5050565b606081518351146108615760405162461bcd60e51b81526004016104bc90612614565b6000835167ffffffffffffffff81111561088b57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156108b4578160200160208202803683370190505b50905060005b84518110156109565761091b8582815181106108e657634e487b7160e01b600052603260045260246000fd5b602002602001015185838151811061090e57634e487b7160e01b600052603260045260246000fd5b6020026020010151610494565b82828151811061093b57634e487b7160e01b600052603260045260246000fd5b602090810291909101015261094f8161283a565b90506108ba565b509392505050565b60008061096a83610d8e565b1192915050565b6010546001600160a01b031681565b610988611227565b6001600160a01b0316610999610cb0565b6001600160a01b0316146109bf5760405162461bcd60e51b81526004016104bc90612568565b6109c96000611415565b565b6109d3611227565b6001600160a01b03166109e4610cb0565b6001600160a01b031614610a0a5760405162461bcd60e51b81526004016104bc90612568565b600591909155600755565b600d5415610a355760405162461bcd60e51b81526004016104bc90612402565b600a5415610a555760405162461bcd60e51b81526004016104bc906126e6565b6105aa81610a636032610d8e565b610a6d91906127b1565b1115610a8b5760405162461bcd60e51b81526004016104bc90612483565b6002811115610aac5760405162461bcd60e51b81526004016104bc906124cd565b600e546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610add903390600401612071565b60206040518083038186803b158015610af557600080fd5b505afa158015610b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2d9190611fb3565b1180610bb75750600f546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610b65903390600401612071565b60206040518083038186803b158015610b7d57600080fd5b505afa158015610b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb59190611fb3565b115b80610c4057506010546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610bee903390600401612071565b60206040518083038186803b158015610c0657600080fd5b505afa158015610c1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3e9190611fb3565b115b15610c77573481600754610c5491906127c9565b1115610c725760405162461bcd60e51b81526004016104bc90612334565b610ca4565b3481600554610c8691906127c9565b1115610ca45760405162461bcd60e51b81526004016104bc90612334565b610cad81611467565b50565b6004546001600160a01b03165b90565b816001600160a01b0316610cd2611227565b6001600160a01b03161415610cf95760405162461bcd60e51b81526004016104bc906125cb565b8060016000610d06611227565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610d4a611227565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d829190612169565b60405180910390a35050565b60009081526003602052604090205490565b600d5415610dc05760405162461bcd60e51b81526004016104bc90612402565b600a5415610de05760405162461bcd60e51b81526004016104bc906126e6565b603260095410610e025760405162461bcd60e51b81526004016104bc90612483565b600e546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610e33903390600401612071565b60206040518083038186803b158015610e4b57600080fd5b505afa158015610e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e839190611fb3565b1180610f0d5750600f546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610ebb903390600401612071565b60206040518083038186803b158015610ed357600080fd5b505afa158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0b9190611fb3565b115b80610f9657506010546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610f44903390600401612071565b60206040518083038186803b158015610f5c57600080fd5b505afa158015610f70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f949190611fb3565b115b15610fc257346008541115610fbd5760405162461bcd60e51b81526004016104bc90612334565b610fe4565b346006541115610fe45760405162461bcd60e51b81526004016104bc90612334565b6109c933611483565b610ff5611227565b6001600160a01b0316611006610cb0565b6001600160a01b03161461102c5760405162461bcd60e51b81526004016104bc90612568565b6000600a541161104e5760405162461bcd60e51b81526004016104bc90612715565b600a5482111561105d57600080fd5b81600a600082825461106f91906127e8565b9091555050600181141561108e57611089828460326114bb565b610700565b80600214156107005761070083611483565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6110d6611227565b6001600160a01b0316856001600160a01b031614806110fc57506110fc8561041a611227565b6111185760405162461bcd60e51b81526004016104bc906122b4565b6107c58585858585611523565b600f546001600160a01b031681565b61113c611227565b6001600160a01b031661114d610cb0565b6001600160a01b0316146111735760405162461bcd60e51b81526004016104bc90612568565b6001600160a01b0381166111995760405162461bcd60e51b81526004016104bc9061226e565b610cad81611415565b6111aa611227565b6001600160a01b03166111bb610cb0565b6001600160a01b0316146111e15760405162461bcd60e51b81526004016104bc90612568565b6111ee60326105aa6127b1565b6009546111fb6032610d8e565b61120591906127b1565b106112225760405162461bcd60e51b81526004016104bc906122fd565b600a55565b3390565b6001600160e01b031981166301ffc9a760e01b14919050565b81518351146112655760405162461bcd60e51b81526004016104bc9061265d565b6001600160a01b03841661128b5760405162461bcd60e51b81526004016104bc9061236b565b6000611295611227565b90506112a5818787878787611666565b60005b84518110156113a75760008582815181106112d357634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008583815181106112ff57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561134f5760405162461bcd60e51b81526004016104bc9061251e565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061138c9084906127b1565b92505081905550505050806113a09061283a565b90506112a8565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516113f792919061213b565b60405180910390a461140d8187878787876117b8565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610cad33603283604051806020016040528060008152506118c6565b600060095490506114a682826001604051806020016040528060008152506118c6565b6009546114b49060016127b1565b6009555050565b6114c860326105aa6127b1565b836009546114d66032610d8e565b6114e091906127b1565b6114ea91906127b1565b11156115085760405162461bcd60e51b81526004016104bc9061244c565b610700828285604051806020016040528060008152506118c6565b6001600160a01b0384166115495760405162461bcd60e51b81526004016104bc9061236b565b6000611553611227565b9050611573818787611564886119a6565b61156d886119a6565b87611666565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156115b45760405162461bcd60e51b81526004016104bc9061251e565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906115f19084906127b1565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051611647929190612755565b60405180910390a461165d8288888888886119ff565b50505050505050565b61167486868686868661140d565b6001600160a01b0385166117175760005b8351811015611715578281815181106116ae57634e487b7160e01b600052603260045260246000fd5b6020026020010151600360008684815181106116da57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060008282546116ff91906127b1565b9091555061170e90508161283a565b9050611685565b505b6001600160a01b03841661140d5760005b835181101561165d5782818151811061175157634e487b7160e01b600052603260045260246000fd5b60200260200101516003600086848151811061177d57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060008282546117a291906127e8565b909155506117b190508161283a565b9050611728565b6117ca846001600160a01b0316611ad0565b1561140d5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906118039089908990889088908890600401612085565b602060405180830381600087803b15801561181d57600080fd5b505af192505050801561184d575060408051601f3d908101601f1916820190925261184a91810190611f28565b60015b61189657611859612887565b80611864575061187e565b8060405162461bcd60e51b81526004016104bc9190612174565b60405162461bcd60e51b81526004016104bc90612187565b6001600160e01b0319811663bc197c8160e01b1461165d5760405162461bcd60e51b81526004016104bc906121db565b6001600160a01b0384166118ec5760405162461bcd60e51b81526004016104bc906126a5565b60006118f6611227565b905061190881600087611564886119a6565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906119389084906127b1565b92505081905550846001600160a01b031660006001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161198f929190612755565b60405180910390a46107c5816000878787876119ff565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106119ee57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b611a11846001600160a01b0316611ad0565b1561140d5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611a4a90899089908890889088906004016120e3565b602060405180830381600087803b158015611a6457600080fd5b505af1925050508015611a94575060408051601f3d908101601f19168201909252611a9191810190611f28565b60015b611aa057611859612887565b6001600160e01b0319811663f23a6e6160e01b1461165d5760405162461bcd60e51b81526004016104bc906121db565b3b151590565b828054611ae2906127ff565b90600052602060002090601f016020900481019282611b045760008555611b4a565b82601f10611b1d57805160ff1916838001178555611b4a565b82800160010185558215611b4a579182015b82811115611b4a578251825591602001919060010190611b2f565b50611b56929150611b5a565b5090565b5b80821115611b565760008155600101611b5b565b80356001600160a01b038116811461057457600080fd5b600082601f830112611b96578081fd5b81356020611bab611ba68361278d565b612763565b8281528181019085830183850287018401881015611bc7578586fd5b855b85811015611be557813584529284019290840190600101611bc9565b5090979650505050505050565b600082601f830112611c02578081fd5b813567ffffffffffffffff811115611c1c57611c1c61286b565b611c2f601f8201601f1916602001612763565b818152846020838601011115611c43578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611c6e578081fd5b611c7782611b6f565b9392505050565b60008060408385031215611c90578081fd5b611c9983611b6f565b9150611ca760208401611b6f565b90509250929050565b600080600080600060a08688031215611cc7578081fd5b611cd086611b6f565b9450611cde60208701611b6f565b9350604086013567ffffffffffffffff80821115611cfa578283fd5b611d0689838a01611b86565b94506060880135915080821115611d1b578283fd5b611d2789838a01611b86565b93506080880135915080821115611d3c578283fd5b50611d4988828901611bf2565b9150509295509295909350565b600080600080600060a08688031215611d6d578081fd5b611d7686611b6f565b9450611d8460208701611b6f565b93506040860135925060608601359150608086013567ffffffffffffffff811115611dad578182fd5b611d4988828901611bf2565b60008060408385031215611dcb578182fd5b611dd483611b6f565b915060208301358015158114611de8578182fd5b809150509250929050565b60008060408385031215611e05578182fd5b611e0e83611b6f565b946020939093013593505050565b600080600060608486031215611e30578283fd5b611e3984611b6f565b95602085013595506040909401359392505050565b60008060408385031215611e60578182fd5b823567ffffffffffffffff80821115611e77578384fd5b818501915085601f830112611e8a578384fd5b81356020611e9a611ba68361278d565b82815281810190858301838502870184018b1015611eb6578889fd5b8896505b84871015611edf57611ecb81611b6f565b835260019690960195918301918301611eba565b5096505086013592505080821115611ef5578283fd5b50611f0285828601611b86565b9150509250929050565b600060208284031215611f1d578081fd5b8135611c778161292c565b600060208284031215611f39578081fd5b8151611c778161292c565b60008060408385031215611f56578182fd5b823567ffffffffffffffff80821115611f6d578384fd5b611f7986838701611bf2565b93506020850135915080821115611f8e578283fd5b50611f0285828601611bf2565b600060208284031215611fac578081fd5b5035919050565b600060208284031215611fc4578081fd5b5051919050565b60008060408385031215611fdd578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b8381101561201b57815187529582019590820190600101611fff565b509495945050505050565b60008151808452815b8181101561204b5760208185018101518683018201520161202f565b8181111561205c5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a0604082018190526000906120b190830186611fec565b82810360608401526120c38186611fec565b905082810360808401526120d78185612026565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061211d90830184612026565b979650505050505050565b600060208252611c776020830184611fec565b60006040825261214e6040830185611fec565b82810360208401526121608185611fec565b95945050505050565b901515815260200190565b600060208252611c776020830184612026565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526019908201527f4e6f6e6520617661696c61626c6520746f2061697264726f7000000000000000604082015260600190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b6020808252602a908201527f4d696e7420686173206e6f74206f70656e656420796574206f7220686173206260408201526919595b881b1bd8dad95960b21b606082015260800190565b6020808252601f908201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900604082015260600190565b6020808252602a908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015269206f6620746f6b656e7360b01b606082015260800190565b60208082526031908201527f43616e206f6e6c792070757263686173652061206d6178696d756d206f66203260408201527020746f6b656e7320617420612074696d6560781b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260149082015273135a5b9d081a185cc81899595b881b1bd8dad95960621b604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b602080825260159082015274105a5c991c9bdc081a185cc81b9bdd08195b991959605a1b604082015260600190565b6020808252601b908201527f4e6f2061697264726f7020746f6b656e7320617661696c61626c650000000000604082015260600190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156127855761278561286b565b604052919050565b600067ffffffffffffffff8211156127a7576127a761286b565b5060209081020190565b600082198211156127c4576127c4612855565b500190565b60008160001904831182151516156127e3576127e3612855565b500290565b6000828210156127fa576127fa612855565b500390565b60028104600182168061281357607f821691505b6020821081141561283457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561284e5761284e612855565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d101561289757610cbd565b600481823e6308c379a06128ab8251612881565b146128b557610cbd565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156128e55750505050610cbd565b828401925082519150808211156128ff5750505050610cbd565b503d8301602082840101111561291757505050610cbd565b601f01601f1916810160200160405291505090565b6001600160e01b031981168114610cad57600080fdfea2646970667358221220308dc264d25db73c537a84b403dcd70e9f8e344d36c67d4b5386ac2474b54cbc64736f6c6343000800003368747470733a2f2f697066732e696f2f697066732f516d50666a4a4b503459554439797069595a5a48353744585145766a6b6a763748696b7468435533735166576e4768747470733a2f2f697066732e696f2f697066732f516d6436386161727978786e67475358503346716b576a4734795a47335947626e4b38537139375a446e4d51735a

Deployed Bytecode

0x6080604052600436106101805760003560e01c8063715018a6116100d1578063c2ea31441161008a578063f242432a11610064578063f242432a1461041f578063f25b477b1461043f578063f2fde38b14610454578063f8cfe0b11461047457610180565b8063c2ea3144146103d7578063e1bc2967146103df578063e985e9c5146103ff57610180565b8063715018a61461033a5780637c62290f1461034f5780638c8f07f51461036f5780638da5cb5b14610382578063a22cb46514610397578063bd85b039146103b757610180565b80631789e2d81161013e5780633ccfd60b116101185780633ccfd60b146102c35780634e1273f4146102d85780634f558e791461030557806361525bb11461032557610180565b80631789e2d81461026e5780632be095611461028e5780632eb2c2d6146102a357610180565b8062fdd58e14610185578063017043a5146101bb57806301ffc9a7146101d257806308229860146101ff5780630e89341c1461021f5780630ef9bd181461024c575b600080fd5b34801561019157600080fd5b506101a56101a0366004611df3565b610494565b6040516101b2919061274c565b60405180910390f35b3480156101c757600080fd5b506101d06104eb565b005b3480156101de57600080fd5b506101f26101ed366004611f0c565b610531565b6040516101b29190612169565b34801561020b57600080fd5b506101d061021a366004611fcb565b610579565b34801561022b57600080fd5b5061023f61023a366004611f9b565b6105c3565b6040516101b29190612174565b34801561025857600080fd5b5061026161068b565b6040516101b29190612071565b34801561027a57600080fd5b506101d0610289366004611f44565b61069a565b34801561029a57600080fd5b506101d0610705565b3480156102af57600080fd5b506101d06102be366004611cb0565b61076e565b3480156102cf57600080fd5b506101d06107cc565b3480156102e457600080fd5b506102f86102f3366004611e4e565b61083e565b6040516101b29190612128565b34801561031157600080fd5b506101f2610320366004611f9b565b61095e565b34801561033157600080fd5b50610261610971565b34801561034657600080fd5b506101d0610980565b34801561035b57600080fd5b506101d061036a366004611fcb565b6109cb565b6101d061037d366004611f9b565b610a15565b34801561038e57600080fd5b50610261610cb0565b3480156103a357600080fd5b506101d06103b2366004611db9565b610cc0565b3480156103c357600080fd5b506101a56103d2366004611f9b565b610d8e565b6101d0610da0565b3480156103eb57600080fd5b506101d06103fa366004611e1c565b610fed565b34801561040b57600080fd5b506101f261041a366004611c7e565b6110a0565b34801561042b57600080fd5b506101d061043a366004611d56565b6110ce565b34801561044b57600080fd5b50610261611125565b34801561046057600080fd5b506101d061046f366004611c5d565b611134565b34801561048057600080fd5b506101d061048f366004611f9b565b6111a2565b60006001600160a01b0383166104c55760405162461bcd60e51b81526004016104bc90612223565b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b6104f3611227565b6001600160a01b0316610504610cb0565b6001600160a01b03161461052a5760405162461bcd60e51b81526004016104bc90612568565b6002600d55565b60006001600160e01b03198216636cdb3d1360e11b148061056257506001600160e01b031982166303a24d0760e21b145b8061057157506105718261122b565b90505b919050565b610581611227565b6001600160a01b0316610592610cb0565b6001600160a01b0316146105b85760405162461bcd60e51b81526004016104bc90612568565b600691909155600855565b6060603282141561066057600b80546105db906127ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610607906127ff565b80156106545780601f1061062957610100808354040283529160200191610654565b820191906000526020600020905b81548152906001019060200180831161063757829003601f168201915b50505050509050610574565b603282101561067657600c80546105db906127ff565b50604080516020810190915260008152610574565b600e546001600160a01b031681565b6106a2611227565b6001600160a01b03166106b3610cb0565b6001600160a01b0316146106d95760405162461bcd60e51b81526004016104bc90612568565b81516106ec90600b906020850190611ad6565b50805161070090600c906020840190611ad6565b505050565b61070d611227565b6001600160a01b031661071e610cb0565b6001600160a01b0316146107445760405162461bcd60e51b81526004016104bc90612568565b600d54600214156107675760405162461bcd60e51b81526004016104bc9061259d565b6000600d55565b610776611227565b6001600160a01b0316856001600160a01b0316148061079c575061079c8561041a611227565b6107b85760405162461bcd60e51b81526004016104bc906123b0565b6107c58585858585611244565b5050505050565b6107d4611227565b6001600160a01b03166107e5610cb0565b6001600160a01b03161461080b5760405162461bcd60e51b81526004016104bc90612568565b6040514790339082156108fc029083906000818181858888f1935050505015801561083a573d6000803e3d6000fd5b5050565b606081518351146108615760405162461bcd60e51b81526004016104bc90612614565b6000835167ffffffffffffffff81111561088b57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156108b4578160200160208202803683370190505b50905060005b84518110156109565761091b8582815181106108e657634e487b7160e01b600052603260045260246000fd5b602002602001015185838151811061090e57634e487b7160e01b600052603260045260246000fd5b6020026020010151610494565b82828151811061093b57634e487b7160e01b600052603260045260246000fd5b602090810291909101015261094f8161283a565b90506108ba565b509392505050565b60008061096a83610d8e565b1192915050565b6010546001600160a01b031681565b610988611227565b6001600160a01b0316610999610cb0565b6001600160a01b0316146109bf5760405162461bcd60e51b81526004016104bc90612568565b6109c96000611415565b565b6109d3611227565b6001600160a01b03166109e4610cb0565b6001600160a01b031614610a0a5760405162461bcd60e51b81526004016104bc90612568565b600591909155600755565b600d5415610a355760405162461bcd60e51b81526004016104bc90612402565b600a5415610a555760405162461bcd60e51b81526004016104bc906126e6565b6105aa81610a636032610d8e565b610a6d91906127b1565b1115610a8b5760405162461bcd60e51b81526004016104bc90612483565b6002811115610aac5760405162461bcd60e51b81526004016104bc906124cd565b600e546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610add903390600401612071565b60206040518083038186803b158015610af557600080fd5b505afa158015610b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2d9190611fb3565b1180610bb75750600f546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610b65903390600401612071565b60206040518083038186803b158015610b7d57600080fd5b505afa158015610b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb59190611fb3565b115b80610c4057506010546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610bee903390600401612071565b60206040518083038186803b158015610c0657600080fd5b505afa158015610c1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3e9190611fb3565b115b15610c77573481600754610c5491906127c9565b1115610c725760405162461bcd60e51b81526004016104bc90612334565b610ca4565b3481600554610c8691906127c9565b1115610ca45760405162461bcd60e51b81526004016104bc90612334565b610cad81611467565b50565b6004546001600160a01b03165b90565b816001600160a01b0316610cd2611227565b6001600160a01b03161415610cf95760405162461bcd60e51b81526004016104bc906125cb565b8060016000610d06611227565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610d4a611227565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d829190612169565b60405180910390a35050565b60009081526003602052604090205490565b600d5415610dc05760405162461bcd60e51b81526004016104bc90612402565b600a5415610de05760405162461bcd60e51b81526004016104bc906126e6565b603260095410610e025760405162461bcd60e51b81526004016104bc90612483565b600e546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610e33903390600401612071565b60206040518083038186803b158015610e4b57600080fd5b505afa158015610e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e839190611fb3565b1180610f0d5750600f546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610ebb903390600401612071565b60206040518083038186803b158015610ed357600080fd5b505afa158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0b9190611fb3565b115b80610f9657506010546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610f44903390600401612071565b60206040518083038186803b158015610f5c57600080fd5b505afa158015610f70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f949190611fb3565b115b15610fc257346008541115610fbd5760405162461bcd60e51b81526004016104bc90612334565b610fe4565b346006541115610fe45760405162461bcd60e51b81526004016104bc90612334565b6109c933611483565b610ff5611227565b6001600160a01b0316611006610cb0565b6001600160a01b03161461102c5760405162461bcd60e51b81526004016104bc90612568565b6000600a541161104e5760405162461bcd60e51b81526004016104bc90612715565b600a5482111561105d57600080fd5b81600a600082825461106f91906127e8565b9091555050600181141561108e57611089828460326114bb565b610700565b80600214156107005761070083611483565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6110d6611227565b6001600160a01b0316856001600160a01b031614806110fc57506110fc8561041a611227565b6111185760405162461bcd60e51b81526004016104bc906122b4565b6107c58585858585611523565b600f546001600160a01b031681565b61113c611227565b6001600160a01b031661114d610cb0565b6001600160a01b0316146111735760405162461bcd60e51b81526004016104bc90612568565b6001600160a01b0381166111995760405162461bcd60e51b81526004016104bc9061226e565b610cad81611415565b6111aa611227565b6001600160a01b03166111bb610cb0565b6001600160a01b0316146111e15760405162461bcd60e51b81526004016104bc90612568565b6111ee60326105aa6127b1565b6009546111fb6032610d8e565b61120591906127b1565b106112225760405162461bcd60e51b81526004016104bc906122fd565b600a55565b3390565b6001600160e01b031981166301ffc9a760e01b14919050565b81518351146112655760405162461bcd60e51b81526004016104bc9061265d565b6001600160a01b03841661128b5760405162461bcd60e51b81526004016104bc9061236b565b6000611295611227565b90506112a5818787878787611666565b60005b84518110156113a75760008582815181106112d357634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008583815181106112ff57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561134f5760405162461bcd60e51b81526004016104bc9061251e565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061138c9084906127b1565b92505081905550505050806113a09061283a565b90506112a8565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516113f792919061213b565b60405180910390a461140d8187878787876117b8565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610cad33603283604051806020016040528060008152506118c6565b600060095490506114a682826001604051806020016040528060008152506118c6565b6009546114b49060016127b1565b6009555050565b6114c860326105aa6127b1565b836009546114d66032610d8e565b6114e091906127b1565b6114ea91906127b1565b11156115085760405162461bcd60e51b81526004016104bc9061244c565b610700828285604051806020016040528060008152506118c6565b6001600160a01b0384166115495760405162461bcd60e51b81526004016104bc9061236b565b6000611553611227565b9050611573818787611564886119a6565b61156d886119a6565b87611666565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156115b45760405162461bcd60e51b81526004016104bc9061251e565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906115f19084906127b1565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051611647929190612755565b60405180910390a461165d8288888888886119ff565b50505050505050565b61167486868686868661140d565b6001600160a01b0385166117175760005b8351811015611715578281815181106116ae57634e487b7160e01b600052603260045260246000fd5b6020026020010151600360008684815181106116da57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060008282546116ff91906127b1565b9091555061170e90508161283a565b9050611685565b505b6001600160a01b03841661140d5760005b835181101561165d5782818151811061175157634e487b7160e01b600052603260045260246000fd5b60200260200101516003600086848151811061177d57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060008282546117a291906127e8565b909155506117b190508161283a565b9050611728565b6117ca846001600160a01b0316611ad0565b1561140d5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906118039089908990889088908890600401612085565b602060405180830381600087803b15801561181d57600080fd5b505af192505050801561184d575060408051601f3d908101601f1916820190925261184a91810190611f28565b60015b61189657611859612887565b80611864575061187e565b8060405162461bcd60e51b81526004016104bc9190612174565b60405162461bcd60e51b81526004016104bc90612187565b6001600160e01b0319811663bc197c8160e01b1461165d5760405162461bcd60e51b81526004016104bc906121db565b6001600160a01b0384166118ec5760405162461bcd60e51b81526004016104bc906126a5565b60006118f6611227565b905061190881600087611564886119a6565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906119389084906127b1565b92505081905550846001600160a01b031660006001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161198f929190612755565b60405180910390a46107c5816000878787876119ff565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106119ee57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b611a11846001600160a01b0316611ad0565b1561140d5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611a4a90899089908890889088906004016120e3565b602060405180830381600087803b158015611a6457600080fd5b505af1925050508015611a94575060408051601f3d908101601f19168201909252611a9191810190611f28565b60015b611aa057611859612887565b6001600160e01b0319811663f23a6e6160e01b1461165d5760405162461bcd60e51b81526004016104bc906121db565b3b151590565b828054611ae2906127ff565b90600052602060002090601f016020900481019282611b045760008555611b4a565b82601f10611b1d57805160ff1916838001178555611b4a565b82800160010185558215611b4a579182015b82811115611b4a578251825591602001919060010190611b2f565b50611b56929150611b5a565b5090565b5b80821115611b565760008155600101611b5b565b80356001600160a01b038116811461057457600080fd5b600082601f830112611b96578081fd5b81356020611bab611ba68361278d565b612763565b8281528181019085830183850287018401881015611bc7578586fd5b855b85811015611be557813584529284019290840190600101611bc9565b5090979650505050505050565b600082601f830112611c02578081fd5b813567ffffffffffffffff811115611c1c57611c1c61286b565b611c2f601f8201601f1916602001612763565b818152846020838601011115611c43578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611c6e578081fd5b611c7782611b6f565b9392505050565b60008060408385031215611c90578081fd5b611c9983611b6f565b9150611ca760208401611b6f565b90509250929050565b600080600080600060a08688031215611cc7578081fd5b611cd086611b6f565b9450611cde60208701611b6f565b9350604086013567ffffffffffffffff80821115611cfa578283fd5b611d0689838a01611b86565b94506060880135915080821115611d1b578283fd5b611d2789838a01611b86565b93506080880135915080821115611d3c578283fd5b50611d4988828901611bf2565b9150509295509295909350565b600080600080600060a08688031215611d6d578081fd5b611d7686611b6f565b9450611d8460208701611b6f565b93506040860135925060608601359150608086013567ffffffffffffffff811115611dad578182fd5b611d4988828901611bf2565b60008060408385031215611dcb578182fd5b611dd483611b6f565b915060208301358015158114611de8578182fd5b809150509250929050565b60008060408385031215611e05578182fd5b611e0e83611b6f565b946020939093013593505050565b600080600060608486031215611e30578283fd5b611e3984611b6f565b95602085013595506040909401359392505050565b60008060408385031215611e60578182fd5b823567ffffffffffffffff80821115611e77578384fd5b818501915085601f830112611e8a578384fd5b81356020611e9a611ba68361278d565b82815281810190858301838502870184018b1015611eb6578889fd5b8896505b84871015611edf57611ecb81611b6f565b835260019690960195918301918301611eba565b5096505086013592505080821115611ef5578283fd5b50611f0285828601611b86565b9150509250929050565b600060208284031215611f1d578081fd5b8135611c778161292c565b600060208284031215611f39578081fd5b8151611c778161292c565b60008060408385031215611f56578182fd5b823567ffffffffffffffff80821115611f6d578384fd5b611f7986838701611bf2565b93506020850135915080821115611f8e578283fd5b50611f0285828601611bf2565b600060208284031215611fac578081fd5b5035919050565b600060208284031215611fc4578081fd5b5051919050565b60008060408385031215611fdd578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b8381101561201b57815187529582019590820190600101611fff565b509495945050505050565b60008151808452815b8181101561204b5760208185018101518683018201520161202f565b8181111561205c5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a0604082018190526000906120b190830186611fec565b82810360608401526120c38186611fec565b905082810360808401526120d78185612026565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061211d90830184612026565b979650505050505050565b600060208252611c776020830184611fec565b60006040825261214e6040830185611fec565b82810360208401526121608185611fec565b95945050505050565b901515815260200190565b600060208252611c776020830184612026565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526019908201527f4e6f6e6520617661696c61626c6520746f2061697264726f7000000000000000604082015260600190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b6020808252602a908201527f4d696e7420686173206e6f74206f70656e656420796574206f7220686173206260408201526919595b881b1bd8dad95960b21b606082015260800190565b6020808252601f908201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900604082015260600190565b6020808252602a908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015269206f6620746f6b656e7360b01b606082015260800190565b60208082526031908201527f43616e206f6e6c792070757263686173652061206d6178696d756d206f66203260408201527020746f6b656e7320617420612074696d6560781b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260149082015273135a5b9d081a185cc81899595b881b1bd8dad95960621b604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b602080825260159082015274105a5c991c9bdc081a185cc81b9bdd08195b991959605a1b604082015260600190565b6020808252601b908201527f4e6f2061697264726f7020746f6b656e7320617661696c61626c650000000000604082015260600190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156127855761278561286b565b604052919050565b600067ffffffffffffffff8211156127a7576127a761286b565b5060209081020190565b600082198211156127c4576127c4612855565b500190565b60008160001904831182151516156127e3576127e3612855565b500290565b6000828210156127fa576127fa612855565b500390565b60028104600182168061281357607f821691505b6020821081141561283457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561284e5761284e612855565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d101561289757610cbd565b600481823e6308c379a06128ab8251612881565b146128b557610cbd565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156128e55750505050610cbd565b828401925082519150808211156128ff5750505050610cbd565b503d8301602082840101111561291757505050610cbd565b601f01601f1916810160200160405291505090565b6001600160e01b031981168114610cad57600080fdfea2646970667358221220308dc264d25db73c537a84b403dcd70e9f8e344d36c67d4b5386ac2474b54cbc64736f6c63430008000033

Deployed Bytecode Sourcemap

40297:5684:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19924:231;;;;;;;;;;-1:-1:-1;19924:231:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41871:69;;;;;;;;;;;;;:::i;:::-;;18947:310;;;;;;;;;;-1:-1:-1;18947:310:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42297:182::-;;;;;;;;;;-1:-1:-1;42297:182:0;;;;;:::i;:::-;;:::i;45552:278::-;;;;;;;;;;-1:-1:-1;45552:278:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40950:35::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41417:183::-;;;;;;;;;;-1:-1:-1;41417:183:0;;;;;:::i;:::-;;:::i;41952:130::-;;;;;;;;;;;;;:::i;22019:442::-;;;;;;;;;;-1:-1:-1;22019:442:0;;;;;:::i;:::-;;:::i;45838:140::-;;;;;;;;;;;;;:::i;20321:524::-;;;;;;;;;;-1:-1:-1;20321:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34075:122::-;;;;;;;;;;-1:-1:-1;34075:122:0;;;;;:::i;:::-;;:::i;41040:33::-;;;;;;;;;;;;;:::i;36583:94::-;;;;;;;;;;;;;:::i;42094:191::-;;;;;;;;;;-1:-1:-1;42094:191:0;;;;;:::i;:::-;;:::i;43250:875::-;;;;;;:::i;:::-;;:::i;35932:87::-;;;;;;;;;;;;;:::i;20918:311::-;;;;;;;;;;-1:-1:-1;20918:311:0;;;;;:::i;:::-;;:::i;33864:113::-;;;;;;;;;;-1:-1:-1;33864:113:0;;;;;:::i;:::-;;:::i;44137:673::-;;;:::i;45025:519::-;;;;;;;;;;-1:-1:-1;45025:519:0;;;;;:::i;:::-;;:::i;21301:168::-;;;;;;;;;;-1:-1:-1;21301:168:0;;;;;:::i;:::-;;:::i;21541:401::-;;;;;;;;;;-1:-1:-1;21541:401:0;;;;;:::i;:::-;;:::i;40992:41::-;;;;;;;;;;;;;:::i;36832:192::-;;;;;;;;;;-1:-1:-1;36832:192:0;;;;;:::i;:::-;;:::i;41612:247::-;;;;;;;;;;-1:-1:-1;41612:247:0;;;;;:::i;:::-;;:::i;19924:231::-;20010:7;-1:-1:-1;;;;;20038:21:0;;20030:77;;;;-1:-1:-1;;;20030:77:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;20125:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;20125:22:0;;;;;;;;;;;;19924:231::o;41871:69::-;36163:12;:10;:12::i;:::-;-1:-1:-1;;;;;36152:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36152:23:0;;36144:68;;;;-1:-1:-1;;;36144:68:0;;;;;;;:::i;:::-;41931:1:::1;41918:10;:14:::0;41871:69::o;18947:310::-;19049:4;-1:-1:-1;;;;;;19086:41:0;;-1:-1:-1;;;19086:41:0;;:110;;-1:-1:-1;;;;;;;19144:52:0;;-1:-1:-1;;;19144:52:0;19086:110;:163;;;;19213:36;19237:11;19213:23;:36::i;:::-;19066:183;;18947:310;;;;:::o;42297:182::-;36163:12;:10;:12::i;:::-;-1:-1:-1;;;;;36152:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36152:23:0;;36144:68;;;;-1:-1:-1;;;36144:68:0;;;;;;;:::i;:::-;42398:14:::1;:29:::0;;;;42438:18:::1;:33:::0;42297:182::o;45552:278::-;45608:13;40715:2;45638:7;:24;45634:189;;;45686:14;45679:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45634:189;45732:2;45722:7;:12;45718:105;;;45758:11;45751:18;;;;;:::i;45718:105::-;-1:-1:-1;45802:9:0;;;;;;;;;-1:-1:-1;45802:9:0;;;;40950:35;;;-1:-1:-1;;;;;40950:35:0;;:::o;41417:183::-;36163:12;:10;:12::i;:::-;-1:-1:-1;;;;;36152:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36152:23:0;;36144:68;;;;-1:-1:-1;;;36144:68:0;;;;;;;:::i;:::-;41523:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;41566:26:0;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;:::-;;41417:183:::0;;:::o;41952:130::-;36163:12;:10;:12::i;:::-;-1:-1:-1;;;;;36152:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36152:23:0;;36144:68;;;;-1:-1:-1;;;36144:68:0;;;;;;;:::i;:::-;42009:10:::1;;42023:1;42009:15;;42001:48;;;;-1:-1:-1::0;;;42001:48:0::1;;;;;;;:::i;:::-;42073:1;42060:10;:14:::0;41952:130::o;22019:442::-;22260:12;:10;:12::i;:::-;-1:-1:-1;;;;;22252:20:0;:4;-1:-1:-1;;;;;22252:20:0;;:60;;;;22276:36;22293:4;22299:12;:10;:12::i;22276:36::-;22230:160;;;;-1:-1:-1;;;22230:160:0;;;;;;;:::i;:::-;22401:52;22424:4;22430:2;22434:3;22439:7;22448:4;22401:22;:52::i;:::-;22019:442;;;;;:::o;45838:140::-;36163:12;:10;:12::i;:::-;-1:-1:-1;;;;;36152:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36152:23:0;;36144:68;;;;-1:-1:-1;;;36144:68:0;;;;;;;:::i;:::-;45933:37:::1;::::0;45901:21:::1;::::0;45941:10:::1;::::0;45933:37;::::1;;;::::0;45901:21;;45886:12:::1;45933:37:::0;45886:12;45933:37;45901:21;45941:10;45933:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;36223:1;45838:140::o:0;20321:524::-;20477:16;20538:3;:10;20519:8;:15;:29;20511:83;;;;-1:-1:-1;;;20511:83:0;;;;;;;:::i;:::-;20607:30;20654:8;:15;20640:30;;;;;;-1:-1:-1;;;20640:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20640:30:0;;20607:63;;20688:9;20683:122;20707:8;:15;20703:1;:19;20683:122;;;20763:30;20773:8;20782:1;20773:11;;;;;;-1:-1:-1;;;20773:11:0;;;;;;;;;;;;;;;20786:3;20790:1;20786:6;;;;;;-1:-1:-1;;;20786:6:0;;;;;;;;;;;;;;;20763:9;:30::i;:::-;20744:13;20758:1;20744:16;;;;;;-1:-1:-1;;;20744:16:0;;;;;;;;;;;;;;;;;;:49;20724:3;;;:::i;:::-;;;20683:122;;;-1:-1:-1;20824:13:0;20321:524;-1:-1:-1;;;20321:524:0:o;34075:122::-;34132:4;34188:1;34156:29;34182:2;34156:25;:29::i;:::-;:33;;34075:122;-1:-1:-1;;34075:122:0:o;41040:33::-;;;-1:-1:-1;;;;;41040:33:0;;:::o;36583:94::-;36163:12;:10;:12::i;:::-;-1:-1:-1;;;;;36152:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36152:23:0;;36144:68;;;;-1:-1:-1;;;36144:68:0;;;;;;;:::i;:::-;36648:21:::1;36666:1;36648:9;:21::i;:::-;36583:94::o:0;42094:191::-;36163:12;:10;:12::i;:::-;-1:-1:-1;;;;;36152:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36152:23:0;;36144:68;;;;-1:-1:-1;;;36144:68:0;;;;;;;:::i;:::-;42198:17:::1;:32:::0;;;;42241:21:::1;:36:::0;42094:191::o;43250:875::-;43334:10;;:15;43326:70;;;;-1:-1:-1;;;43326:70:0;;;;;;;:::i;:::-;43415:18;;:23;43407:57;;;;-1:-1:-1;;;43407:57:0;;;;;;;:::i;:::-;40564:4;43512:14;43483:26;40715:2;43483:11;:26::i;:::-;:43;;;;:::i;:::-;:63;;43475:118;;;;-1:-1:-1;;;43475:118:0;;;;;;;:::i;:::-;43630:1;43612:14;:19;;43604:81;;;;-1:-1:-1;;;43604:81:0;;;;;;;:::i;:::-;43700:12;;:34;;-1:-1:-1;;;43700:34:0;;43737:1;;-1:-1:-1;;;;;43700:12:0;;:22;;:34;;43723:10;;43700:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;:86;;;-1:-1:-1;43742:18:0;;:40;;-1:-1:-1;;;43742:40:0;;43785:1;;-1:-1:-1;;;;;43742:18:0;;:28;;:40;;43771:10;;43742:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;43700:86;:126;;;-1:-1:-1;43790:10:0;;:32;;-1:-1:-1;;;43790:32:0;;43825:1;;-1:-1:-1;;;;;43790:10:0;;:20;;:32;;43811:10;;43790:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;43700:126;43696:380;;;43895:9;43876:14;43852:21;;:38;;;;:::i;:::-;43851:53;;43843:97;;;;-1:-1:-1;;;43843:97:0;;;;;;;:::i;:::-;43696:380;;;44019:9;44001:14;43981:17;;:34;;;;:::i;:::-;:47;;43973:91;;;;-1:-1:-1;;;43973:91:0;;;;;;;:::i;:::-;44086:31;44102:14;44086:15;:31::i;:::-;43250:875;:::o;35932:87::-;36005:6;;-1:-1:-1;;;;;36005:6:0;35932:87;;:::o;20918:311::-;21037:8;-1:-1:-1;;;;;21021:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;21021:24:0;;;21013:78;;;;-1:-1:-1;;;21013:78:0;;;;;;;:::i;:::-;21149:8;21104:18;:32;21123:12;:10;:12::i;:::-;-1:-1:-1;;;;;21104:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;21104:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;21104:53:0;;;;;;;;;;;21188:12;:10;:12::i;:::-;-1:-1:-1;;;;;21173:48:0;;21212:8;21173:48;;;;;;:::i;:::-;;;;;;;;20918:311;;:::o;33864:113::-;33926:7;33953:16;;;:12;:16;;;;;;;33864:113::o;44137:673::-;44199:10;;:15;44191:70;;;;-1:-1:-1;;;44191:70:0;;;;;;;:::i;:::-;44280:18;;:23;44272:57;;;;-1:-1:-1;;;44272:57:0;;;;;;;:::i;:::-;40608:2;44348:8;;:24;44340:79;;;;-1:-1:-1;;;44340:79:0;;;;;;;:::i;:::-;44434:12;;:34;;-1:-1:-1;;;44434:34:0;;44471:1;;-1:-1:-1;;;;;44434:12:0;;:22;;:34;;44457:10;;44434:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;:86;;;-1:-1:-1;44476:18:0;;:40;;-1:-1:-1;;;44476:40:0;;44519:1;;-1:-1:-1;;;;;44476:18:0;;:28;;:40;;44505:10;;44476:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;44434:86;:126;;;-1:-1:-1;44524:10:0;;:32;;-1:-1:-1;;;44524:32:0;;44559:1;;-1:-1:-1;;;;;44524:10:0;;:20;;:32;;44545:10;;44524:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;44434:126;44430:338;;;44607:9;44585:18;;:31;;44577:75;;;;-1:-1:-1;;;44577:75:0;;;;;;;:::i;:::-;44430:338;;;44711:9;44693:14;;:27;;44685:71;;;;-1:-1:-1;;;44685:71:0;;;;;;;:::i;:::-;44778:24;44791:10;44778:12;:24::i;45025:519::-;36163:12;:10;:12::i;:::-;-1:-1:-1;;;;;36152:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36152:23:0;;36144:68;;;;-1:-1:-1;;;36144:68:0;;;;;;;:::i;:::-;45174:1:::1;45153:18;;:22;45145:62;;;;-1:-1:-1::0;;;45145:62:0::1;;;;;;;:::i;:::-;45244:18;;45226:14;:36;;45218:45;;;::::0;::::1;;45296:14;45274:18;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;45357:1:0::1;45325:33:::0;::::1;45321:216;;;45375:55;45389:14;45405:9;40715:2;45375:13;:55::i;:::-;45321:216;;;45452:28;45484:1;45452:33;45448:89;;;45502:23;45515:9;45502:12;:23::i;21301:168::-:0;-1:-1:-1;;;;;21424:27:0;;;21400:4;21424:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;21301:168::o;21541:401::-;21757:12;:10;:12::i;:::-;-1:-1:-1;;;;;21749:20:0;:4;-1:-1:-1;;;;;21749:20:0;;:60;;;;21773:36;21790:4;21796:12;:10;:12::i;21773:36::-;21727:151;;;;-1:-1:-1;;;21727:151:0;;;;;;;:::i;:::-;21889:45;21907:4;21913:2;21917;21921:6;21929:4;21889:17;:45::i;40992:41::-;;;-1:-1:-1;;;;;40992:41:0;;:::o;36832:192::-;36163:12;:10;:12::i;:::-;-1:-1:-1;;;;;36152:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36152:23:0;;36144:68;;;;-1:-1:-1;;;36144:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36921:22:0;::::1;36913:73;;;;-1:-1:-1::0;;;36913:73:0::1;;;;;;;:::i;:::-;36997:19;37007:8;36997:9;:19::i;41612:247::-:0;36163:12;:10;:12::i;:::-;-1:-1:-1;;;;;36152:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36152:23:0;;36144:68;;;;-1:-1:-1;;;36144:68:0;;;;;;;:::i;:::-;41740:32:::1;40608:2;40564:4;41740:32;:::i;:::-;41727:8;;41698:26;40715:2;41698:11;:26::i;:::-;:37;;;;:::i;:::-;41697:76;41689:114;;;;-1:-1:-1::0;;;41689:114:0::1;;;;;;;:::i;:::-;41814:18;:37:::0;41612:247::o;17718:98::-;17798:10;17718:98;:::o;9744:157::-;-1:-1:-1;;;;;;9853:40:0;;-1:-1:-1;;;9853:40:0;9744:157;;;:::o;24103:1074::-;24330:7;:14;24316:3;:10;:28;24308:81;;;;-1:-1:-1;;;24308:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24408:16:0;;24400:66;;;;-1:-1:-1;;;24400:66:0;;;;;;;:::i;:::-;24479:16;24498:12;:10;:12::i;:::-;24479:31;;24523:60;24544:8;24554:4;24560:2;24564:3;24569:7;24578:4;24523:20;:60::i;:::-;24601:9;24596:421;24620:3;:10;24616:1;:14;24596:421;;;24652:10;24665:3;24669:1;24665:6;;;;;;-1:-1:-1;;;24665:6:0;;;;;;;;;;;;;;;24652:19;;24686:14;24703:7;24711:1;24703:10;;;;;;-1:-1:-1;;;24703:10:0;;;;;;;;;;;;;;;;;;;;24730:19;24752:13;;;;;;;;;;-1:-1:-1;;;;;24752:19:0;;;;;;;;;;;;24703:10;;-1:-1:-1;24794:21:0;;;;24786:76;;;;-1:-1:-1;;;24786:76:0;;;;;;;:::i;:::-;24906:9;:13;;;;;;;;;;;-1:-1:-1;;;;;24906:19:0;;;;;;;;;;24928:20;;;24906:42;;24978:17;;;;;;;:27;;24928:20;;24906:9;24978:27;;24928:20;;24978:27;:::i;:::-;;;;;;;;24596:421;;;24632:3;;;;:::i;:::-;;;24596:421;;;;25064:2;-1:-1:-1;;;;;25034:47:0;25058:4;-1:-1:-1;;;;;25034:47:0;25048:8;-1:-1:-1;;;;;25034:47:0;;25068:3;25073:7;25034:47;;;;;;;:::i;:::-;;;;;;;;25094:75;25130:8;25140:4;25146:2;25150:3;25155:7;25164:4;25094:35;:75::i;:::-;24103:1074;;;;;;:::o;37032:173::-;37107:6;;;-1:-1:-1;;;;;37124:17:0;;;-1:-1:-1;;;;;;37124:17:0;;;;;;;37157:40;;37107:6;;;37124:17;37107:6;;37157:40;;37088:16;;37157:40;37032:173;;:::o;42785:134::-;42859:52;42865:10;40715:2;42892:14;42859:52;;;;;;;;;;;;:5;:52::i;44822:191::-;44897:12;44912:8;;44897:23;;44931:38;44937:15;44954:7;44963:1;44931:38;;;;;;;;;;;;:5;:38::i;:::-;44991:8;;:13;;45003:1;44991:13;:::i;:::-;44980:8;:24;-1:-1:-1;;44822:191:0:o;42931:311::-;43100:32;40608:2;40564:4;43100:32;:::i;:::-;43082:14;43071:8;;43042:26;40715:2;43042:11;:26::i;:::-;:37;;;;:::i;:::-;:54;;;;:::i;:::-;:90;;43034:134;;;;-1:-1:-1;;;43034:134:0;;;;;;;:::i;:::-;43179:51;43185:15;43202:7;43211:14;43179:51;;;;;;;;;;;;:5;:51::i;22925:820::-;-1:-1:-1;;;;;23113:16:0;;23105:66;;;;-1:-1:-1;;;23105:66:0;;;;;;;:::i;:::-;23184:16;23203:12;:10;:12::i;:::-;23184:31;;23228:96;23249:8;23259:4;23265:2;23269:21;23287:2;23269:17;:21::i;:::-;23292:25;23310:6;23292:17;:25::i;:::-;23319:4;23228:20;:96::i;:::-;23337:19;23359:13;;;;;;;;;;;-1:-1:-1;;;;;23359:19:0;;;;;;;;;;23397:21;;;;23389:76;;;;-1:-1:-1;;;23389:76:0;;;;;;;:::i;:::-;23501:9;:13;;;;;;;;;;;-1:-1:-1;;;;;23501:19:0;;;;;;;;;;23523:20;;;23501:42;;23565:17;;;;;;;:27;;23523:20;;23501:9;23565:27;;23523:20;;23565:27;:::i;:::-;;;;;;;;23641:2;-1:-1:-1;;;;;23610:46:0;23635:4;-1:-1:-1;;;;;23610:46:0;23625:8;-1:-1:-1;;;;;23610:46:0;;23645:2;23649:6;23610:46;;;;;;;:::i;:::-;;;;;;;;23669:68;23700:8;23710:4;23716:2;23720;23724:6;23732:4;23669:30;:68::i;:::-;22925:820;;;;;;;:::o;34272:655::-;34511:66;34538:8;34548:4;34554:2;34558:3;34563:7;34572:4;34511:26;:66::i;:::-;-1:-1:-1;;;;;34594:18:0;;34590:160;;34634:9;34629:110;34653:3;:10;34649:1;:14;34629:110;;;34713:7;34721:1;34713:10;;;;;;-1:-1:-1;;;34713:10:0;;;;;;;;;;;;;;;34689:12;:20;34702:3;34706:1;34702:6;;;;;;-1:-1:-1;;;34702:6:0;;;;;;;;;;;;;;;34689:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;34665:3:0;;-1:-1:-1;34665:3:0;;:::i;:::-;;;34629:110;;;;34590:160;-1:-1:-1;;;;;34766:16:0;;34762:158;;34804:9;34799:110;34823:3;:10;34819:1;:14;34799:110;;;34883:7;34891:1;34883:10;;;;;;-1:-1:-1;;;34883:10:0;;;;;;;;;;;;;;;34859:12;:20;34872:3;34876:1;34872:6;;;;;;-1:-1:-1;;;34872:6:0;;;;;;;;;;;;;;;34859:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;34835:3:0;;-1:-1:-1;34835:3:0;;:::i;:::-;;;34799:110;;32192:813;32432:15;:2;-1:-1:-1;;;;;32432:13:0;;:15::i;:::-;32428:570;;;32468:79;;-1:-1:-1;;;32468:79:0;;-1:-1:-1;;;;;32468:43:0;;;;;:79;;32512:8;;32522:4;;32528:3;;32533:7;;32542:4;;32468:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32468:79:0;;;;;;;;-1:-1:-1;;32468:79:0;;;;;;;;;;;;:::i;:::-;;;32464:523;;;;:::i;:::-;;;;;;;;32860:6;32853:14;;-1:-1:-1;;;32853:14:0;;;;;;;;:::i;32464:523::-;32909:62;;-1:-1:-1;;;32909:62:0;;;;;;;:::i;32464:523::-;-1:-1:-1;;;;;;32629:60:0;;-1:-1:-1;;;32629:60:0;32625:159;;32714:50;;-1:-1:-1;;;32714:50:0;;;;;;;:::i;26510:599::-;-1:-1:-1;;;;;26668:21:0;;26660:67;;;;-1:-1:-1;;;26660:67:0;;;;;;;:::i;:::-;26740:16;26759:12;:10;:12::i;:::-;26740:31;;26784:107;26805:8;26823:1;26827:7;26836:21;26854:2;26836:17;:21::i;26784:107::-;26904:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26904:22:0;;;;;;;;;:32;;26930:6;;26904:9;:32;;26930:6;;26904:32;:::i;:::-;;;;;;;;26989:7;-1:-1:-1;;;;;26952:57:0;26985:1;-1:-1:-1;;;;;26952:57:0;26967:8;-1:-1:-1;;;;;26952:57:0;;26998:2;27002:6;26952:57;;;;;;;:::i;:::-;;;;;;;;27022:79;27053:8;27071:1;27075:7;27084:2;27088:6;27096:4;27022:30;:79::i;33013:198::-;33133:16;;;33147:1;33133:16;;;;;;;;;33079;;33108:22;;33133:16;;;;;;;;;;;;-1:-1:-1;33133:16:0;33108:41;;33171:7;33160:5;33166:1;33160:8;;;;;;-1:-1:-1;;;33160:8:0;;;;;;;;;;;;;;;;;;:18;33198:5;33013:198;-1:-1:-1;;33013:198:0:o;31440:744::-;31655:15;:2;-1:-1:-1;;;;;31655:13:0;;:15::i;:::-;31651:526;;;31691:72;;-1:-1:-1;;;31691:72:0;;-1:-1:-1;;;;;31691:38:0;;;;;:72;;31730:8;;31740:4;;31746:2;;31750:6;;31758:4;;31691:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31691:72:0;;;;;;;;-1:-1:-1;;31691:72:0;;;;;;;;;;;;:::i;:::-;;;31687:479;;;;:::i;:::-;-1:-1:-1;;;;;;31813:55:0;;-1:-1:-1;;;31813:55:0;31809:154;;31893:50;;-1:-1:-1;;;31893:50:0;;;;;;;:::i;766:387::-;1089:20;1137:8;;;766:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:175:1;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:705;;307:3;300:4;292:6;288:17;284:27;274:2;;329:5;322;315:20;274:2;369:6;356:20;395:4;419:65;434:49;480:2;434:49;:::i;:::-;419:65;:::i;:::-;518:15;;;549:12;;;;581:15;;;627:11;;;615:24;;611:33;;608:42;-1:-1:-1;605:2:1;;;667:5;660;653:20;605:2;693:5;707:163;721:2;718:1;715:9;707:163;;;778:17;;766:30;;816:12;;;;848;;;;739:1;732:9;707:163;;;-1:-1:-1;888:5:1;;264:635;-1:-1:-1;;;;;;;264:635:1:o;904:551::-;;1001:3;994:4;986:6;982:17;978:27;968:2;;1023:5;1016;1009:20;968:2;1063:6;1050:20;1089:18;1085:2;1082:26;1079:2;;;1111:18;;:::i;:::-;1155:54;1197:2;1178:13;;-1:-1:-1;;1174:27:1;1203:4;1170:38;1155:54;:::i;:::-;1234:2;1225:7;1218:19;1280:3;1273:4;1268:2;1260:6;1256:15;1252:26;1249:35;1246:2;;;1301:5;1294;1287:20;1246:2;1370;1363:4;1355:6;1351:17;1344:4;1335:7;1331:18;1318:55;1393:16;;;1411:4;1389:27;1382:42;;;;1397:7;958:497;-1:-1:-1;;958:497:1:o;1460:198::-;;1572:2;1560:9;1551:7;1547:23;1543:32;1540:2;;;1593:6;1585;1578:22;1540:2;1621:31;1642:9;1621:31;:::i;:::-;1611:41;1530:128;-1:-1:-1;;;1530:128:1:o;1663:274::-;;;1792:2;1780:9;1771:7;1767:23;1763:32;1760:2;;;1813:6;1805;1798:22;1760:2;1841:31;1862:9;1841:31;:::i;:::-;1831:41;;1891:40;1927:2;1916:9;1912:18;1891:40;:::i;:::-;1881:50;;1750:187;;;;;:::o;1942:1001::-;;;;;;2181:3;2169:9;2160:7;2156:23;2152:33;2149:2;;;2203:6;2195;2188:22;2149:2;2231:31;2252:9;2231:31;:::i;:::-;2221:41;;2281:40;2317:2;2306:9;2302:18;2281:40;:::i;:::-;2271:50;;2372:2;2361:9;2357:18;2344:32;2395:18;2436:2;2428:6;2425:14;2422:2;;;2457:6;2449;2442:22;2422:2;2485:67;2544:7;2535:6;2524:9;2520:22;2485:67;:::i;:::-;2475:77;;2605:2;2594:9;2590:18;2577:32;2561:48;;2634:2;2624:8;2621:16;2618:2;;;2655:6;2647;2640:22;2618:2;2683:69;2744:7;2733:8;2722:9;2718:24;2683:69;:::i;:::-;2673:79;;2805:3;2794:9;2790:19;2777:33;2761:49;;2835:2;2825:8;2822:16;2819:2;;;2856:6;2848;2841:22;2819:2;;2884:53;2929:7;2918:8;2907:9;2903:24;2884:53;:::i;:::-;2874:63;;;2139:804;;;;;;;;:::o;2948:632::-;;;;;;3137:3;3125:9;3116:7;3112:23;3108:33;3105:2;;;3159:6;3151;3144:22;3105:2;3187:31;3208:9;3187:31;:::i;:::-;3177:41;;3237:40;3273:2;3262:9;3258:18;3237:40;:::i;:::-;3227:50;;3324:2;3313:9;3309:18;3296:32;3286:42;;3375:2;3364:9;3360:18;3347:32;3337:42;;3430:3;3419:9;3415:19;3402:33;3458:18;3450:6;3447:30;3444:2;;;3495:6;3487;3480:22;3444:2;3523:51;3566:7;3557:6;3546:9;3542:22;3523:51;:::i;3585:369::-;;;3711:2;3699:9;3690:7;3686:23;3682:32;3679:2;;;3732:6;3724;3717:22;3679:2;3760:31;3781:9;3760:31;:::i;:::-;3750:41;;3841:2;3830:9;3826:18;3813:32;3888:5;3881:13;3874:21;3867:5;3864:32;3854:2;;3915:6;3907;3900:22;3854:2;3943:5;3933:15;;;3669:285;;;;;:::o;3959:266::-;;;4088:2;4076:9;4067:7;4063:23;4059:32;4056:2;;;4109:6;4101;4094:22;4056:2;4137:31;4158:9;4137:31;:::i;:::-;4127:41;4215:2;4200:18;;;;4187:32;;-1:-1:-1;;;4046:179:1:o;4230:334::-;;;;4376:2;4364:9;4355:7;4351:23;4347:32;4344:2;;;4397:6;4389;4382:22;4344:2;4425:31;4446:9;4425:31;:::i;:::-;4415:41;4503:2;4488:18;;4475:32;;-1:-1:-1;4554:2:1;4539:18;;;4526:32;;4334:230;-1:-1:-1;;;4334:230:1:o;4569:1226::-;;;4748:2;4736:9;4727:7;4723:23;4719:32;4716:2;;;4769:6;4761;4754:22;4716:2;4814:9;4801:23;4843:18;4884:2;4876:6;4873:14;4870:2;;;4905:6;4897;4890:22;4870:2;4948:6;4937:9;4933:22;4923:32;;4993:7;4986:4;4982:2;4978:13;4974:27;4964:2;;5020:6;5012;5005:22;4964:2;5061;5048:16;5083:4;5107:65;5122:49;5168:2;5122:49;:::i;5107:65::-;5206:15;;;5237:12;;;;5269:11;;;5307;;;5299:20;;5295:29;;5292:42;-1:-1:-1;5289:2:1;;;5352:6;5344;5337:22;5289:2;5379:6;5370:15;;5394:171;5408:2;5405:1;5402:9;5394:171;;;5465:25;5486:3;5465:25;:::i;:::-;5453:38;;5426:1;5419:9;;;;;5511:12;;;;5543;;5394:171;;;-1:-1:-1;5584:5:1;-1:-1:-1;;5627:18:1;;5614:32;;-1:-1:-1;;5658:16:1;;;5655:2;;;5692:6;5684;5677:22;5655:2;;5720:69;5781:7;5770:8;5759:9;5755:24;5720:69;:::i;:::-;5710:79;;;4706:1089;;;;;:::o;5800:257::-;;5911:2;5899:9;5890:7;5886:23;5882:32;5879:2;;;5932:6;5924;5917:22;5879:2;5976:9;5963:23;5995:32;6021:5;5995:32;:::i;6062:261::-;;6184:2;6172:9;6163:7;6159:23;6155:32;6152:2;;;6205:6;6197;6190:22;6152:2;6242:9;6236:16;6261:32;6287:5;6261:32;:::i;6328:575::-;;;6477:2;6465:9;6456:7;6452:23;6448:32;6445:2;;;6498:6;6490;6483:22;6445:2;6543:9;6530:23;6572:18;6613:2;6605:6;6602:14;6599:2;;;6634:6;6626;6619:22;6599:2;6662:51;6705:7;6696:6;6685:9;6681:22;6662:51;:::i;:::-;6652:61;;6766:2;6755:9;6751:18;6738:32;6722:48;;6795:2;6785:8;6782:16;6779:2;;;6816:6;6808;6801:22;6779:2;;6844:53;6889:7;6878:8;6867:9;6863:24;6844:53;:::i;6908:190::-;;7020:2;7008:9;6999:7;6995:23;6991:32;6988:2;;;7041:6;7033;7026:22;6988:2;-1:-1:-1;7069:23:1;;6978:120;-1:-1:-1;6978:120:1:o;7103:194::-;;7226:2;7214:9;7205:7;7201:23;7197:32;7194:2;;;7247:6;7239;7232:22;7194:2;-1:-1:-1;7275:16:1;;7184:113;-1:-1:-1;7184:113:1:o;7302:258::-;;;7431:2;7419:9;7410:7;7406:23;7402:32;7399:2;;;7452:6;7444;7437:22;7399:2;-1:-1:-1;;7480:23:1;;;7550:2;7535:18;;;7522:32;;-1:-1:-1;7389:171:1:o;7565:443::-;;7662:5;7656:12;7689:6;7684:3;7677:19;7715:4;7744:2;7739:3;7735:12;7728:19;;7781:2;7774:5;7770:14;7802:3;7814:169;7828:6;7825:1;7822:13;7814:169;;;7889:13;;7877:26;;7923:12;;;;7958:15;;;;7850:1;7843:9;7814:169;;;-1:-1:-1;7999:3:1;;7632:376;-1:-1:-1;;;;;7632:376:1:o;8013:477::-;;8094:5;8088:12;8121:6;8116:3;8109:19;8146:3;8158:162;8172:6;8169:1;8166:13;8158:162;;;8234:4;8290:13;;;8286:22;;8280:29;8262:11;;;8258:20;;8251:59;8187:12;8158:162;;;8338:6;8335:1;8332:13;8329:2;;;8404:3;8397:4;8388:6;8383:3;8379:16;8375:27;8368:40;8329:2;-1:-1:-1;8472:2:1;8451:15;-1:-1:-1;;8447:29:1;8438:39;;;;8479:4;8434:50;;8064:426;-1:-1:-1;;8064:426:1:o;8495:203::-;-1:-1:-1;;;;;8659:32:1;;;;8641:51;;8629:2;8614:18;;8596:102::o;8703:840::-;-1:-1:-1;;;;;9100:15:1;;;9082:34;;9152:15;;9147:2;9132:18;;9125:43;9062:3;9199:2;9184:18;;9177:31;;;8703:840;;9231:63;;9274:19;;9266:6;9231:63;:::i;:::-;9342:9;9334:6;9330:22;9325:2;9314:9;9310:18;9303:50;9376;9419:6;9411;9376:50;:::i;:::-;9362:64;;9475:9;9467:6;9463:22;9457:3;9446:9;9442:19;9435:51;9503:34;9530:6;9522;9503:34;:::i;:::-;9495:42;9034:509;-1:-1:-1;;;;;;;;9034:509:1:o;9548:562::-;-1:-1:-1;;;;;9845:15:1;;;9827:34;;9897:15;;9892:2;9877:18;;9870:43;9944:2;9929:18;;9922:34;;;9987:2;9972:18;;9965:34;;;9807:3;10030;10015:19;;10008:32;;;9548:562;;10057:47;;10084:19;;10076:6;10057:47;:::i;:::-;10049:55;9779:331;-1:-1:-1;;;;;;;9779:331:1:o;10115:267::-;;10294:2;10283:9;10276:21;10314:62;10372:2;10361:9;10357:18;10349:6;10314:62;:::i;10387:477::-;;10644:2;10633:9;10626:21;10670:62;10728:2;10717:9;10713:18;10705:6;10670:62;:::i;:::-;10780:9;10772:6;10768:22;10763:2;10752:9;10748:18;10741:50;10808;10851:6;10843;10808:50;:::i;:::-;10800:58;10616:248;-1:-1:-1;;;;;10616:248:1:o;10869:187::-;11034:14;;11027:22;11009:41;;10997:2;10982:18;;10964:92::o;11293:221::-;;11442:2;11431:9;11424:21;11462:46;11504:2;11493:9;11489:18;11481:6;11462:46;:::i;11519:416::-;11721:2;11703:21;;;11760:2;11740:18;;;11733:30;11799:34;11794:2;11779:18;;11772:62;-1:-1:-1;;;11865:2:1;11850:18;;11843:50;11925:3;11910:19;;11693:242::o;11940:404::-;12142:2;12124:21;;;12181:2;12161:18;;;12154:30;12220:34;12215:2;12200:18;;12193:62;-1:-1:-1;;;12286:2:1;12271:18;;12264:38;12334:3;12319:19;;12114:230::o;12349:407::-;12551:2;12533:21;;;12590:2;12570:18;;;12563:30;12629:34;12624:2;12609:18;;12602:62;-1:-1:-1;;;12695:2:1;12680:18;;12673:41;12746:3;12731:19;;12523:233::o;12761:402::-;12963:2;12945:21;;;13002:2;12982:18;;;12975:30;13041:34;13036:2;13021:18;;13014:62;-1:-1:-1;;;13107:2:1;13092:18;;13085:36;13153:3;13138:19;;12935:228::o;13168:405::-;13370:2;13352:21;;;13409:2;13389:18;;;13382:30;13448:34;13443:2;13428:18;;13421:62;-1:-1:-1;;;13514:2:1;13499:18;;13492:39;13563:3;13548:19;;13342:231::o;13578:349::-;13780:2;13762:21;;;13819:2;13799:18;;;13792:30;13858:27;13853:2;13838:18;;13831:55;13918:2;13903:18;;13752:175::o;13932:355::-;14134:2;14116:21;;;14173:2;14153:18;;;14146:30;14212:33;14207:2;14192:18;;14185:61;14278:2;14263:18;;14106:181::o;14292:401::-;14494:2;14476:21;;;14533:2;14513:18;;;14506:30;14572:34;14567:2;14552:18;;14545:62;-1:-1:-1;;;14638:2:1;14623:18;;14616:35;14683:3;14668:19;;14466:227::o;14698:414::-;14900:2;14882:21;;;14939:2;14919:18;;;14912:30;14978:34;14973:2;14958:18;;14951:62;-1:-1:-1;;;15044:2:1;15029:18;;15022:48;15102:3;15087:19;;14872:240::o;15117:406::-;15319:2;15301:21;;;15358:2;15338:18;;;15331:30;15397:34;15392:2;15377:18;;15370:62;-1:-1:-1;;;15463:2:1;15448:18;;15441:40;15513:3;15498:19;;15291:232::o;15528:355::-;15730:2;15712:21;;;15769:2;15749:18;;;15742:30;15808:33;15803:2;15788:18;;15781:61;15874:2;15859:18;;15702:181::o;15888:406::-;16090:2;16072:21;;;16129:2;16109:18;;;16102:30;16168:34;16163:2;16148:18;;16141:62;-1:-1:-1;;;16234:2:1;16219:18;;16212:40;16284:3;16269:19;;16062:232::o;16299:413::-;16501:2;16483:21;;;16540:2;16520:18;;;16513:30;16579:34;16574:2;16559:18;;16552:62;-1:-1:-1;;;16645:2:1;16630:18;;16623:47;16702:3;16687:19;;16473:239::o;16717:406::-;16919:2;16901:21;;;16958:2;16938:18;;;16931:30;16997:34;16992:2;16977:18;;16970:62;-1:-1:-1;;;17063:2:1;17048:18;;17041:40;17113:3;17098:19;;16891:232::o;17128:356::-;17330:2;17312:21;;;17349:18;;;17342:30;17408:34;17403:2;17388:18;;17381:62;17475:2;17460:18;;17302:182::o;17489:344::-;17691:2;17673:21;;;17730:2;17710:18;;;17703:30;-1:-1:-1;;;17764:2:1;17749:18;;17742:50;17824:2;17809:18;;17663:170::o;17838:405::-;18040:2;18022:21;;;18079:2;18059:18;;;18052:30;18118:34;18113:2;18098:18;;18091:62;-1:-1:-1;;;18184:2:1;18169:18;;18162:39;18233:3;18218:19;;18012:231::o;18248:405::-;18450:2;18432:21;;;18489:2;18469:18;;;18462:30;18528:34;18523:2;18508:18;;18501:62;-1:-1:-1;;;18594:2:1;18579:18;;18572:39;18643:3;18628:19;;18422:231::o;18658:404::-;18860:2;18842:21;;;18899:2;18879:18;;;18872:30;18938:34;18933:2;18918:18;;18911:62;-1:-1:-1;;;19004:2:1;18989:18;;18982:38;19052:3;19037:19;;18832:230::o;19067:397::-;19269:2;19251:21;;;19308:2;19288:18;;;19281:30;19347:34;19342:2;19327:18;;19320:62;-1:-1:-1;;;19413:2:1;19398:18;;19391:31;19454:3;19439:19;;19241:223::o;19469:345::-;19671:2;19653:21;;;19710:2;19690:18;;;19683:30;-1:-1:-1;;;19744:2:1;19729:18;;19722:51;19805:2;19790:18;;19643:171::o;19819:351::-;20021:2;20003:21;;;20060:2;20040:18;;;20033:30;20099:29;20094:2;20079:18;;20072:57;20161:2;20146:18;;19993:177::o;20175:::-;20321:25;;;20309:2;20294:18;;20276:76::o;20357:248::-;20531:25;;;20587:2;20572:18;;20565:34;20519:2;20504:18;;20486:119::o;20610:251::-;20680:2;20674:9;20710:17;;;20757:18;20742:34;;20778:22;;;20739:62;20736:2;;;20804:18;;:::i;:::-;20840:2;20833:22;20654:207;;-1:-1:-1;20654:207:1:o;20866:192::-;;20965:18;20957:6;20954:30;20951:2;;;20987:18;;:::i;:::-;-1:-1:-1;21047:4:1;21028:17;;;21024:28;;20941:117::o;21063:128::-;;21134:1;21130:6;21127:1;21124:13;21121:2;;;21140:18;;:::i;:::-;-1:-1:-1;21176:9:1;;21111:80::o;21196:168::-;;21302:1;21298;21294:6;21290:14;21287:1;21284:21;21279:1;21272:9;21265:17;21261:45;21258:2;;;21309:18;;:::i;:::-;-1:-1:-1;21349:9:1;;21248:116::o;21369:125::-;;21437:1;21434;21431:8;21428:2;;;21442:18;;:::i;:::-;-1:-1:-1;21479:9:1;;21418:76::o;21499:380::-;21584:1;21574:12;;21631:1;21621:12;;;21642:2;;21696:4;21688:6;21684:17;21674:27;;21642:2;21749;21741:6;21738:14;21718:18;21715:38;21712:2;;;21795:10;21790:3;21786:20;21783:1;21776:31;21830:4;21827:1;21820:15;21858:4;21855:1;21848:15;21712:2;;21554:325;;;:::o;21884:135::-;;-1:-1:-1;;21944:17:1;;21941:2;;;21964:18;;:::i;:::-;-1:-1:-1;22011:1:1;22000:13;;21931:88::o;22024:127::-;22085:10;22080:3;22076:20;22073:1;22066:31;22116:4;22113:1;22106:15;22140:4;22137:1;22130:15;22156:127;22217:10;22212:3;22208:20;22205:1;22198:31;22248:4;22245:1;22238:15;22272:4;22269:1;22262:15;22288:88;22363:3;22359:15;;22345:31::o;22381:764::-;;22462:4;22444:16;22441:26;22438:2;;;22470:5;;22438:2;22511:1;22506:3;22501;22486:27;22573:10;22535:36;22566:3;22560:10;22535:36;:::i;:::-;22532:52;22522:2;;22588:5;;22522:2;22622;22616:9;22662:16;-1:-1:-1;;22658:29:1;22655:1;22616:9;22634:54;22717:4;22711:11;22741:16;22776:18;22847:2;22840:4;22832:6;22828:17;22825:25;22820:2;22812:6;22809:14;22806:45;22803:2;;;22854:5;;;;;;22803:2;22891:6;22885:4;22881:17;22870:28;;22927:3;22921:10;22907:24;;22954:2;22946:6;22943:14;22940:2;;;22960:5;;;;;;22940:2;;23021:16;23015:4;23011:27;23004:4;22995:6;22990:3;22986:16;22982:27;22979:60;22976:2;;;23042:5;;;;;22976:2;23107;23086:15;-1:-1:-1;;23082:29:1;23073:39;;23114:4;23069:50;23065:2;23058:62;23077:3;-1:-1:-1;;22428:717:1;:::o;23150:133::-;-1:-1:-1;;;;;;23226:32:1;;23216:43;;23206:2;;23273:1;23270;23263:12

Swarm Source

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