ETH Price: $3,265.32 (+3.00%)
Gas: 1 Gwei

Token

PS (Party Structures)
 

Overview

Max Total Supply

25 Party Structures

Holders

12

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Party Structures
0x3a1e9721d6e961d5431e42a940d8b56857c06298
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Party Structures are the result of merging Party Bones NFTs - you can merge yours here! https://partybones.com/merge Check out the Party Bones collection here: https://opensea.io/collection/partybones

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PartyStructures

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-01
*/

/**
 *Submitted for verification at Etherscan.io on 2021-08-31
*/

/**
 *Submitted for verification at Etherscan.io on 2021-08-18
*/

// SPDX-License-Identifier: MIT

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @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/utils/Strings.sol

pragma solidity ^0.8.0;

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

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

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

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

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



// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

pragma solidity ^0.8.0;


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

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

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

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

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

// 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: @openzeppelin/contracts/utils/Counters.sol

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}



// File: contracts/PartyBones.sol

pragma solidity ^0.8.0;







contract PartyBones is ERC721URIStorage, ERC721Enumerable, Ownable, Pausable {
    using Counters for Counters.Counter;
    Counters.Counter public _mintedTokens;
    uint internal constant MAX_Bones = 10300;
    uint internal ticket_price = 60000000000000000; // 0.06 ETH
    uint private prime_seed;
    
    // No more than 10,300 bones to be sold
    modifier saleIsOpen{
        require(_mintedTokens.current() < MAX_Bones, "Sale end");
        _;
    }
    
    // Modify sale price
    function change_ticket_price(uint new_price) public onlyOwner returns(uint)
    {
        ticket_price = new_price;
        return(new_price);
    }
    
    // View price
    function price() public view returns (uint256) {
        return ticket_price; 
    }
    
    string private baseURI = "";
    
    constructor () payable ERC721("PB", "Party Bones") {}
    
    mapping (uint256 => string) boneNames;
    
    mapping(address => bool) public authorised_contracts;
    
    // Contracts for Party Bone Merging authorised and removed here
    function addAuthorisedAddress(address _address) public onlyOwner {
        authorised_contracts[_address] = true;
    }
    
    function removeAuthorisedAddress(address _address) public onlyOwner {
        authorised_contracts[_address] = false;
    }
    
    // Modifier to only alow merging contracts to interact with this function
    modifier onlyAuthorised()
    {
        require(authorised_contracts[msg.sender]);
        _;
    }
    
    // set seed number for non-serialised minting
    function set_seed_Prime(uint prime_number) onlyOwner public
    {
        prime_seed = prime_number;
    }

    // returns current token minting count
    function check_mintedCount() view public returns (uint256)
    {
        return _mintedTokens.current();
    }
    
    // modify the base URI 
    function change_base_URI(string memory new_base_URI)
        onlyOwner
        public
    {
        baseURI = new_base_URI;
    }
    
    // check token's URI
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
    
    // writing bone names as metadata associated with token
    function set_tokenID_description(uint256 tokenId, string memory nameofbone)
        onlyOwner
        public
    {
        boneNames[tokenId] = nameofbone;
    }
    
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
    
    // pause minting and merging
    function pause() public onlyOwner {
        _pause();
    }
    
    // unpause minting and merging 
    function unpause() public onlyOwner {
        _unpause();
    }
    
    // check name of a bone
    function check_bone_ID_name(uint256 tokenId)
        public
        view
        returns (string memory)
    {
        string memory nameofbone = boneNames[tokenId];
        return nameofbone;
    }
    
    
    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }
    
    // burn Party Bone (I wouldn't!)
    function burn(uint256 tokenid)
        public
        returns (uint256)
    {
        require(msg.sender == ownerOf(tokenid), "This wallet does not own the tokenID!");
        _burn(tokenid);
        return tokenid;
    }
    
    // admin only function for burning in case something messes up
    function burn_admin(uint256 tokenid)
        public
        onlyOwner
        returns (uint256)
    {
        _burn(tokenid);
        return tokenid;
    }
    
    // bones are burned when merged for a limb
    function burn_for_limb(uint256 tokenid)
        public
        onlyAuthorised
        whenNotPaused
        returns (uint256)
    {
        _burn(tokenid);
        return tokenid;
    }
    
    // primary sale function for the admin - for airdrops mainly and creator team
    function mint_primary_admin(address address_, uint256 numberOfTokens)
        public
        onlyOwner
        returns (uint256)
    {
        require(_mintedTokens.current() + numberOfTokens <= MAX_Bones, "This exceeds the maximum number of Party Bones on sale!");
        for(uint256 i = 0; i < numberOfTokens; i++) {
            uint256 newItemId  = (((prime_seed*_mintedTokens.current()^2))) % MAX_Bones + 1;
            _mintedTokens.increment();
            _mint(address_, newItemId);
        }
        
        return _mintedTokens.current();
    }
    
    // mint function for admin - in case something goes wrong 
    
    function mint_admin(address address_, uint256[] memory tokenIds)
        public
        onlyOwner
        returns (uint256[] memory)
    {
        for(uint256 i = 0; i < tokenIds.length; i++) {
            _mint(address_, tokenIds[i]);
        }
        
        return tokenIds;
    }
    
    // mint your Party Bone!
    function createBone(uint256 numberOfTokens)
        public
        payable
        saleIsOpen
        whenNotPaused
    {   
        require(numberOfTokens < 21, "No more than 20 Tokens at one time!");
        require(_mintedTokens.current() + numberOfTokens <= MAX_Bones, "This exceeds the maximum number of Party Bones on sale!");
        require(ticket_price * numberOfTokens <= msg.value, "Please send correct amount");
        require(msg.sender == tx.origin, "Can only mint through a wallet");
        for(uint256 i = 0; i < numberOfTokens; i++) {
            uint256 newItemId  = (((prime_seed*_mintedTokens.current()^2))) % MAX_Bones + 1;
            _mintedTokens.increment();
            _mint(msg.sender, newItemId);
        }
    }
    
    // only owner - check contract balance
    function checkContractBalance()
        public
        onlyOwner
        view
        returns (uint256)
    {
        return address(this).balance;
    }
    
    // only owner - withdraw contract balance to wallet
    function withdraw()
        public
        payable
        onlyOwner
    {
        payable(msg.sender).transfer(address(this).balance);
    }
    
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
    
    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }
    
    // retrieve tokens by owner
    function retrieveTokens(address owner) public view returns (uint256[] memory tokens) {
        uint256 iterator = balanceOf(owner);
        uint256[] memory tokenlist = new uint256[](iterator);
        for (uint256 i = 0; i < iterator; i++){
            tokenlist[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenlist;
    }
    
    // retrieve names of tokens by owner
    function retrieveTokenNames(address owner) external view returns (string[] memory tokens) {
        uint256 iterator = balanceOf(owner);
        string[] memory tokenlist = new string[](iterator);
        for (uint256 i = 0; i < iterator; i++){
            tokenlist[i] = check_bone_ID_name(tokenOfOwnerByIndex(owner, i));
        }
        return tokenlist;
    }
    
}

contract PartyStructures is ERC721URIStorage, ERC721Enumerable, Ownable, Pausable {
    using Counters for Counters.Counter;
    Counters.Counter public _mintedTokens;

    string private baseURI = "";
    
    constructor () payable ERC721("PS", "Party Structures") {}
    
    mapping (uint256 => string) structureNames;
    
    mapping(address => bool) public authorised_contracts;
    
    // Contracts for Party Structure Merging authorised and removed here
    function addAuthorisedAddress(address _address) public onlyOwner {
        authorised_contracts[_address] = true;
    }
    
    function removeAuthorisedAddress(address _address) public onlyOwner {
        authorised_contracts[_address] = false;
    }
    
    // Modifier to only alow merging contracts to interact with this function
    modifier onlyAuthorised()
    {
        require(authorised_contracts[msg.sender]);
        _;
    }

    // returns current token minting count
    function check_mintedCount() view public returns (uint256)
    {
        return _mintedTokens.current();
    }
    
    // modify the base URI 
    function change_base_URI(string memory new_base_URI)
        onlyOwner
        public
    {
        baseURI = new_base_URI;
    }
    
    // check token's URI
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
    
    // writing structure names as metadata associated with token
    function set_tokenID_description(uint256 tokenId, string memory nameofstructure)
        onlyOwner
        public
    {
        structureNames[tokenId] = nameofstructure;
    }
    
    // writing structure names as metadata associated with token
    function set_tokenID_description_merging(uint256 tokenId, string memory nameofstructure)
        internal
    {
        structureNames[tokenId] = nameofstructure;
    }
    
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
    
    // pause minting and merging
    function pause() public onlyOwner {
        _pause();
    }
    
    // unpause minting and merging 
    function unpause() public onlyOwner {
        _unpause();
    }
    
    // check structure name
    function check_structure_ID_name(uint256 tokenId)
        public
        view
        returns (string memory)
    {
        string memory nameofstructure = structureNames[tokenId];
        return nameofstructure;
    }
    
    
    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }
    
    // burn Party Structure (I wouldn't!)
    function burn(uint256 tokenid)
        public
        returns (uint256)
    {
        require(msg.sender == ownerOf(tokenid), "This wallet does not own the tokenID!");
        _burn(tokenid);
        return tokenid;
    }
    
    // admin only function for burning in case something messes up
    function burn_admin(uint256 tokenid)
        public
        onlyOwner
        returns (uint256)
    {
        _burn(tokenid);
        return tokenid;
    }
    
    // structures are burned when merged for a new structure
    function burn_for_limb(uint256 tokenid)
        public
        onlyAuthorised
        whenNotPaused
        returns (uint256)
    {
        _burn(tokenid);
        return tokenid;
    }
    

    // mint function for admin - in case something goes wrong 
    
    function mint_admin(address address_, uint256[] memory tokenIds)
        public
        onlyOwner
        returns (uint256[] memory)
    {
        for(uint256 i = 0; i < tokenIds.length; i++) {
            _mint(address_, tokenIds[i]);
        }
        
        return tokenIds;
    }
    
    // mint your Party Structure!
    function createStructure(address address_, string memory name_of_structure)
        public
        onlyAuthorised
        returns (uint256)
    {   
        _mintedTokens.increment();
        uint256 newItemId  = _mintedTokens.current();
        _mint(address_, newItemId);
        set_tokenID_description_merging(newItemId, name_of_structure);
        return newItemId;
    }
    
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
    
    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }
    
    // retrieve tokens by owner
    function retrieveTokens(address owner) public view returns (uint256[] memory tokens) {
        uint256 iterator = balanceOf(owner);
        uint256[] memory tokenlist = new uint256[](iterator);
        for (uint256 i = 0; i < iterator; i++){
            tokenlist[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenlist;
    }
    
    // retrieve names of tokens by owner
    function retrieveTokenNames(address owner) external view returns (string[] memory tokens) {
        uint256 iterator = balanceOf(owner);
        string[] memory tokenlist = new string[](iterator);
        for (uint256 i = 0; i < iterator; i++){
            tokenlist[i] = check_structure_ID_name(tokenOfOwnerByIndex(owner, i));
        }
        return tokenlist;
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_mintedTokens","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addAuthorisedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorised_contracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"burn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"burn_admin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"burn_for_limb","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"new_base_URI","type":"string"}],"name":"change_base_URI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"check_mintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"check_structure_ID_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"string","name":"name_of_structure","type":"string"}],"name":"createStructure","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mint_admin","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeAuthorisedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"retrieveTokenNames","outputs":[{"internalType":"string[]","name":"tokens","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"retrieveTokens","outputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"nameofstructure","type":"string"}],"name":"set_tokenID_description","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b91600d916200010a565b506040805180820182526002815261505360f01b60208083019182528351808501909452601084526f5061727479205374727563747572657360801b9084015281519192916200006e916000916200010a565b508051620000849060019060208401906200010a565b505050620000a16200009b620000b460201b60201c565b620000b8565b600b805460ff60a01b19169055620001ed565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011890620001b0565b90600052602060002090601f0160209004810192826200013c576000855562000187565b82601f106200015757805160ff191683800117855562000187565b8280016001018555821562000187579182015b82811115620001875782518255916020019190600101906200016a565b506200019592915062000199565b5090565b5b808211156200019557600081556001016200019a565b600181811c90821680620001c557607f821691505b60208210811415620001e757634e487b7160e01b600052602260045260246000fd5b50919050565b61283f80620001fd6000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806364ea60b611610130578063a53723ab116100b8578063d779fadf1161007c578063d779fadf14610493578063d78ac39a146104a6578063e985e9c5146104c9578063ed361bef14610505578063f2fde38b1461051857600080fd5b8063a53723ab1461041a578063ac4ddd9f1461043a578063b88d4fde1461045a578063befb522e1461046d578063c87b56dd1461048057600080fd5b80638da5cb5b116100ff5780638da5cb5b146103d15780639321831d146103e257806395d89b41146103f557806397f5cdcf146103fd578063a22cb4651461040757600080fd5b806364ea60b61461039b57806370a08231146103ae578063715018a6146103c15780638456cb59146103c957600080fd5b80633f4ba83a116101b35780634478659f116101825780634478659f1461033d5780634f6ccce7146103505780635c163edf146103635780635c975abb146103765780636352211e1461038857600080fd5b80633f4ba83a1461030757806342842e0e1461030f57806342966c68146103225780634353a0591461033557600080fd5b806318160ddd116101fa57806318160ddd146102a957806323b872dd146102bb5780632e3992b9146102ce5780632f745c59146102e157806330a318ea146102f457600080fd5b806301ffc9a71461022c57806306fdde0314610254578063081812fc14610269578063095ea7b314610294575b600080fd5b61023f61023a3660046123cd565b61052b565b60405190151581526020015b60405180910390f35b61025c61053c565b60405161024b91906125bc565b61027c610277366004612438565b6105ce565b6040516001600160a01b03909116815260200161024b565b6102a76102a23660046123a4565b610668565b005b6009545b60405190815260200161024b565b6102a76102c93660046121af565b61077e565b6102a76102dc366004612163565b6107af565b6102ad6102ef3660046123a4565b6107fa565b6102ad610302366004612438565b610890565b6102a76108ce565b6102a761031d3660046121af565b610902565b6102ad610330366004612438565b61091d565b6102ad610996565b6102a761034b366004612450565b6109a6565b6102ad61035e366004612438565b6109ef565b6102ad610371366004612438565b610a90565b600b54600160a01b900460ff1661023f565b61027c610396366004612438565b610af9565b6102a76103a9366004612405565b610b70565b6102ad6103bc366004612163565b610bb1565b6102a7610c38565b6102a7610c6c565b600b546001600160a01b031661027c565b6102ad6103f0366004612358565b610c9e565b61025c610cf0565b600c546102ad9081565b6102a761041536600461231e565b610cff565b61042d610428366004612163565b610dc4565b60405161024b9190612517565b61044d610448366004612163565b610e90565b60405161024b9190612578565b6102a76104683660046121ea565b610f46565b61025c61047b366004612438565b610f7e565b61025c61048e366004612438565b611022565b61044d6104a1366004612263565b61102d565b61023f6104b4366004612163565b600f6020526000908152604090205460ff1681565b61023f6104d736600461217d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102a7610513366004612163565b6110b1565b6102a7610526366004612163565b6110ff565b60006105368261119a565b92915050565b60606000805461054b90612747565b80601f016020809104026020016040519081016040528092919081815260200182805461057790612747565b80156105c45780601f10610599576101008083540402835291602001916105c4565b820191906000526020600020905b8154815290600101906020018083116105a757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661064c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061067382610af9565b9050806001600160a01b0316836001600160a01b031614156106e15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610643565b336001600160a01b03821614806106fd57506106fd81336104d7565b61076f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610643565b61077983836111bf565b505050565b610788338261122d565b6107a45760405162461bcd60e51b815260040161064390612656565b610779838383611324565b600b546001600160a01b031633146107d95760405162461bcd60e51b815260040161064390612621565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b600061080583610bb1565b82106108675760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610643565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600b546000906001600160a01b031633146108bd5760405162461bcd60e51b815260040161064390612621565b6108c6826114cf565b50805b919050565b600b546001600160a01b031633146108f85760405162461bcd60e51b815260040161064390612621565b6109006114d8565b565b61077983838360405180602001604052806000815250610f46565b600061092882610af9565b6001600160a01b0316336001600160a01b0316146108bd5760405162461bcd60e51b815260206004820152602560248201527f546869732077616c6c657420646f6573206e6f74206f776e2074686520746f6b604482015264656e49442160d81b6064820152608401610643565b60006109a1600c5490565b905090565b600b546001600160a01b031633146109d05760405162461bcd60e51b815260040161064390612621565b6000828152600e60209081526040909120825161077992840190612006565b60006109fa60095490565b8210610a5d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610643565b60098281548110610a7e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b336000908152600f602052604081205460ff16610aac57600080fd5b600b54600160a01b900460ff16156108bd5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610643565b6000818152600260205260408120546001600160a01b0316806105365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610643565b600b546001600160a01b03163314610b9a5760405162461bcd60e51b815260040161064390612621565b8051610bad90600d906020840190612006565b5050565b60006001600160a01b038216610c1c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610643565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610c625760405162461bcd60e51b815260040161064390612621565b6109006000611575565b600b546001600160a01b03163314610c965760405162461bcd60e51b815260040161064390612621565b6109006115c7565b336000908152600f602052604081205460ff16610cba57600080fd5b610cc8600c80546001019055565b6000610cd3600c5490565b9050610cdf848261164f565b610ce981846109d0565b9392505050565b60606001805461054b90612747565b6001600160a01b038216331415610d585760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610643565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60606000610dd183610bb1565b905060008167ffffffffffffffff811115610dfc57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e2f57816020015b6060815260200190600190039081610e1a5790505b50905060005b82811015610e8857610e4a61047b86836107fa565b828281518110610e6a57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080610e8090612782565b915050610e35565b509392505050565b60606000610e9d83610bb1565b905060008167ffffffffffffffff811115610ec857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610ef1578160200160208202803683370190505b50905060005b82811015610e8857610f0985826107fa565b828281518110610f2957634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610f3e81612782565b915050610ef7565b610f50338361122d565b610f6c5760405162461bcd60e51b815260040161064390612656565b610f788484848461179d565b50505050565b6000818152600e6020526040812080546060929190610f9c90612747565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc890612747565b80156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b5093979650505050505050565b6060610536826117d0565b600b546060906001600160a01b0316331461105a5760405162461bcd60e51b815260040161064390612621565b60005b82518110156110a9576110978484838151811061108a57634e487b7160e01b600052603260045260246000fd5b602002602001015161164f565b806110a181612782565b91505061105d565b509092915050565b600b546001600160a01b031633146110db5760405162461bcd60e51b815260040161064390612621565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b600b546001600160a01b031633146111295760405162461bcd60e51b815260040161064390612621565b6001600160a01b03811661118e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610643565b61119781611575565b50565b60006001600160e01b0319821663780e9d6360e01b1480610536575061053682611942565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906111f482610af9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166112a65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610643565b60006112b183610af9565b9050806001600160a01b0316846001600160a01b031614806112ec5750836001600160a01b03166112e1846105ce565b6001600160a01b0316145b8061131c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661133782610af9565b6001600160a01b03161461139f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610643565b6001600160a01b0382166114015760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610643565b61140c838383611992565b6114176000826111bf565b6001600160a01b0383166000908152600360205260408120805460019290611440908490612704565b90915550506001600160a01b038216600090815260036020526040812080546001929061146e9084906126d8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6111978161199d565b600b54600160a01b900460ff166115285760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610643565b600b805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b54600160a01b900460ff16156116145760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610643565b600b805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115583390565b6001600160a01b0382166116a55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610643565b6000818152600260205260409020546001600160a01b03161561170a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610643565b61171660008383611992565b6001600160a01b038216600090815260036020526040812080546001929061173f9084906126d8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6117a8848484611324565b6117b4848484846119dd565b610f785760405162461bcd60e51b8152600401610643906125cf565b6000818152600260205260409020546060906001600160a01b03166118515760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610643565b6000828152600660205260408120805461186a90612747565b80601f016020809104026020016040519081016040528092919081815260200182805461189690612747565b80156118e35780601f106118b8576101008083540402835291602001916118e3565b820191906000526020600020905b8154815290600101906020018083116118c657829003601f168201915b5050505050905060006118f4611aea565b9050805160001415611907575092915050565b8151156119395780826040516020016119219291906124ab565b60405160208183030381529060405292505050919050565b61131c84611af9565b60006001600160e01b031982166380ac58cd60e01b148061197357506001600160e01b03198216635b5e139f60e01b145b8061053657506301ffc9a760e01b6001600160e01b0319831614610536565b610779838383611bd3565b6119a681611c8b565b600081815260066020526040902080546119bf90612747565b1590506111975760008181526006602052604081206111979161208a565b60006001600160a01b0384163b15611adf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a219033908990889088906004016124da565b602060405180830381600087803b158015611a3b57600080fd5b505af1925050508015611a6b575060408051601f3d908101601f19168201909252611a68918101906123e9565b60015b611ac5573d808015611a99576040519150601f19603f3d011682016040523d82523d6000602084013e611a9e565b606091505b508051611abd5760405162461bcd60e51b8152600401610643906125cf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061131c565b506001949350505050565b6060600d805461054b90612747565b6000818152600260205260409020546060906001600160a01b0316611b785760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610643565b6000611b82611aea565b90506000815111611ba25760405180602001604052806000815250610ce9565b80611bac84611d32565b604051602001611bbd9291906124ab565b6040516020818303038152906040529392505050565b6001600160a01b038316611c2e57611c2981600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b611c51565b816001600160a01b0316836001600160a01b031614611c5157611c518382611e4c565b6001600160a01b038216611c685761077981611ee9565b826001600160a01b0316826001600160a01b031614610779576107798282611fc2565b6000611c9682610af9565b9050611ca481600084611992565b611caf6000836111bf565b6001600160a01b0381166000908152600360205260408120805460019290611cd8908490612704565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b606081611d565750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d805780611d6a81612782565b9150611d799050600a836126f0565b9150611d5a565b60008167ffffffffffffffff811115611da957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611dd3576020820181803683370190505b5090505b841561131c57611de8600183612704565b9150611df5600a8661279d565b611e009060306126d8565b60f81b818381518110611e2357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611e45600a866126f0565b9450611dd7565b60006001611e5984610bb1565b611e639190612704565b600083815260086020526040902054909150808214611eb6576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b600954600090611efb90600190612704565b6000838152600a602052604081205460098054939450909284908110611f3157634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060098381548110611f6057634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600a90915260408082208490558582528120556009805480611fa657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611fcd83610bb1565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b82805461201290612747565b90600052602060002090601f016020900481019282612034576000855561207a565b82601f1061204d57805160ff191683800117855561207a565b8280016001018555821561207a579182015b8281111561207a57825182559160200191906001019061205f565b506120869291506120c0565b5090565b50805461209690612747565b6000825580601f106120a6575050565b601f01602090049060005260206000209081019061119791905b5b8082111561208657600081556001016120c1565b600067ffffffffffffffff8311156120ef576120ef6127dd565b612102601f8401601f19166020016126a7565b905082815283838301111561211657600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146108c957600080fd5b600082601f830112612154578081fd5b610ce9838335602085016120d5565b600060208284031215612174578081fd5b610ce98261212d565b6000806040838503121561218f578081fd5b6121988361212d565b91506121a66020840161212d565b90509250929050565b6000806000606084860312156121c3578081fd5b6121cc8461212d565b92506121da6020850161212d565b9150604084013590509250925092565b600080600080608085870312156121ff578081fd5b6122088561212d565b93506122166020860161212d565b925060408501359150606085013567ffffffffffffffff811115612238578182fd5b8501601f81018713612248578182fd5b612257878235602084016120d5565b91505092959194509250565b60008060408385031215612275578182fd5b61227e8361212d565b915060208084013567ffffffffffffffff8082111561229b578384fd5b818601915086601f8301126122ae578384fd5b8135818111156122c0576122c06127dd565b8060051b91506122d18483016126a7565b8181528481019084860184860187018b10156122eb578788fd5b8795505b8386101561230d5780358352600195909501949186019186016122ef565b508096505050505050509250929050565b60008060408385031215612330578182fd5b6123398361212d565b91506020830135801515811461234d578182fd5b809150509250929050565b6000806040838503121561236a578182fd5b6123738361212d565b9150602083013567ffffffffffffffff81111561238e578182fd5b61239a85828601612144565b9150509250929050565b600080604083850312156123b6578182fd5b6123bf8361212d565b946020939093013593505050565b6000602082840312156123de578081fd5b8135610ce9816127f3565b6000602082840312156123fa578081fd5b8151610ce9816127f3565b600060208284031215612416578081fd5b813567ffffffffffffffff81111561242c578182fd5b61131c84828501612144565b600060208284031215612449578081fd5b5035919050565b60008060408385031215612462578182fd5b82359150602083013567ffffffffffffffff81111561238e578182fd5b6000815180845261249781602086016020860161271b565b601f01601f19169290920160200192915050565b600083516124bd81846020880161271b565b8351908301906124d181836020880161271b565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061250d9083018461247f565b9695505050505050565b6000602080830181845280855180835260408601915060408160051b8701019250838701855b8281101561256b57603f1988860301845261255985835161247f565b9450928501929085019060010161253d565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156125b057835183529284019291840191600101612594565b50909695505050505050565b602081526000610ce9602083018461247f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156126d0576126d06127dd565b604052919050565b600082198211156126eb576126eb6127b1565b500190565b6000826126ff576126ff6127c7565b500490565b600082821015612716576127166127b1565b500390565b60005b8381101561273657818101518382015260200161271e565b83811115610f785750506000910152565b600181811c9082168061275b57607f821691505b6020821081141561277c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612796576127966127b1565b5060010190565b6000826127ac576127ac6127c7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461119757600080fdfea26469706673582212200003593fac6aca5dae85851ca37688af1339aa24048c06feb4725ef16d3d4e1f64736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c806364ea60b611610130578063a53723ab116100b8578063d779fadf1161007c578063d779fadf14610493578063d78ac39a146104a6578063e985e9c5146104c9578063ed361bef14610505578063f2fde38b1461051857600080fd5b8063a53723ab1461041a578063ac4ddd9f1461043a578063b88d4fde1461045a578063befb522e1461046d578063c87b56dd1461048057600080fd5b80638da5cb5b116100ff5780638da5cb5b146103d15780639321831d146103e257806395d89b41146103f557806397f5cdcf146103fd578063a22cb4651461040757600080fd5b806364ea60b61461039b57806370a08231146103ae578063715018a6146103c15780638456cb59146103c957600080fd5b80633f4ba83a116101b35780634478659f116101825780634478659f1461033d5780634f6ccce7146103505780635c163edf146103635780635c975abb146103765780636352211e1461038857600080fd5b80633f4ba83a1461030757806342842e0e1461030f57806342966c68146103225780634353a0591461033557600080fd5b806318160ddd116101fa57806318160ddd146102a957806323b872dd146102bb5780632e3992b9146102ce5780632f745c59146102e157806330a318ea146102f457600080fd5b806301ffc9a71461022c57806306fdde0314610254578063081812fc14610269578063095ea7b314610294575b600080fd5b61023f61023a3660046123cd565b61052b565b60405190151581526020015b60405180910390f35b61025c61053c565b60405161024b91906125bc565b61027c610277366004612438565b6105ce565b6040516001600160a01b03909116815260200161024b565b6102a76102a23660046123a4565b610668565b005b6009545b60405190815260200161024b565b6102a76102c93660046121af565b61077e565b6102a76102dc366004612163565b6107af565b6102ad6102ef3660046123a4565b6107fa565b6102ad610302366004612438565b610890565b6102a76108ce565b6102a761031d3660046121af565b610902565b6102ad610330366004612438565b61091d565b6102ad610996565b6102a761034b366004612450565b6109a6565b6102ad61035e366004612438565b6109ef565b6102ad610371366004612438565b610a90565b600b54600160a01b900460ff1661023f565b61027c610396366004612438565b610af9565b6102a76103a9366004612405565b610b70565b6102ad6103bc366004612163565b610bb1565b6102a7610c38565b6102a7610c6c565b600b546001600160a01b031661027c565b6102ad6103f0366004612358565b610c9e565b61025c610cf0565b600c546102ad9081565b6102a761041536600461231e565b610cff565b61042d610428366004612163565b610dc4565b60405161024b9190612517565b61044d610448366004612163565b610e90565b60405161024b9190612578565b6102a76104683660046121ea565b610f46565b61025c61047b366004612438565b610f7e565b61025c61048e366004612438565b611022565b61044d6104a1366004612263565b61102d565b61023f6104b4366004612163565b600f6020526000908152604090205460ff1681565b61023f6104d736600461217d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102a7610513366004612163565b6110b1565b6102a7610526366004612163565b6110ff565b60006105368261119a565b92915050565b60606000805461054b90612747565b80601f016020809104026020016040519081016040528092919081815260200182805461057790612747565b80156105c45780601f10610599576101008083540402835291602001916105c4565b820191906000526020600020905b8154815290600101906020018083116105a757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661064c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061067382610af9565b9050806001600160a01b0316836001600160a01b031614156106e15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610643565b336001600160a01b03821614806106fd57506106fd81336104d7565b61076f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610643565b61077983836111bf565b505050565b610788338261122d565b6107a45760405162461bcd60e51b815260040161064390612656565b610779838383611324565b600b546001600160a01b031633146107d95760405162461bcd60e51b815260040161064390612621565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b600061080583610bb1565b82106108675760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610643565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600b546000906001600160a01b031633146108bd5760405162461bcd60e51b815260040161064390612621565b6108c6826114cf565b50805b919050565b600b546001600160a01b031633146108f85760405162461bcd60e51b815260040161064390612621565b6109006114d8565b565b61077983838360405180602001604052806000815250610f46565b600061092882610af9565b6001600160a01b0316336001600160a01b0316146108bd5760405162461bcd60e51b815260206004820152602560248201527f546869732077616c6c657420646f6573206e6f74206f776e2074686520746f6b604482015264656e49442160d81b6064820152608401610643565b60006109a1600c5490565b905090565b600b546001600160a01b031633146109d05760405162461bcd60e51b815260040161064390612621565b6000828152600e60209081526040909120825161077992840190612006565b60006109fa60095490565b8210610a5d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610643565b60098281548110610a7e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b336000908152600f602052604081205460ff16610aac57600080fd5b600b54600160a01b900460ff16156108bd5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610643565b6000818152600260205260408120546001600160a01b0316806105365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610643565b600b546001600160a01b03163314610b9a5760405162461bcd60e51b815260040161064390612621565b8051610bad90600d906020840190612006565b5050565b60006001600160a01b038216610c1c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610643565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610c625760405162461bcd60e51b815260040161064390612621565b6109006000611575565b600b546001600160a01b03163314610c965760405162461bcd60e51b815260040161064390612621565b6109006115c7565b336000908152600f602052604081205460ff16610cba57600080fd5b610cc8600c80546001019055565b6000610cd3600c5490565b9050610cdf848261164f565b610ce981846109d0565b9392505050565b60606001805461054b90612747565b6001600160a01b038216331415610d585760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610643565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60606000610dd183610bb1565b905060008167ffffffffffffffff811115610dfc57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e2f57816020015b6060815260200190600190039081610e1a5790505b50905060005b82811015610e8857610e4a61047b86836107fa565b828281518110610e6a57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080610e8090612782565b915050610e35565b509392505050565b60606000610e9d83610bb1565b905060008167ffffffffffffffff811115610ec857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610ef1578160200160208202803683370190505b50905060005b82811015610e8857610f0985826107fa565b828281518110610f2957634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610f3e81612782565b915050610ef7565b610f50338361122d565b610f6c5760405162461bcd60e51b815260040161064390612656565b610f788484848461179d565b50505050565b6000818152600e6020526040812080546060929190610f9c90612747565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc890612747565b80156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b5093979650505050505050565b6060610536826117d0565b600b546060906001600160a01b0316331461105a5760405162461bcd60e51b815260040161064390612621565b60005b82518110156110a9576110978484838151811061108a57634e487b7160e01b600052603260045260246000fd5b602002602001015161164f565b806110a181612782565b91505061105d565b509092915050565b600b546001600160a01b031633146110db5760405162461bcd60e51b815260040161064390612621565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b600b546001600160a01b031633146111295760405162461bcd60e51b815260040161064390612621565b6001600160a01b03811661118e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610643565b61119781611575565b50565b60006001600160e01b0319821663780e9d6360e01b1480610536575061053682611942565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906111f482610af9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166112a65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610643565b60006112b183610af9565b9050806001600160a01b0316846001600160a01b031614806112ec5750836001600160a01b03166112e1846105ce565b6001600160a01b0316145b8061131c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661133782610af9565b6001600160a01b03161461139f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610643565b6001600160a01b0382166114015760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610643565b61140c838383611992565b6114176000826111bf565b6001600160a01b0383166000908152600360205260408120805460019290611440908490612704565b90915550506001600160a01b038216600090815260036020526040812080546001929061146e9084906126d8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6111978161199d565b600b54600160a01b900460ff166115285760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610643565b600b805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b54600160a01b900460ff16156116145760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610643565b600b805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115583390565b6001600160a01b0382166116a55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610643565b6000818152600260205260409020546001600160a01b03161561170a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610643565b61171660008383611992565b6001600160a01b038216600090815260036020526040812080546001929061173f9084906126d8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6117a8848484611324565b6117b4848484846119dd565b610f785760405162461bcd60e51b8152600401610643906125cf565b6000818152600260205260409020546060906001600160a01b03166118515760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610643565b6000828152600660205260408120805461186a90612747565b80601f016020809104026020016040519081016040528092919081815260200182805461189690612747565b80156118e35780601f106118b8576101008083540402835291602001916118e3565b820191906000526020600020905b8154815290600101906020018083116118c657829003601f168201915b5050505050905060006118f4611aea565b9050805160001415611907575092915050565b8151156119395780826040516020016119219291906124ab565b60405160208183030381529060405292505050919050565b61131c84611af9565b60006001600160e01b031982166380ac58cd60e01b148061197357506001600160e01b03198216635b5e139f60e01b145b8061053657506301ffc9a760e01b6001600160e01b0319831614610536565b610779838383611bd3565b6119a681611c8b565b600081815260066020526040902080546119bf90612747565b1590506111975760008181526006602052604081206111979161208a565b60006001600160a01b0384163b15611adf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a219033908990889088906004016124da565b602060405180830381600087803b158015611a3b57600080fd5b505af1925050508015611a6b575060408051601f3d908101601f19168201909252611a68918101906123e9565b60015b611ac5573d808015611a99576040519150601f19603f3d011682016040523d82523d6000602084013e611a9e565b606091505b508051611abd5760405162461bcd60e51b8152600401610643906125cf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061131c565b506001949350505050565b6060600d805461054b90612747565b6000818152600260205260409020546060906001600160a01b0316611b785760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610643565b6000611b82611aea565b90506000815111611ba25760405180602001604052806000815250610ce9565b80611bac84611d32565b604051602001611bbd9291906124ab565b6040516020818303038152906040529392505050565b6001600160a01b038316611c2e57611c2981600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b611c51565b816001600160a01b0316836001600160a01b031614611c5157611c518382611e4c565b6001600160a01b038216611c685761077981611ee9565b826001600160a01b0316826001600160a01b031614610779576107798282611fc2565b6000611c9682610af9565b9050611ca481600084611992565b611caf6000836111bf565b6001600160a01b0381166000908152600360205260408120805460019290611cd8908490612704565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b606081611d565750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d805780611d6a81612782565b9150611d799050600a836126f0565b9150611d5a565b60008167ffffffffffffffff811115611da957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611dd3576020820181803683370190505b5090505b841561131c57611de8600183612704565b9150611df5600a8661279d565b611e009060306126d8565b60f81b818381518110611e2357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611e45600a866126f0565b9450611dd7565b60006001611e5984610bb1565b611e639190612704565b600083815260086020526040902054909150808214611eb6576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b600954600090611efb90600190612704565b6000838152600a602052604081205460098054939450909284908110611f3157634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060098381548110611f6057634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600a90915260408082208490558582528120556009805480611fa657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611fcd83610bb1565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b82805461201290612747565b90600052602060002090601f016020900481019282612034576000855561207a565b82601f1061204d57805160ff191683800117855561207a565b8280016001018555821561207a579182015b8281111561207a57825182559160200191906001019061205f565b506120869291506120c0565b5090565b50805461209690612747565b6000825580601f106120a6575050565b601f01602090049060005260206000209081019061119791905b5b8082111561208657600081556001016120c1565b600067ffffffffffffffff8311156120ef576120ef6127dd565b612102601f8401601f19166020016126a7565b905082815283838301111561211657600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146108c957600080fd5b600082601f830112612154578081fd5b610ce9838335602085016120d5565b600060208284031215612174578081fd5b610ce98261212d565b6000806040838503121561218f578081fd5b6121988361212d565b91506121a66020840161212d565b90509250929050565b6000806000606084860312156121c3578081fd5b6121cc8461212d565b92506121da6020850161212d565b9150604084013590509250925092565b600080600080608085870312156121ff578081fd5b6122088561212d565b93506122166020860161212d565b925060408501359150606085013567ffffffffffffffff811115612238578182fd5b8501601f81018713612248578182fd5b612257878235602084016120d5565b91505092959194509250565b60008060408385031215612275578182fd5b61227e8361212d565b915060208084013567ffffffffffffffff8082111561229b578384fd5b818601915086601f8301126122ae578384fd5b8135818111156122c0576122c06127dd565b8060051b91506122d18483016126a7565b8181528481019084860184860187018b10156122eb578788fd5b8795505b8386101561230d5780358352600195909501949186019186016122ef565b508096505050505050509250929050565b60008060408385031215612330578182fd5b6123398361212d565b91506020830135801515811461234d578182fd5b809150509250929050565b6000806040838503121561236a578182fd5b6123738361212d565b9150602083013567ffffffffffffffff81111561238e578182fd5b61239a85828601612144565b9150509250929050565b600080604083850312156123b6578182fd5b6123bf8361212d565b946020939093013593505050565b6000602082840312156123de578081fd5b8135610ce9816127f3565b6000602082840312156123fa578081fd5b8151610ce9816127f3565b600060208284031215612416578081fd5b813567ffffffffffffffff81111561242c578182fd5b61131c84828501612144565b600060208284031215612449578081fd5b5035919050565b60008060408385031215612462578182fd5b82359150602083013567ffffffffffffffff81111561238e578182fd5b6000815180845261249781602086016020860161271b565b601f01601f19169290920160200192915050565b600083516124bd81846020880161271b565b8351908301906124d181836020880161271b565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061250d9083018461247f565b9695505050505050565b6000602080830181845280855180835260408601915060408160051b8701019250838701855b8281101561256b57603f1988860301845261255985835161247f565b9450928501929085019060010161253d565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156125b057835183529284019291840191600101612594565b50909695505050505050565b602081526000610ce9602083018461247f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156126d0576126d06127dd565b604052919050565b600082198211156126eb576126eb6127b1565b500190565b6000826126ff576126ff6127c7565b500490565b600082821015612716576127166127b1565b500390565b60005b8381101561273657818101518382015260200161271e565b83811115610f785750506000910152565b600181811c9082168061275b57607f821691505b6020821081141561277c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612796576127966127b1565b5060010190565b6000826127ac576127ac6127c7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461119757600080fdfea26469706673582212200003593fac6aca5dae85851ca37688af1339aa24048c06feb4725ef16d3d4e1f64736f6c63430008040033

Deployed Bytecode Sourcemap

56241:5624:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60605:212;;;;;;:::i;:::-;;:::i;:::-;;;9034:14:1;;9027:22;9009:41;;8997:2;8982:18;60605:212:0;;;;;;;;21519:100;;;:::i;:::-;;;;;;;:::i;23078:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6882:32:1;;;6864:51;;6852:2;6837:18;23078:221:0;6819:102:1;22601:411:0;;;;;;:::i;:::-;;:::i;:::-;;41190:113;41278:10;:17;41190:113;;;18156:25:1;;;18144:2;18129:18;41190:113:0;18111:76:1;23968:339:0;;;;;;:::i;:::-;;:::i;56855:125::-;;;;;;:::i;:::-;;:::i;40858:256::-;;;;;;:::i;:::-;;:::i;59352:162::-;;;;;;:::i;:::-;;:::i;58525:65::-;;;:::i;24378:185::-;;;;;;:::i;:::-;;:::i;59044:228::-;;;;;;:::i;:::-;;:::i;57226:113::-;;;:::i;57826:181::-;;;;;;:::i;:::-;;:::i;41380:233::-;;;;;;:::i;:::-;;:::i;59588:193::-;;;;;;:::i;:::-;;:::i;37451:86::-;37522:7;;-1:-1:-1;;;37522:7:0;;;;37451:86;;21213:239;;;;;;:::i;:::-;;:::i;57380:134::-;;;;;;:::i;:::-;;:::i;20943:208::-;;;;;;:::i;:::-;;:::i;34346:94::-;;;:::i;58415:61::-;;;:::i;33695:87::-;33768:6;;-1:-1:-1;;;;;33768:6:0;33695:87;;60207:386;;;;;;:::i;:::-;;:::i;21688:104::-;;;:::i;56372:37::-;;;;;;;23371:295;;;;;;:::i;:::-;;:::i;61480:376::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;61078:348::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24634:328::-;;;;;;:::i;:::-;;:::i;58631:225::-;;;;;;:::i;:::-;;:::i;57552:196::-;;;;;;:::i;:::-;;:::i;59865:295::-;;;;;;:::i;:::-;;:::i;56583:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23737:164;;;;;;:::i;:::-;-1:-1:-1;;;;;23858:25:0;;;23834:4;23858:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23737:164;56722:121;;;;;;:::i;:::-;;:::i;34595:192::-;;;;;;:::i;:::-;;:::i;60605:212::-;60744:4;60773:36;60797:11;60773:23;:36::i;:::-;60766:43;60605:212;-1:-1:-1;;60605:212:0:o;21519:100::-;21573:13;21606:5;21599:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21519:100;:::o;23078:221::-;23154:7;26561:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26561:16:0;23174:73;;;;-1:-1:-1;;;23174:73:0;;15379:2:1;23174:73:0;;;15361:21:1;15418:2;15398:18;;;15391:30;15457:34;15437:18;;;15430:62;-1:-1:-1;;;15508:18:1;;;15501:42;15560:19;;23174:73:0;;;;;;;;;-1:-1:-1;23267:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23267:24:0;;23078:221::o;22601:411::-;22682:13;22698:23;22713:7;22698:14;:23::i;:::-;22682:39;;22746:5;-1:-1:-1;;;;;22740:11:0;:2;-1:-1:-1;;;;;22740:11:0;;;22732:57;;;;-1:-1:-1;;;22732:57:0;;16979:2:1;22732:57:0;;;16961:21:1;17018:2;16998:18;;;16991:30;17057:34;17037:18;;;17030:62;-1:-1:-1;;;17108:18:1;;;17101:31;17149:19;;22732:57:0;16951:223:1;22732:57:0;877:10;-1:-1:-1;;;;;22824:21:0;;;;:62;;-1:-1:-1;22849:37:0;22866:5;877:10;23737:164;:::i;22849:37::-;22802:168;;;;-1:-1:-1;;;22802:168:0;;13354:2:1;22802:168:0;;;13336:21:1;13393:2;13373:18;;;13366:30;13432:34;13412:18;;;13405:62;13503:26;13483:18;;;13476:54;13547:19;;22802:168:0;13326:246:1;22802:168:0;22983:21;22992:2;22996:7;22983:8;:21::i;:::-;22601:411;;;:::o;23968:339::-;24163:41;877:10;24196:7;24163:18;:41::i;:::-;24155:103;;;;-1:-1:-1;;;24155:103:0;;;;;;;:::i;:::-;24271:28;24281:4;24287:2;24291:7;24271:9;:28::i;56855:125::-;33768:6;;-1:-1:-1;;;;;33768:6:0;877:10;33915:23;33907:68;;;;-1:-1:-1;;;33907:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56934:30:0::1;56967:5;56934:30:::0;;;:20:::1;:30;::::0;;;;:38;;-1:-1:-1;;56934:38:0::1;::::0;;56855:125::o;40858:256::-;40955:7;40991:23;41008:5;40991:16;:23::i;:::-;40983:5;:31;40975:87;;;;-1:-1:-1;;;40975:87:0;;9836:2:1;40975:87:0;;;9818:21:1;9875:2;9855:18;;;9848:30;9914:34;9894:18;;;9887:62;-1:-1:-1;;;9965:18:1;;;9958:41;10016:19;;40975:87:0;9808:233:1;40975:87:0;-1:-1:-1;;;;;;41080:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40858:256::o;59352:162::-;33768:6;;59442:7;;-1:-1:-1;;;;;33768:6:0;877:10;33915:23;33907:68;;;;-1:-1:-1;;;33907:68:0;;;;;;;:::i;:::-;59467:14:::1;59473:7;59467:5;:14::i;:::-;-1:-1:-1::0;59499:7:0;33986:1:::1;59352:162:::0;;;:::o;58525:65::-;33768:6;;-1:-1:-1;;;;;33768:6:0;877:10;33915:23;33907:68;;;;-1:-1:-1;;;33907:68:0;;;;;;;:::i;:::-;58572:10:::1;:8;:10::i;:::-;58525:65::o:0;24378:185::-;24516:39;24533:4;24539:2;24543:7;24516:39;;;;;;;;;;;;:16;:39::i;59044:228::-;59109:7;59156:16;59164:7;59156;:16::i;:::-;-1:-1:-1;;;;;59142:30:0;:10;-1:-1:-1;;;;;59142:30:0;;59134:80;;;;-1:-1:-1;;;59134:80:0;;10248:2:1;59134:80:0;;;10230:21:1;10287:2;10267:18;;;10260:30;10326:34;10306:18;;;10299:62;-1:-1:-1;;;10377:18:1;;;10370:35;10422:19;;59134:80:0;10220:227:1;57226:113:0;57276:7;57308:23;:13;35880:14;;35788:114;57308:23;57301:30;;57226:113;:::o;57826:181::-;33768:6;;-1:-1:-1;;;;;33768:6:0;877:10;33915:23;33907:68;;;;-1:-1:-1;;;33907:68:0;;;;;;;:::i;:::-;57958:23:::1;::::0;;;:14:::1;:23;::::0;;;;;;;:41;;::::1;::::0;;::::1;::::0;::::1;:::i;41380:233::-:0;41455:7;41491:30;41278:10;:17;;41190:113;41491:30;41483:5;:38;41475:95;;;;-1:-1:-1;;;41475:95:0;;17799:2:1;41475:95:0;;;17781:21:1;17838:2;17818:18;;;17811:30;17877:34;17857:18;;;17850:62;-1:-1:-1;;;17928:18:1;;;17921:42;17980:19;;41475:95:0;17771:234:1;41475:95:0;41588:10;41599:5;41588:17;;;;;;-1:-1:-1;;;41588:17:0;;;;;;;;;;;;;;;;;41581:24;;41380:233;;;:::o;59588:193::-;57142:10;59709:7;57121:32;;;:20;:32;;;;;;;;57113:41;;;;;;37522:7;;-1:-1:-1;;;37522:7:0;;;;37776:9:::1;37768:38;;;::::0;-1:-1:-1;;;37768:38:0;;13009:2:1;37768:38:0::1;::::0;::::1;12991:21:1::0;13048:2;13028:18;;;13021:30;-1:-1:-1;;;13067:18:1;;;13060:46;13123:18;;37768:38:0::1;12981:166:1::0;21213:239:0;21285:7;21321:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21321:16:0;21356:19;21348:73;;;;-1:-1:-1;;;21348:73:0;;14190:2:1;21348:73:0;;;14172:21:1;14229:2;14209:18;;;14202:30;14268:34;14248:18;;;14241:62;-1:-1:-1;;;14319:18:1;;;14312:39;14368:19;;21348:73:0;14162:231:1;57380:134:0;33768:6;;-1:-1:-1;;;;;33768:6:0;877:10;33915:23;33907:68;;;;-1:-1:-1;;;33907:68:0;;;;;;;:::i;:::-;57484:22;;::::1;::::0;:7:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;57380:134:::0;:::o;20943:208::-;21015:7;-1:-1:-1;;;;;21043:19:0;;21035:74;;;;-1:-1:-1;;;21035:74:0;;13779:2:1;21035:74:0;;;13761:21:1;13818:2;13798:18;;;13791:30;13857:34;13837:18;;;13830:62;-1:-1:-1;;;13908:18:1;;;13901:40;13958:19;;21035:74:0;13751:232:1;21035:74:0;-1:-1:-1;;;;;;21127:16:0;;;;;:9;:16;;;;;;;20943:208::o;34346:94::-;33768:6;;-1:-1:-1;;;;;33768:6:0;877:10;33915:23;33907:68;;;;-1:-1:-1;;;33907:68:0;;;;;;;:::i;:::-;34411:21:::1;34429:1;34411:9;:21::i;58415:61::-:0;33768:6;;-1:-1:-1;;;;;33768:6:0;877:10;33915:23;33907:68;;;;-1:-1:-1;;;33907:68:0;;;;;;;:::i;:::-;58460:8:::1;:6;:8::i;60207:386::-:0;57142:10;60341:7;57121:32;;;:20;:32;;;;;;;;57113:41;;;;;;60369:25:::1;:13;35999:19:::0;;36017:1;35999:19;;;35910:127;60369:25:::1;60405:17;60426:23;:13;35880:14:::0;;35788:114;60426:23:::1;60405:44;;60460:26;60466:8;60476:9;60460:5;:26::i;:::-;60497:61;60529:9;60540:17;60497:31;:61::i;:::-;60576:9:::0;60207:386;-1:-1:-1;;;60207:386:0:o;21688:104::-;21744:13;21777:7;21770:14;;;;;:::i;23371:295::-;-1:-1:-1;;;;;23474:24:0;;877:10;23474:24;;23466:62;;;;-1:-1:-1;;;23466:62:0;;12242:2:1;23466:62:0;;;12224:21:1;12281:2;12261:18;;;12254:30;12320:27;12300:18;;;12293:55;12365:18;;23466:62:0;12214:175:1;23466:62:0;877:10;23541:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23541:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23541:53:0;;;;;;;;;;23610:48;;9009:41:1;;;23541:42:0;;877:10;23610:48;;8982:18:1;23610:48:0;;;;;;;23371:295;;:::o;61480:376::-;61546:22;61581:16;61600;61610:5;61600:9;:16::i;:::-;61581:35;;61627:25;61668:8;61655:22;;;;;;-1:-1:-1;;;61655:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61627:50;;61693:9;61688:134;61712:8;61708:1;:12;61688:134;;;61756:54;61780:29;61800:5;61807:1;61780:19;:29::i;61756:54::-;61741:9;61751:1;61741:12;;;;;;-1:-1:-1;;;61741:12:0;;;;;;;;;;;;;;:69;;;;61722:3;;;;;:::i;:::-;;;;61688:134;;;-1:-1:-1;61839:9:0;61480:376;-1:-1:-1;;;61480:376:0:o;61078:348::-;61138:23;61174:16;61193;61203:5;61193:9;:16::i;:::-;61174:35;;61220:26;61263:8;61249:23;;;;;;-1:-1:-1;;;61249:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61249:23:0;;61220:52;;61288:9;61283:109;61307:8;61303:1;:12;61283:109;;;61351:29;61371:5;61378:1;61351:19;:29::i;:::-;61336:9;61346:1;61336:12;;;;;;-1:-1:-1;;;61336:12:0;;;;;;;;;;;;;;;;;;:44;61317:3;;;;:::i;:::-;;;;61283:109;;24634:328;24809:41;877:10;24842:7;24809:18;:41::i;:::-;24801:103;;;;-1:-1:-1;;;24801:103:0;;;;;;;:::i;:::-;24915:39;24929:4;24935:2;24939:7;24948:5;24915:13;:39::i;:::-;24634:328;;;;:::o;58631:225::-;58760:29;58792:23;;;:14;:23;;;;;58760:55;;58729:13;;58760:29;58792:23;58760:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58760:55:0;;58631:225;-1:-1:-1;;;;;;;58631:225:0:o;57552:196::-;57679:13;57717:23;57732:7;57717:14;:23::i;59865:295::-;33768:6;;59983:16;;-1:-1:-1;;;;;33768:6:0;877:10;33915:23;33907:68;;;;-1:-1:-1;;;33907:68:0;;;;;;;:::i;:::-;60021:9:::1;60017:100;60040:8;:15;60036:1;:19;60017:100;;;60077:28;60083:8;60093;60102:1;60093:11;;;;;;-1:-1:-1::0;;;60093:11:0::1;;;;;;;;;;;;;;;60077:5;:28::i;:::-;60057:3:::0;::::1;::::0;::::1;:::i;:::-;;;;60017:100;;;-1:-1:-1::0;60144:8:0;;59865:295;-1:-1:-1;;59865:295:0:o;56722:121::-;33768:6;;-1:-1:-1;;;;;33768:6:0;877:10;33915:23;33907:68;;;;-1:-1:-1;;;33907:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56798:30:0::1;;::::0;;;:20:::1;:30;::::0;;;;:37;;-1:-1:-1;;56798:37:0::1;56831:4;56798:37;::::0;;56722:121::o;34595:192::-;33768:6;;-1:-1:-1;;;;;33768:6:0;877:10;33915:23;33907:68;;;;-1:-1:-1;;;33907:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34684:22:0;::::1;34676:73;;;::::0;-1:-1:-1;;;34676:73:0;;11073:2:1;34676:73:0::1;::::0;::::1;11055:21:1::0;11112:2;11092:18;;;11085:30;11151:34;11131:18;;;11124:62;-1:-1:-1;;;11202:18:1;;;11195:36;11248:19;;34676:73:0::1;11045:228:1::0;34676:73:0::1;34760:19;34770:8;34760:9;:19::i;:::-;34595:192:::0;:::o;40550:224::-;40652:4;-1:-1:-1;;;;;;40676:50:0;;-1:-1:-1;;;40676:50:0;;:90;;;40730:36;40754:11;40730:23;:36::i;30454:174::-;30529:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30529:29:0;-1:-1:-1;;;;;30529:29:0;;;;;;;;:24;;30583:23;30529:24;30583:14;:23::i;:::-;-1:-1:-1;;;;;30574:46:0;;;;;;;;;;;30454:174;;:::o;26766:348::-;26859:4;26561:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26561:16:0;26876:73;;;;-1:-1:-1;;;26876:73:0;;12596:2:1;26876:73:0;;;12578:21:1;12635:2;12615:18;;;12608:30;12674:34;12654:18;;;12647:62;-1:-1:-1;;;12725:18:1;;;12718:42;12777:19;;26876:73:0;12568:234:1;26876:73:0;26960:13;26976:23;26991:7;26976:14;:23::i;:::-;26960:39;;27029:5;-1:-1:-1;;;;;27018:16:0;:7;-1:-1:-1;;;;;27018:16:0;;:51;;;;27062:7;-1:-1:-1;;;;;27038:31:0;:20;27050:7;27038:11;:20::i;:::-;-1:-1:-1;;;;;27038:31:0;;27018:51;:87;;;-1:-1:-1;;;;;;23858:25:0;;;23834:4;23858:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27073:32;27010:96;26766:348;-1:-1:-1;;;;26766:348:0:o;29758:578::-;29917:4;-1:-1:-1;;;;;29890:31:0;:23;29905:7;29890:14;:23::i;:::-;-1:-1:-1;;;;;29890:31:0;;29882:85;;;;-1:-1:-1;;;29882:85:0;;16153:2:1;29882:85:0;;;16135:21:1;16192:2;16172:18;;;16165:30;16231:34;16211:18;;;16204:62;-1:-1:-1;;;16282:18:1;;;16275:39;16331:19;;29882:85:0;16125:231:1;29882:85:0;-1:-1:-1;;;;;29986:16:0;;29978:65;;;;-1:-1:-1;;;29978:65:0;;11837:2:1;29978:65:0;;;11819:21:1;11876:2;11856:18;;;11849:30;11915:34;11895:18;;;11888:62;-1:-1:-1;;;11966:18:1;;;11959:34;12010:19;;29978:65:0;11809:226:1;29978:65:0;30056:39;30077:4;30083:2;30087:7;30056:20;:39::i;:::-;30160:29;30177:1;30181:7;30160:8;:29::i;:::-;-1:-1:-1;;;;;30202:15:0;;;;;;:9;:15;;;;;:20;;30221:1;;30202:15;:20;;30221:1;;30202:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30233:13:0;;;;;;:9;:13;;;;;:18;;30250:1;;30233:13;:18;;30250:1;;30233:18;:::i;:::-;;;;-1:-1:-1;;30262:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30262:21:0;-1:-1:-1;;;;;30262:21:0;;;;;;;;;30301:27;;30262:16;;30301:27;;;;;;;29758:578;;;:::o;58874:115::-;58961:20;58973:7;58961:11;:20::i;38510:120::-;37522:7;;-1:-1:-1;;;37522:7:0;;;;38046:41;;;;-1:-1:-1;;;38046:41:0;;9487:2:1;38046:41:0;;;9469:21:1;9526:2;9506:18;;;9499:30;-1:-1:-1;;;9545:18:1;;;9538:50;9605:18;;38046:41:0;9459:170:1;38046:41:0;38569:7:::1;:15:::0;;-1:-1:-1;;;;38569:15:0::1;::::0;;38600:22:::1;877:10:::0;38609:12:::1;38600:22;::::0;-1:-1:-1;;;;;6882:32:1;;;6864:51;;6852:2;6837:18;38600:22:0::1;;;;;;;38510:120::o:0;34795:173::-;34870:6;;;-1:-1:-1;;;;;34887:17:0;;;-1:-1:-1;;;;;;34887:17:0;;;;;;;34920:40;;34870:6;;;34887:17;34870:6;;34920:40;;34851:16;;34920:40;34795:173;;:::o;38251:118::-;37522:7;;-1:-1:-1;;;37522:7:0;;;;37776:9;37768:38;;;;-1:-1:-1;;;37768:38:0;;13009:2:1;37768:38:0;;;12991:21:1;13048:2;13028:18;;;13021:30;-1:-1:-1;;;13067:18:1;;;13060:46;13123:18;;37768:38:0;12981:166:1;37768:38:0;38311:7:::1;:14:::0;;-1:-1:-1;;;;38311:14:0::1;-1:-1:-1::0;;;38311:14:0::1;::::0;;38341:20:::1;38348:12;877:10:::0;;797:98;28450:382;-1:-1:-1;;;;;28530:16:0;;28522:61;;;;-1:-1:-1;;;28522:61:0;;14600:2:1;28522:61:0;;;14582:21:1;;;14619:18;;;14612:30;14678:34;14658:18;;;14651:62;14730:18;;28522:61:0;14572:182:1;28522:61:0;26537:4;26561:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26561:16:0;:30;28594:58;;;;-1:-1:-1;;;28594:58:0;;11480:2:1;28594:58:0;;;11462:21:1;11519:2;11499:18;;;11492:30;11558;11538:18;;;11531:58;11606:18;;28594:58:0;11452:178:1;28594:58:0;28665:45;28694:1;28698:2;28702:7;28665:20;:45::i;:::-;-1:-1:-1;;;;;28723:13:0;;;;;;:9;:13;;;;;:18;;28740:1;;28723:13;:18;;28740:1;;28723:18;:::i;:::-;;;;-1:-1:-1;;28752:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28752:21:0;-1:-1:-1;;;;;28752:21:0;;;;;;;;28791:33;;28752:16;;;28791:33;;28752:16;;28791:33;28450:382;;:::o;25844:315::-;26001:28;26011:4;26017:2;26021:7;26001:9;:28::i;:::-;26048:48;26071:4;26077:2;26081:7;26090:5;26048:22;:48::i;:::-;26040:111;;;;-1:-1:-1;;;26040:111:0;;;;;;;:::i;47124:679::-;26537:4;26561:16;;;:7;:16;;;;;;47197:13;;-1:-1:-1;;;;;26561:16:0;47223:78;;;;-1:-1:-1;;;47223:78:0;;14961:2:1;47223:78:0;;;14943:21:1;15000:2;14980:18;;;14973:30;15039:34;15019:18;;;15012:62;-1:-1:-1;;;15090:18:1;;;15083:47;15147:19;;47223:78:0;14933:239:1;47223:78:0;47314:23;47340:19;;;:10;:19;;;;;47314:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47370:18;47391:10;:8;:10::i;:::-;47370:31;;47483:4;47477:18;47499:1;47477:23;47473:72;;;-1:-1:-1;47524:9:0;47124:679;-1:-1:-1;;47124:679:0:o;47473:72::-;47649:23;;:27;47645:108;;47724:4;47730:9;47707:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47693:48;;;;47124:679;;;:::o;47645:108::-;47772:23;47787:7;47772:14;:23::i;20574:305::-;20676:4;-1:-1:-1;;;;;;20713:40:0;;-1:-1:-1;;;20713:40:0;;:105;;-1:-1:-1;;;;;;;20770:48:0;;-1:-1:-1;;;20770:48:0;20713:105;:158;;;-1:-1:-1;;;;;;;;;;10635:40:0;;;20835:36;10526:157;60829:204;60980:45;61007:4;61013:2;61017:7;60980:26;:45::i;48405:206::-;48474:20;48486:7;48474:11;:20::i;:::-;48517:19;;;;:10;:19;;;;;48511:33;;;;;:::i;:::-;:38;;-1:-1:-1;48507:97:0;;48573:19;;;;:10;:19;;;;;48566:26;;;:::i;31193:803::-;31348:4;-1:-1:-1;;;;;31369:13:0;;2096:20;2144:8;31365:624;;31405:72;;-1:-1:-1;;;31405:72:0;;-1:-1:-1;;;;;31405:36:0;;;;;:72;;877:10;;31456:4;;31462:7;;31471:5;;31405:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31405:72:0;;;;;;;;-1:-1:-1;;31405:72:0;;;;;;;;;;;;:::i;:::-;;;31401:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31651:13:0;;31647:272;;31694:60;;-1:-1:-1;;;31694:60:0;;;;;;;:::i;31647:272::-;31869:6;31863:13;31854:6;31850:2;31846:15;31839:38;31401:533;-1:-1:-1;;;;;;31528:55:0;-1:-1:-1;;;31528:55:0;;-1:-1:-1;31521:62:0;;31365:624;-1:-1:-1;31973:4:0;31193:803;;;;;;:::o;58269:100::-;58321:13;58354:7;58347:14;;;;;:::i;21863:334::-;26537:4;26561:16;;;:7;:16;;;;;;21936:13;;-1:-1:-1;;;;;26561:16:0;21962:76;;;;-1:-1:-1;;;21962:76:0;;16563:2:1;21962:76:0;;;16545:21:1;16602:2;16582:18;;;16575:30;16641:34;16621:18;;;16614:62;-1:-1:-1;;;16692:18:1;;;16685:45;16747:19;;21962:76:0;16535:237:1;21962:76:0;22051:21;22075:10;:8;:10::i;:::-;22051:34;;22127:1;22109:7;22103:21;:25;:86;;;;;;;;;;;;;;;;;22155:7;22164:18;:7;:16;:18::i;:::-;22138:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22096:93;21863:334;-1:-1:-1;;;21863:334:0:o;42226:589::-;-1:-1:-1;;;;;42432:18:0;;42428:187;;42467:40;42499:7;43642:10;:17;;43615:24;;;;:15;:24;;;;;:44;;;43670:24;;;;;;;;;;;;43538:164;42467:40;42428:187;;;42537:2;-1:-1:-1;;;;;42529:10:0;:4;-1:-1:-1;;;;;42529:10:0;;42525:90;;42556:47;42589:4;42595:7;42556:32;:47::i;:::-;-1:-1:-1;;;;;42629:16:0;;42625:183;;42662:45;42699:7;42662:36;:45::i;42625:183::-;42735:4;-1:-1:-1;;;;;42729:10:0;:2;-1:-1:-1;;;;;42729:10:0;;42725:83;;42756:40;42784:2;42788:7;42756:27;:40::i;29061:360::-;29121:13;29137:23;29152:7;29137:14;:23::i;:::-;29121:39;;29173:48;29194:5;29209:1;29213:7;29173:20;:48::i;:::-;29262:29;29279:1;29283:7;29262:8;:29::i;:::-;-1:-1:-1;;;;;29304:16:0;;;;;;:9;:16;;;;;:21;;29324:1;;29304:16;:21;;29324:1;;29304:21;:::i;:::-;;;;-1:-1:-1;;29343:16:0;;;;:7;:16;;;;;;29336:23;;-1:-1:-1;;;;;;29336:23:0;;;29377:36;29351:7;;29343:16;-1:-1:-1;;;;;29377:36:0;;;;;29343:16;;29377:36;29061:360;;:::o;10997:723::-;11053:13;11274:10;11270:53;;-1:-1:-1;;11301:10:0;;;;;;;;;;;;-1:-1:-1;;;11301:10:0;;;;;10997:723::o;11270:53::-;11348:5;11333:12;11389:78;11396:9;;11389:78;;11422:8;;;;:::i;:::-;;-1:-1:-1;11445:10:0;;-1:-1:-1;11453:2:0;11445:10;;:::i;:::-;;;11389:78;;;11477:19;11509:6;11499:17;;;;;;-1:-1:-1;;;11499:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11499:17:0;;11477:39;;11527:154;11534:10;;11527:154;;11561:11;11571:1;11561:11;;:::i;:::-;;-1:-1:-1;11630:10:0;11638:2;11630:5;:10;:::i;:::-;11617:24;;:2;:24;:::i;:::-;11604:39;;11587:6;11594;11587:14;;;;;;-1:-1:-1;;;11587:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;11587:56:0;;;;;;;;-1:-1:-1;11658:11:0;11667:2;11658:11;;:::i;:::-;;;11527:154;;44329:988;44595:22;44645:1;44620:22;44637:4;44620:16;:22::i;:::-;:26;;;;:::i;:::-;44657:18;44678:26;;;:17;:26;;;;;;44595:51;;-1:-1:-1;44811:28:0;;;44807:328;;-1:-1:-1;;;;;44878:18:0;;44856:19;44878:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44929:30;;;;;;:44;;;45046:30;;:17;:30;;;;;:43;;;44807:328;-1:-1:-1;45231:26:0;;;;:17;:26;;;;;;;;45224:33;;;-1:-1:-1;;;;;45275:18:0;;;;;:12;:18;;;;;:34;;;;;;;45268:41;44329:988::o;45612:1079::-;45890:10;:17;45865:22;;45890:21;;45910:1;;45890:21;:::i;:::-;45922:18;45943:24;;;:15;:24;;;;;;46316:10;:26;;45865:46;;-1:-1:-1;45943:24:0;;45865:46;;46316:26;;;;-1:-1:-1;;;46316:26:0;;;;;;;;;;;;;;;;;46294:48;;46380:11;46355:10;46366;46355:22;;;;;;-1:-1:-1;;;46355:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;46460:28;;;:15;:28;;;;;;;:41;;;46632:24;;;;;46625:31;46667:10;:16;;;;;-1:-1:-1;;;46667:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;45612:1079;;;;:::o;43116:221::-;43201:14;43218:20;43235:2;43218:16;:20::i;:::-;-1:-1:-1;;;;;43249:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;43294:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;43116:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:2;;588:1;585;578:12;603:229;646:5;699:3;692:4;684:6;680:17;676:27;666:2;;721:5;714;707:20;666:2;747:79;822:3;813:6;800:20;793:4;785:6;781:17;747:79;:::i;837:196::-;896:6;949:2;937:9;928:7;924:23;920:32;917:2;;;970:6;962;955:22;917:2;998:29;1017:9;998:29;:::i;1038:270::-;1106:6;1114;1167:2;1155:9;1146:7;1142:23;1138:32;1135:2;;;1188:6;1180;1173:22;1135:2;1216:29;1235:9;1216:29;:::i;:::-;1206:39;;1264:38;1298:2;1287:9;1283:18;1264:38;:::i;:::-;1254:48;;1125:183;;;;;:::o;1313:338::-;1390:6;1398;1406;1459:2;1447:9;1438:7;1434:23;1430:32;1427:2;;;1480:6;1472;1465:22;1427:2;1508:29;1527:9;1508:29;:::i;:::-;1498:39;;1556:38;1590:2;1579:9;1575:18;1556:38;:::i;:::-;1546:48;;1641:2;1630:9;1626:18;1613:32;1603:42;;1417:234;;;;;:::o;1656:696::-;1751:6;1759;1767;1775;1828:3;1816:9;1807:7;1803:23;1799:33;1796:2;;;1850:6;1842;1835:22;1796:2;1878:29;1897:9;1878:29;:::i;:::-;1868:39;;1926:38;1960:2;1949:9;1945:18;1926:38;:::i;:::-;1916:48;;2011:2;2000:9;1996:18;1983:32;1973:42;;2066:2;2055:9;2051:18;2038:32;2093:18;2085:6;2082:30;2079:2;;;2130:6;2122;2115:22;2079:2;2158:22;;2211:4;2203:13;;2199:27;-1:-1:-1;2189:2:1;;2245:6;2237;2230:22;2189:2;2273:73;2338:7;2333:2;2320:16;2315:2;2311;2307:11;2273:73;:::i;:::-;2263:83;;;1786:566;;;;;;;:::o;2357:1076::-;2450:6;2458;2511:2;2499:9;2490:7;2486:23;2482:32;2479:2;;;2532:6;2524;2517:22;2479:2;2560:29;2579:9;2560:29;:::i;:::-;2550:39;;2608:2;2661;2650:9;2646:18;2633:32;2684:18;2725:2;2717:6;2714:14;2711:2;;;2746:6;2738;2731:22;2711:2;2789:6;2778:9;2774:22;2764:32;;2834:7;2827:4;2823:2;2819:13;2815:27;2805:2;;2861:6;2853;2846:22;2805:2;2902;2889:16;2924:2;2920;2917:10;2914:2;;;2930:18;;:::i;:::-;2976:2;2973:1;2969:10;2959:20;;2999:28;3023:2;3019;3015:11;2999:28;:::i;:::-;3061:15;;;3092:12;;;;3124:11;;;3154;;;3150:20;;3147:33;-1:-1:-1;3144:2:1;;;3198:6;3190;3183:22;3144:2;3225:6;3216:15;;3240:163;3254:2;3251:1;3248:9;3240:163;;;3311:17;;3299:30;;3272:1;3265:9;;;;;3349:12;;;;3381;;3240:163;;;3244:3;3422:5;3412:15;;;;;;;;2469:964;;;;;:::o;3438:367::-;3503:6;3511;3564:2;3552:9;3543:7;3539:23;3535:32;3532:2;;;3585:6;3577;3570:22;3532:2;3613:29;3632:9;3613:29;:::i;:::-;3603:39;;3692:2;3681:9;3677:18;3664:32;3739:5;3732:13;3725:21;3718:5;3715:32;3705:2;;3766:6;3758;3751:22;3705:2;3794:5;3784:15;;;3522:283;;;;;:::o;3810:416::-;3888:6;3896;3949:2;3937:9;3928:7;3924:23;3920:32;3917:2;;;3970:6;3962;3955:22;3917:2;3998:29;4017:9;3998:29;:::i;:::-;3988:39;;4078:2;4067:9;4063:18;4050:32;4105:18;4097:6;4094:30;4091:2;;;4142:6;4134;4127:22;4091:2;4170:50;4212:7;4203:6;4192:9;4188:22;4170:50;:::i;:::-;4160:60;;;3907:319;;;;;:::o;4231:264::-;4299:6;4307;4360:2;4348:9;4339:7;4335:23;4331:32;4328:2;;;4381:6;4373;4366:22;4328:2;4409:29;4428:9;4409:29;:::i;:::-;4399:39;4485:2;4470:18;;;;4457:32;;-1:-1:-1;;;4318:177:1:o;4500:255::-;4558:6;4611:2;4599:9;4590:7;4586:23;4582:32;4579:2;;;4632:6;4624;4617:22;4579:2;4676:9;4663:23;4695:30;4719:5;4695:30;:::i;4760:259::-;4829:6;4882:2;4870:9;4861:7;4857:23;4853:32;4850:2;;;4903:6;4895;4888:22;4850:2;4940:9;4934:16;4959:30;4983:5;4959:30;:::i;5024:342::-;5093:6;5146:2;5134:9;5125:7;5121:23;5117:32;5114:2;;;5167:6;5159;5152:22;5114:2;5212:9;5199:23;5245:18;5237:6;5234:30;5231:2;;;5282:6;5274;5267:22;5231:2;5310:50;5352:7;5343:6;5332:9;5328:22;5310:50;:::i;5371:190::-;5430:6;5483:2;5471:9;5462:7;5458:23;5454:32;5451:2;;;5504:6;5496;5489:22;5451:2;-1:-1:-1;5532:23:1;;5441:120;-1:-1:-1;5441:120:1:o;5566:410::-;5644:6;5652;5705:2;5693:9;5684:7;5680:23;5676:32;5673:2;;;5726:6;5718;5711:22;5673:2;5767:9;5754:23;5744:33;;5828:2;5817:9;5813:18;5800:32;5855:18;5847:6;5844:30;5841:2;;;5892:6;5884;5877:22;5981:257;6022:3;6060:5;6054:12;6087:6;6082:3;6075:19;6103:63;6159:6;6152:4;6147:3;6143:14;6136:4;6129:5;6125:16;6103:63;:::i;:::-;6220:2;6199:15;-1:-1:-1;;6195:29:1;6186:39;;;;6227:4;6182:50;;6030:208;-1:-1:-1;;6030:208:1:o;6243:470::-;6422:3;6460:6;6454:13;6476:53;6522:6;6517:3;6510:4;6502:6;6498:17;6476:53;:::i;:::-;6592:13;;6551:16;;;;6614:57;6592:13;6551:16;6648:4;6636:17;;6614:57;:::i;:::-;6687:20;;6430:283;-1:-1:-1;;;;6430:283:1:o;6926:488::-;-1:-1:-1;;;;;7195:15:1;;;7177:34;;7247:15;;7242:2;7227:18;;7220:43;7294:2;7279:18;;7272:34;;;7342:3;7337:2;7322:18;;7315:31;;;7120:4;;7363:45;;7388:19;;7380:6;7363:45;:::i;:::-;7355:53;7129:285;-1:-1:-1;;;;;;7129:285:1:o;7419:805::-;7581:4;7610:2;7650;7639:9;7635:18;7680:2;7669:9;7662:21;7703:6;7738;7732:13;7769:6;7761;7754:22;7807:2;7796:9;7792:18;7785:25;;7869:2;7859:6;7856:1;7852:14;7841:9;7837:30;7833:39;7819:53;;7907:2;7899:6;7895:15;7928:4;7941:254;7955:6;7952:1;7949:13;7941:254;;;8048:2;8044:7;8032:9;8024:6;8020:22;8016:36;8011:3;8004:49;8076:39;8108:6;8099;8093:13;8076:39;:::i;:::-;8066:49;-1:-1:-1;8173:12:1;;;;8138:15;;;;7977:1;7970:9;7941:254;;;-1:-1:-1;8212:6:1;;7590:634;-1:-1:-1;;;;;;;7590:634:1:o;8229:635::-;8400:2;8452:21;;;8522:13;;8425:18;;;8544:22;;;8371:4;;8400:2;8623:15;;;;8597:2;8582:18;;;8371:4;8669:169;8683:6;8680:1;8677:13;8669:169;;;8744:13;;8732:26;;8813:15;;;;8778:12;;;;8705:1;8698:9;8669:169;;;-1:-1:-1;8855:3:1;;8380:484;-1:-1:-1;;;;;;8380:484:1:o;9061:219::-;9210:2;9199:9;9192:21;9173:4;9230:44;9270:2;9259:9;9255:18;9247:6;9230:44;:::i;10452:414::-;10654:2;10636:21;;;10693:2;10673:18;;;10666:30;10732:34;10727:2;10712:18;;10705:62;-1:-1:-1;;;10798:2:1;10783:18;;10776:48;10856:3;10841:19;;10626:240::o;15590:356::-;15792:2;15774:21;;;15811:18;;;15804:30;15870:34;15865:2;15850:18;;15843:62;15937:2;15922:18;;15764:182::o;17179:413::-;17381:2;17363:21;;;17420:2;17400:18;;;17393:30;17459:34;17454:2;17439:18;;17432:62;-1:-1:-1;;;17525:2:1;17510:18;;17503:47;17582:3;17567:19;;17353:239::o;18192:275::-;18263:2;18257:9;18328:2;18309:13;;-1:-1:-1;;18305:27:1;18293:40;;18363:18;18348:34;;18384:22;;;18345:62;18342:2;;;18410:18;;:::i;:::-;18446:2;18439:22;18237:230;;-1:-1:-1;18237:230:1:o;18472:128::-;18512:3;18543:1;18539:6;18536:1;18533:13;18530:2;;;18549:18;;:::i;:::-;-1:-1:-1;18585:9:1;;18520:80::o;18605:120::-;18645:1;18671;18661:2;;18676:18;;:::i;:::-;-1:-1:-1;18710:9:1;;18651:74::o;18730:125::-;18770:4;18798:1;18795;18792:8;18789:2;;;18803:18;;:::i;:::-;-1:-1:-1;18840:9:1;;18779:76::o;18860:258::-;18932:1;18942:113;18956:6;18953:1;18950:13;18942:113;;;19032:11;;;19026:18;19013:11;;;19006:39;18978:2;18971:10;18942:113;;;19073:6;19070:1;19067:13;19064:2;;;-1:-1:-1;;19108:1:1;19090:16;;19083:27;18913:205::o;19123:380::-;19202:1;19198:12;;;;19245;;;19266:2;;19320:4;19312:6;19308:17;19298:27;;19266:2;19373;19365:6;19362:14;19342:18;19339:38;19336:2;;;19419:10;19414:3;19410:20;19407:1;19400:31;19454:4;19451:1;19444:15;19482:4;19479:1;19472:15;19336:2;;19178:325;;;:::o;19508:135::-;19547:3;-1:-1:-1;;19568:17:1;;19565:2;;;19588:18;;:::i;:::-;-1:-1:-1;19635:1:1;19624:13;;19555:88::o;19648:112::-;19680:1;19706;19696:2;;19711:18;;:::i;:::-;-1:-1:-1;19745:9:1;;19686:74::o;19765:127::-;19826:10;19821:3;19817:20;19814:1;19807:31;19857:4;19854:1;19847:15;19881:4;19878:1;19871:15;19897:127;19958:10;19953:3;19949:20;19946:1;19939:31;19989:4;19986:1;19979:15;20013:4;20010:1;20003:15;20029:127;20090:10;20085:3;20081:20;20078:1;20071:31;20121:4;20118:1;20111:15;20145:4;20142:1;20135:15;20161:131;-1:-1:-1;;;;;;20235:32:1;;20225:43;;20215:2;;20282:1;20279;20272:12

Swarm Source

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