ERC-721
Overview
Max Total Supply
660 Salvator Mundi Original
Holders
439
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Salvator_Mundi_Original
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-09 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // 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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Mundi.sol pragma solidity ^0.8.0; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` 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 payable; /** * @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 payable; /** * @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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } /// @notice Optimized and flexible operator filterer to abide to OpenSea's /// mandatory on-chain royalty enforcement in order for new collections to /// receive royalties. /// For more information, see: /// See: https://github.com/ProjectOpenSea/operator-filter-registry abstract contract OperatorFilterer { /// @dev The default OpenSea operator blocklist subscription. address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; /// @dev The OpenSea operator filter registry. address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E; /// @dev Registers the current contract to OpenSea's operator filter, /// and subscribe to the default OpenSea operator blocklist. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering() internal virtual { _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true); } /// @dev Registers the current contract to OpenSea's operator filter. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering(address subscriptionOrRegistrantToCopy, bool subscribe) internal virtual { /// @solidity memory-safe-assembly assembly { let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`. // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty. subscriptionOrRegistrantToCopy := shr(96, shl(96, subscriptionOrRegistrantToCopy)) // prettier-ignore for {} iszero(subscribe) {} { if iszero(subscriptionOrRegistrantToCopy) { functionSelector := 0x4420e486 // `register(address)`. break } functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`. break } // Store the function selector. mstore(0x00, shl(224, functionSelector)) // Store the `address(this)`. mstore(0x04, address()) // Store the `subscriptionOrRegistrantToCopy`. mstore(0x24, subscriptionOrRegistrantToCopy) // Register into the registry. pop(call(gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x00)) // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, because of Solidity's memory size limits. mstore(0x24, 0) } } /// @dev Modifier to guard a function and revert if `from` is a blocked operator. /// Can be turned on / off via `enabled`. /// For gas efficiency, you can use tight variable packing to efficiently read / write /// the boolean value for `enabled`. modifier onlyAllowedOperator(address from, bool enabled) virtual { /// @solidity memory-safe-assembly assembly { // This code prioritizes runtime gas costs on a chain with the registry. // As such, we will not use `extcodesize`, but rather abuse the behavior // of `staticcall` returning 1 when called on an empty / missing contract, // to avoid reverting when a chain does not have the registry. if enabled { // Check if `from` is not equal to `msg.sender`, // discarding the upper 96 bits of `from` in case they are dirty. if iszero(eq(shr(96, shl(96, from)), caller())) { // Store the function selector of `isOperatorAllowed(address,address)`, // shifted left by 6 bytes, which is enough for 8tb of memory. // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL). mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `msg.sender`. mstore(0x3a, caller()) // `isOperatorAllowed` always returns true if it does not revert. if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // We'll skip checking if `from` is inside the blacklist. // Even though that can block transferring out of wrapper contracts, // we don't want tokens to be stuck. // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, if less than 8tb of memory is used. mstore(0x3a, 0) } } } _; } /// @dev Modifier to guard a function from approving a blocked operator. /// Can be turned on / off via `enabled`. /// For efficiency, you can use tight variable packing to efficiently read / write /// the boolean value for `enabled`. modifier onlyAllowedOperatorApproval(address operator, bool enabled) virtual { /// @solidity memory-safe-assembly assembly { // For more information on the optimization techniques used, // see the comments in `onlyAllowedOperator`. if enabled { // Store the function selector of `isOperatorAllowed(address,address)`, mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `operator`, discarding the upper 96 bits in case they are dirty. mstore(0x3a, shr(96, shl(96, operator))) // `isOperatorAllowed` always returns true if it does not revert. if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // Restore the part of the free memory pointer that was overwritten. mstore(0x3a, 0) } } _; } } error AlreadyReservedTokens(); error CallerNotOffsetter(); error FunctionLocked(); error InsufficientValue(); error InsufficientMints(); error InsufficientSupply(); error InvalidSignature(); error NoContractMinting(); error ProvenanceHashAlreadySet(); error ProvenanceHashNotSet(); error TokenOffsetAlreadySet(); error TokenOffsetNotSet(); error WithdrawFailed(); interface Offsetable { function setOffset(uint256 randomness) external; } contract Salvator_Mundi_Original is ERC721A, ERC2981, OperatorFilterer, Ownable { using ECDSA for bytes32; string private _baseTokenURI; string public baseExtension = ".json"; uint256 public constant RESERVED = 5; uint256 public SEC_RESERVED = 50; uint256 public constant MAX_SUPPLY = 660; uint256 public PUBLIC_SUPPLY = 605; uint256 public MAX_MINT_PER_ACCOUNT = 1; uint256 public mintPrice = 0.10 ether; string public provenanceHash; bool public operatorFilteringEnabled; mapping(bytes4 => bool) public functionLocked; mapping(address => uint) public userNftCount; bool public mintEnable = false; mapping(address => bool) public isUk; constructor( address _royaltyReceiver, uint96 _royaltyFraction ) ERC721A("Salvator Mundi Original", "Salvator Mundi Original") { _registerForOperatorFiltering(); operatorFilteringEnabled = true; _setDefaultRoyalty(_royaltyReceiver, _royaltyFraction); } /** * @notice Modifier applied to functions that will be disabled when they're no longer needed */ modifier lockable() { if (functionLocked[msg.sig]) revert FunctionLocked(); _; } /** * @inheritdoc ERC721A */ function supportsInterface(bytes4 interfaceId) public view override(ERC721A, ERC2981) returns (bool) { return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId); } /** * @notice Override ERC721A _baseURI function to use base URI pattern */ function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, Strings.toString(tokenId), baseExtension)) : ""; } /** * @notice Return the number of tokens an address has minted * @param account Address to return the number of tokens minted for */ function numberMinted(address account) external view returns (uint256) { return _numberMinted(account); } /** * @notice Lock a function so that it can no longer be called * @dev WARNING: THIS CANNOT BE UNDONE * @param id Function signature */ function lockFunction(bytes4 id) external onlyOwner { functionLocked[id] = true; } /** * @notice Set the state of the OpenSea operator filter * @param value Flag indicating if the operator filter should be applied to transfers and approvals */ function setOperatorFilteringEnabled(bool value) external lockable onlyOwner { operatorFilteringEnabled = value; } /** * @notice Set new royalties settings for the collection * @param receiver Address to receive royalties * @param royaltyFraction Royalty fee respective to fee denominator (10_000) */ function setRoyalties(address receiver, uint96 royaltyFraction) external onlyOwner { _setDefaultRoyalty(receiver, royaltyFraction); } /** * @notice Set token metadata base URI * @param _newBaseURI New base URI */ function setBaseURI(string calldata _newBaseURI) external lockable onlyOwner { _baseTokenURI = _newBaseURI; } /** * @notice Set provenance hash for the collection * @param _provenanceHash New hash of the metadata */ function setProvenanceHash(string calldata _provenanceHash) external lockable onlyOwner { if (bytes(provenanceHash).length != 0) revert ProvenanceHashAlreadySet(); provenanceHash = _provenanceHash; } /** * @notice Mint `RESERVED` amount of tokens to an address * @param to Address to send the reserved tokens */ function reserve(address to) external lockable onlyOwner { if (_totalMinted() >= RESERVED) revert AlreadyReservedTokens(); _mint(to, RESERVED); } function secondaryReserve(address to) external lockable onlyOwner { require(_totalMinted() + SEC_RESERVED <= MAX_SUPPLY , "Exceeds Maximum Supply" ); _mint(to, SEC_RESERVED); } function publicMint(address to, uint256 quantity, bool _isUk) external payable { require(quantity <= PUBLIC_SUPPLY, "NFT amount exceeds"); require(mintEnable == true, "Minting is not yet open."); require(quantity <= MAX_MINT_PER_ACCOUNT, "Amount Exceeds Maximum Mints Allowed Per Account."); require(userNftCount[to] + quantity <= MAX_MINT_PER_ACCOUNT, "You can not mint more than Max Mint Limit."); require(_totalMinted() + quantity <= MAX_SUPPLY , "Exceeds Maximum Supply" ); uint totalCost = quantity * mintPrice; require( msg.value >= totalCost, "Ether sent is not correct." ); _mint(to, quantity); PUBLIC_SUPPLY -= quantity; userNftCount[to] += quantity; isUk[to] = _isUk; if (msg.value > totalCost) { payable(msg.sender).transfer(msg.value - totalCost); } } function setMintPrice(uint256 _newPrice) external onlyOwner() { mintPrice = _newPrice; } function setPublicSupply(uint256 _newSupply) external onlyOwner() { PUBLIC_SUPPLY = _newSupply; } function setSecondaryReserve(uint256 amount) external onlyOwner() { SEC_RESERVED = amount; } function enableMinting(bool _enable) external onlyOwner{ mintEnable = _enable; } function setMaxMintPerAccount(uint256 accounts) external onlyOwner() { MAX_MINT_PER_ACCOUNT = accounts; } /** * @notice Withdraw all ETH sent to the contract */ function withdraw() external onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); if (!success) revert WithdrawFailed(); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator, operatorFilteringEnabled) { super.setApprovalForAll(operator, approved); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator, operatorFilteringEnabled) { super.approve(operator, tokenId); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function transferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) { super.transferFrom(from, to, tokenId); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) { super.safeTransferFrom(from, to, tokenId); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) { super.safeTransferFrom(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFraction","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyReservedTokens","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"FunctionLocked","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"ProvenanceHashAlreadySet","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT_PER_ACCOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEC_RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"functionLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"","type":"address"}],"name":"isUk","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"id","type":"bytes4"}],"name":"lockFunction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bool","name":"_isUk","type":"bool"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"secondaryReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"accounts","type":"uint256"}],"name":"setMaxMintPerAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setPublicSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"royaltyFraction","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSecondaryReserve","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":"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userNftCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90816200004a91906200074b565b506032600d5561025d600e556001600f5567016345785d8a00006010556000601560006101000a81548160ff0219169083151502179055503480156200008f57600080fd5b50604051620051b6380380620051b68339818101604052810190620000b59190620008e5565b6040518060400160405280601781526020017f53616c7661746f72204d756e6469204f726967696e616c0000000000000000008152506040518060400160405280601781526020017f53616c7661746f72204d756e6469204f726967696e616c00000000000000000081525081600290816200013291906200074b565b5080600390816200014491906200074b565b5062000155620001c260201b60201c565b60008190555050506200017d62000171620001cb60201b60201c565b620001d360201b60201c565b6200018d6200029960201b60201c565b6001601260006101000a81548160ff021916908315150217905550620001ba8282620002c260201b60201c565b505062000a47565b60006001905090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002c0733cc6cdda760b79bafa08df41ecfa224f810dceb660016200046560201b60201c565b565b620002d2620004c760201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000333576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200032a90620009b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620003a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200039c9062000a25565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b637d3e3dbe8260601b60601c9250816200049457826200048c57634420e486905062000494565b63a0af290390505b8060e01b600052306004528260245260008060446000806daaeb6d7670e522a718067333cd4e5af1506000602452505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200055357607f821691505b6020821081036200056957620005686200050b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000594565b620005df868362000594565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200062c620006266200062084620005f7565b62000601565b620005f7565b9050919050565b6000819050919050565b62000648836200060b565b62000660620006578262000633565b848454620005a1565b825550505050565b600090565b6200067762000668565b620006848184846200063d565b505050565b5b81811015620006ac57620006a06000826200066d565b6001810190506200068a565b5050565b601f821115620006fb57620006c5816200056f565b620006d08462000584565b81016020851015620006e0578190505b620006f8620006ef8562000584565b83018262000689565b50505b505050565b600082821c905092915050565b6000620007206000198460080262000700565b1980831691505092915050565b60006200073b83836200070d565b9150826002028217905092915050565b6200075682620004d1565b67ffffffffffffffff811115620007725762000771620004dc565b5b6200077e82546200053a565b6200078b828285620006b0565b600060209050601f831160018114620007c35760008415620007ae578287015190505b620007ba85826200072d565b8655506200082a565b601f198416620007d3866200056f565b60005b82811015620007fd57848901518255600182019150602085019450602081019050620007d6565b868310156200081d578489015162000819601f8916826200070d565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008648262000837565b9050919050565b620008768162000857565b81146200088257600080fd5b50565b60008151905062000896816200086b565b92915050565b60006bffffffffffffffffffffffff82169050919050565b620008bf816200089c565b8114620008cb57600080fd5b50565b600081519050620008df81620008b4565b92915050565b60008060408385031215620008ff57620008fe62000832565b5b60006200090f8582860162000885565b92505060206200092285828601620008ce565b9150509250929050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006200099b602a836200092c565b9150620009a8826200093d565b604082019050919050565b60006020820190508181036000830152620009ce816200098c565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000a0d6019836200092c565b915062000a1a82620009d5565b602082019050919050565b6000602082019050818103600083015262000a4081620009fe565b9050919050565b61475f8062000a576000396000f3fe6080604052600436106102885760003560e01c8063715018a61161015a578063c1e1ce29116100c1578063dc33e6811161007a578063dc33e68114610988578063e75179a4146109c5578063e985e9c5146109ee578063f2fde38b14610a2b578063f4a0a52814610a54578063fb796e6c14610a7d57610288565b8063c1e1ce2914610878578063c21b471b146108a3578063c6682862146108cc578063c6ab67a3146108f7578063c87b56dd14610922578063da3ef23f1461095f57610288565b8063a810e6ff11610113578063a810e6ff14610765578063aa592f251461078e578063b629f192146107b9578063b7c0b8e8146107f6578063b88d4fde1461081f578063bbadfe761461083b57610288565b8063715018a61461067b57806378acea1e146106925780638342083a146106bb5780638da5cb5b146106e657806395d89b4114610711578063a22cb4651461073c57610288565b80633418f565116101fe578063559c55b9116101b7578063559c55b91461055957806355f804b314610582578063601e5e77146105ab5780636352211e146105d65780636817c76c1461061357806370a082311461063e57610288565b80633418f5651461047b57806334531828146104b85780633ccfd60b146104e1578063402c3856146104f857806342842e0e1461051457806348c5bdaa1461053057610288565b80631096952311610250578063109695231461037957806318160ddd146103a257806323b872dd146103cd57806326aa420a146103e95780632a55205a1461041257806332cb6b0c1461045057610288565b806301ffc9a71461028d578063066453df146102ca57806306fdde03146102f5578063081812fc14610320578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906131c2565b610aa8565b6040516102c1919061320a565b60405180910390f35b3480156102d657600080fd5b506102df610aca565b6040516102ec919061323e565b60405180910390f35b34801561030157600080fd5b5061030a610ad0565b60405161031791906132e9565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190613337565b610b62565b60405161035491906133a5565b60405180910390f35b610377600480360381019061037291906133ec565b610be1565b005b34801561038557600080fd5b506103a0600480360381019061039b9190613491565b610c50565b005b3480156103ae57600080fd5b506103b7610d6f565b6040516103c4919061323e565b60405180910390f35b6103e760048036038101906103e291906134de565b610d86565b005b3480156103f557600080fd5b50610410600480360381019061040b9190613337565b610dff565b005b34801561041e57600080fd5b5061043960048036038101906104349190613531565b610e11565b604051610447929190613571565b60405180910390f35b34801561045c57600080fd5b50610465610ffb565b604051610472919061323e565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d919061359a565b611001565b6040516104af919061323e565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906131c2565b611019565b005b3480156104ed57600080fd5b506104f661108e565b005b610512600480360381019061050d91906135f3565b61113c565b005b61052e600480360381019061052991906134de565b611488565b005b34801561053c57600080fd5b5061055760048036038101906105529190613337565b611501565b005b34801561056557600080fd5b50610580600480360381019061057b9190613337565b611513565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613491565b611525565b005b3480156105b757600080fd5b506105c06115fc565b6040516105cd919061323e565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190613337565b611602565b60405161060a91906133a5565b60405180910390f35b34801561061f57600080fd5b50610628611614565b604051610635919061323e565b60405180910390f35b34801561064a57600080fd5b506106656004803603810190610660919061359a565b61161a565b604051610672919061323e565b60405180910390f35b34801561068757600080fd5b506106906116d2565b005b34801561069e57600080fd5b506106b960048036038101906106b49190613646565b6116e6565b005b3480156106c757600080fd5b506106d061170b565b6040516106dd919061323e565b60405180910390f35b3480156106f257600080fd5b506106fb611711565b60405161070891906133a5565b60405180910390f35b34801561071d57600080fd5b5061072661173b565b60405161073391906132e9565b60405180910390f35b34801561074857600080fd5b50610763600480360381019061075e9190613673565b6117cd565b005b34801561077157600080fd5b5061078c6004803603810190610787919061359a565b61183c565b005b34801561079a57600080fd5b506107a3611965565b6040516107b0919061323e565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db919061359a565b61196a565b6040516107ed919061320a565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190613646565b61198a565b005b610839600480360381019061083491906137e3565b611a68565b005b34801561084757600080fd5b50610862600480360381019061085d91906131c2565b611ae3565b60405161086f919061320a565b60405180910390f35b34801561088457600080fd5b5061088d611b03565b60405161089a919061320a565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c591906138aa565b611b16565b005b3480156108d857600080fd5b506108e1611b2c565b6040516108ee91906132e9565b60405180910390f35b34801561090357600080fd5b5061090c611bba565b60405161091991906132e9565b60405180910390f35b34801561092e57600080fd5b5061094960048036038101906109449190613337565b611c48565b60405161095691906132e9565b60405180910390f35b34801561096b57600080fd5b506109866004803603810190610981919061398b565b611cf2565b005b34801561099457600080fd5b506109af60048036038101906109aa919061359a565b611d0d565b6040516109bc919061323e565b60405180910390f35b3480156109d157600080fd5b506109ec60048036038101906109e7919061359a565b611d1f565b005b3480156109fa57600080fd5b50610a156004803603810190610a1091906139d4565b611e2f565b604051610a22919061320a565b60405180910390f35b348015610a3757600080fd5b50610a526004803603810190610a4d919061359a565b611ec3565b005b348015610a6057600080fd5b50610a7b6004803603810190610a769190613337565b611f46565b005b348015610a8957600080fd5b50610a92611f58565b604051610a9f919061320a565b60405180910390f35b6000610ab382611f6b565b80610ac35750610ac282611ffd565b5b9050919050565b600f5481565b606060028054610adf90613a43565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0b90613a43565b8015610b585780601f10610b2d57610100808354040283529160200191610b58565b820191906000526020600020905b815481529060010190602001808311610b3b57829003601f168201915b5050505050905090565b6000610b6d82612077565b610ba3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81601260009054906101000a900460ff168015610c405769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610c3a573d6000803e3d6000fd5b6000603a525b610c4a84846120d6565b50505050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615610d09576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1161221a565b600060118054610d2090613a43565b905014610d59576040517f19e24c1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160119182610d6a929190613c2b565b505050565b6000610d79612298565b6001546000540303905090565b82601260009054906101000a900460ff168015610ded57338260601b60601c14610dec5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610de6573d6000803e3d6000fd5b6000603a525b5b610df88585856122a1565b5050505050565b610e0761221a565b80600e8190555050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610fa65760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610fb06125c3565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610fdc9190613d2a565b610fe69190613d9b565b90508160000151819350935050509250929050565b61029481565b60146020528060005260406000206000915090505481565b61102161221a565b600160136000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61109661221a565b60003373ffffffffffffffffffffffffffffffffffffffff16476040516110bc90613dfd565b60006040518083038185875af1925050503d80600081146110f9576040519150601f19603f3d011682016040523d82523d6000602084013e6110fe565b606091505b5050905080611139576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b600e54821115611181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117890613e5e565b60405180910390fd5b60011515601560009054906101000a900460ff161515146111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90613eca565b60405180910390fd5b600f5482111561121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390613f5c565b60405180910390fd5b600f5482601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461126a9190613f7c565b11156112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290614022565b60405180910390fd5b610294826112b76125cd565b6112c19190613f7c565b1115611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f99061408e565b60405180910390fd5b6000601054836113129190613d2a565b905080341015611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e906140fa565b60405180910390fd5b61136184846125e0565b82600e6000828254611373919061411a565b9250508190555082601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113c99190613f7c565b9250508190555081601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080341115611482573373ffffffffffffffffffffffffffffffffffffffff166108fc8234611455919061411a565b9081150290604051600060405180830381858888f19350505050158015611480573d6000803e3d6000fd5b505b50505050565b82601260009054906101000a900460ff1680156114ef57338260601b60601c146114ee5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6114e8573d6000803e3d6000fd5b6000603a525b5b6114fa85858561279b565b5050505050565b61150961221a565b80600f8190555050565b61151b61221a565b80600d8190555050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff16156115de576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115e661221a565b8181600b91826115f7929190613c2b565b505050565b600d5481565b600061160d826127bb565b9050919050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611681576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116da61221a565b6116e46000612887565b565b6116ee61221a565b80601560006101000a81548160ff02191690831515021790555050565b600e5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461174a90613a43565b80601f016020809104026020016040519081016040528092919081815260200182805461177690613a43565b80156117c35780601f10611798576101008083540402835291602001916117c3565b820191906000526020600020905b8154815290600101906020018083116117a657829003601f168201915b5050505050905090565b81601260009054906101000a900460ff16801561182c5769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611826573d6000803e3d6000fd5b6000603a525b611836848461294d565b50505050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff16156118f5576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118fd61221a565b610294600d5461190b6125cd565b6119159190613f7c565b1115611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d9061408e565b60405180910390fd5b61196281600d546125e0565b50565b600581565b60166020528060005260406000206000915054906101000a900460ff1681565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611a43576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a4b61221a565b80601260006101000a81548160ff02191690831515021790555050565b83601260009054906101000a900460ff168015611acf57338260601b60601c14611ace5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611ac8573d6000803e3d6000fd5b6000603a525b5b611adb86868686612a58565b505050505050565b60136020528060005260406000206000915054906101000a900460ff1681565b601560009054906101000a900460ff1681565b611b1e61221a565b611b288282612acb565b5050565b600c8054611b3990613a43565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6590613a43565b8015611bb25780601f10611b8757610100808354040283529160200191611bb2565b820191906000526020600020905b815481529060010190602001808311611b9557829003601f168201915b505050505081565b60118054611bc790613a43565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf390613a43565b8015611c405780601f10611c1557610100808354040283529160200191611c40565b820191906000526020600020905b815481529060010190602001808311611c2357829003601f168201915b505050505081565b6060611c5382612077565b611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c89906141c0565b60405180910390fd5b6000611c9c612c60565b90506000815111611cbc5760405180602001604052806000815250611cea565b80611cc684612cf2565b600c604051602001611cda9392919061429f565b6040516020818303038152906040525b915050919050565b611cfa61221a565b80600c9081611d0991906142d0565b5050565b6000611d1882612e52565b9050919050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611dd8576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611de061221a565b6005611dea6125cd565b10611e21576040517f1f0f14ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e2c8160056125e0565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ecb61221a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3190614414565b60405180910390fd5b611f4381612887565b50565b611f4e61221a565b8060108190555050565b601260009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fc657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ff65750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612070575061206f82612ea9565b5b9050919050565b600081612082612298565b11158015612091575060005482105b80156120cf575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006120e182611602565b90508073ffffffffffffffffffffffffffffffffffffffff16612102612f13565b73ffffffffffffffffffffffffffffffffffffffff16146121655761212e81612129612f13565b611e2f565b612164576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612222612f1b565b73ffffffffffffffffffffffffffffffffffffffff16612240611711565b73ffffffffffffffffffffffffffffffffffffffff1614612296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228d90614480565b60405180910390fd5b565b60006001905090565b60006122ac826127bb565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612313576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061231f84612f23565b915091506123358187612330612f13565b612f4a565b6123815761234a86612345612f13565b611e2f565b612380576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123e7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123f48686866001612f8e565b80156123ff57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506124cd856124a9888887612f94565b7c020000000000000000000000000000000000000000000000000000000017612fbc565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036125535760006001850190506000600460008381526020019081526020016000205403612551576000548114612550578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125bb8686866001612fe7565b505050505050565b6000612710905090565b60006125d7612298565b60005403905090565b60008054905060008203612620576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61262d6000848385612f8e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506126a4836126956000866000612f94565b61269e85612fed565b17612fbc565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461274557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061270a565b5060008203612780576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506127966000848385612fe7565b505050565b6127b683838360405180602001604052806000815250611a68565b505050565b600080829050806127ca612298565b116128505760005481101561284f5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361284d575b60008103612843576004600083600190039350838152602001908152602001600020549050612819565b8092505050612882565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806007600061295a612f13565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612a07612f13565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a4c919061320a565b60405180910390a35050565b612a63848484610d86565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ac557612a8e84848484612ffd565b612ac4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612ad36125c3565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2890614512565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b979061457e565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600b8054612c6f90613a43565b80601f0160208091040260200160405190810160405280929190818152602001828054612c9b90613a43565b8015612ce85780601f10612cbd57610100808354040283529160200191612ce8565b820191906000526020600020905b815481529060010190602001808311612ccb57829003601f168201915b5050505050905090565b606060008203612d39576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e4d565b600082905060005b60008214612d6b578080612d549061459e565b915050600a82612d649190613d9b565b9150612d41565b60008167ffffffffffffffff811115612d8757612d866136b8565b5b6040519080825280601f01601f191660200182016040528015612db95781602001600182028036833780820191505090505b5090505b60008514612e4657600182612dd2919061411a565b9150600a85612de191906145e6565b6030612ded9190613f7c565b60f81b818381518110612e0357612e02614617565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e3f9190613d9b565b9450612dbd565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612fab86868461314d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613023612f13565b8786866040518563ffffffff1660e01b8152600401613045949392919061469b565b6020604051808303816000875af192505050801561308157506040513d601f19601f8201168201806040525081019061307e91906146fc565b60015b6130fa573d80600081146130b1576040519150601f19603f3d011682016040523d82523d6000602084013e6130b6565b606091505b5060008151036130f2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61319f8161316a565b81146131aa57600080fd5b50565b6000813590506131bc81613196565b92915050565b6000602082840312156131d8576131d7613160565b5b60006131e6848285016131ad565b91505092915050565b60008115159050919050565b613204816131ef565b82525050565b600060208201905061321f60008301846131fb565b92915050565b6000819050919050565b61323881613225565b82525050565b6000602082019050613253600083018461322f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613293578082015181840152602081019050613278565b60008484015250505050565b6000601f19601f8301169050919050565b60006132bb82613259565b6132c58185613264565b93506132d5818560208601613275565b6132de8161329f565b840191505092915050565b6000602082019050818103600083015261330381846132b0565b905092915050565b61331481613225565b811461331f57600080fd5b50565b6000813590506133318161330b565b92915050565b60006020828403121561334d5761334c613160565b5b600061335b84828501613322565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061338f82613364565b9050919050565b61339f81613384565b82525050565b60006020820190506133ba6000830184613396565b92915050565b6133c981613384565b81146133d457600080fd5b50565b6000813590506133e6816133c0565b92915050565b6000806040838503121561340357613402613160565b5b6000613411858286016133d7565b925050602061342285828601613322565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126134515761345061342c565b5b8235905067ffffffffffffffff81111561346e5761346d613431565b5b60208301915083600182028301111561348a57613489613436565b5b9250929050565b600080602083850312156134a8576134a7613160565b5b600083013567ffffffffffffffff8111156134c6576134c5613165565b5b6134d28582860161343b565b92509250509250929050565b6000806000606084860312156134f7576134f6613160565b5b6000613505868287016133d7565b9350506020613516868287016133d7565b925050604061352786828701613322565b9150509250925092565b6000806040838503121561354857613547613160565b5b600061355685828601613322565b925050602061356785828601613322565b9150509250929050565b60006040820190506135866000830185613396565b613593602083018461322f565b9392505050565b6000602082840312156135b0576135af613160565b5b60006135be848285016133d7565b91505092915050565b6135d0816131ef565b81146135db57600080fd5b50565b6000813590506135ed816135c7565b92915050565b60008060006060848603121561360c5761360b613160565b5b600061361a868287016133d7565b935050602061362b86828701613322565b925050604061363c868287016135de565b9150509250925092565b60006020828403121561365c5761365b613160565b5b600061366a848285016135de565b91505092915050565b6000806040838503121561368a57613689613160565b5b6000613698858286016133d7565b92505060206136a9858286016135de565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136f08261329f565b810181811067ffffffffffffffff8211171561370f5761370e6136b8565b5b80604052505050565b6000613722613156565b905061372e82826136e7565b919050565b600067ffffffffffffffff82111561374e5761374d6136b8565b5b6137578261329f565b9050602081019050919050565b82818337600083830152505050565b600061378661378184613733565b613718565b9050828152602081018484840111156137a2576137a16136b3565b5b6137ad848285613764565b509392505050565b600082601f8301126137ca576137c961342c565b5b81356137da848260208601613773565b91505092915050565b600080600080608085870312156137fd576137fc613160565b5b600061380b878288016133d7565b945050602061381c878288016133d7565b935050604061382d87828801613322565b925050606085013567ffffffffffffffff81111561384e5761384d613165565b5b61385a878288016137b5565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b61388781613866565b811461389257600080fd5b50565b6000813590506138a48161387e565b92915050565b600080604083850312156138c1576138c0613160565b5b60006138cf858286016133d7565b92505060206138e085828601613895565b9150509250929050565b600067ffffffffffffffff821115613905576139046136b8565b5b61390e8261329f565b9050602081019050919050565b600061392e613929846138ea565b613718565b90508281526020810184848401111561394a576139496136b3565b5b613955848285613764565b509392505050565b600082601f8301126139725761397161342c565b5b813561398284826020860161391b565b91505092915050565b6000602082840312156139a1576139a0613160565b5b600082013567ffffffffffffffff8111156139bf576139be613165565b5b6139cb8482850161395d565b91505092915050565b600080604083850312156139eb576139ea613160565b5b60006139f9858286016133d7565b9250506020613a0a858286016133d7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a5b57607f821691505b602082108103613a6e57613a6d613a14565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ae17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613aa4565b613aeb8683613aa4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613b28613b23613b1e84613225565b613b03565b613225565b9050919050565b6000819050919050565b613b4283613b0d565b613b56613b4e82613b2f565b848454613ab1565b825550505050565b600090565b613b6b613b5e565b613b76818484613b39565b505050565b5b81811015613b9a57613b8f600082613b63565b600181019050613b7c565b5050565b601f821115613bdf57613bb081613a7f565b613bb984613a94565b81016020851015613bc8578190505b613bdc613bd485613a94565b830182613b7b565b50505b505050565b600082821c905092915050565b6000613c0260001984600802613be4565b1980831691505092915050565b6000613c1b8383613bf1565b9150826002028217905092915050565b613c358383613a74565b67ffffffffffffffff811115613c4e57613c4d6136b8565b5b613c588254613a43565b613c63828285613b9e565b6000601f831160018114613c925760008415613c80578287013590505b613c8a8582613c0f565b865550613cf2565b601f198416613ca086613a7f565b60005b82811015613cc857848901358255600182019150602085019450602081019050613ca3565b86831015613ce55784890135613ce1601f891682613bf1565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d3582613225565b9150613d4083613225565b9250828202613d4e81613225565b91508282048414831517613d6557613d64613cfb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613da682613225565b9150613db183613225565b925082613dc157613dc0613d6c565b5b828204905092915050565b600081905092915050565b50565b6000613de7600083613dcc565b9150613df282613dd7565b600082019050919050565b6000613e0882613dda565b9150819050919050565b7f4e465420616d6f756e7420657863656564730000000000000000000000000000600082015250565b6000613e48601283613264565b9150613e5382613e12565b602082019050919050565b60006020820190508181036000830152613e7781613e3b565b9050919050565b7f4d696e74696e67206973206e6f7420796574206f70656e2e0000000000000000600082015250565b6000613eb4601883613264565b9150613ebf82613e7e565b602082019050919050565b60006020820190508181036000830152613ee381613ea7565b9050919050565b7f416d6f756e742045786365656473204d6178696d756d204d696e747320416c6c60008201527f6f77656420506572204163636f756e742e000000000000000000000000000000602082015250565b6000613f46603183613264565b9150613f5182613eea565b604082019050919050565b60006020820190508181036000830152613f7581613f39565b9050919050565b6000613f8782613225565b9150613f9283613225565b9250828201905080821115613faa57613fa9613cfb565b5b92915050565b7f596f752063616e206e6f74206d696e74206d6f7265207468616e204d6178204d60008201527f696e74204c696d69742e00000000000000000000000000000000000000000000602082015250565b600061400c602a83613264565b915061401782613fb0565b604082019050919050565b6000602082019050818103600083015261403b81613fff565b9050919050565b7f45786365656473204d6178696d756d20537570706c7900000000000000000000600082015250565b6000614078601683613264565b915061408382614042565b602082019050919050565b600060208201905081810360008301526140a78161406b565b9050919050565b7f45746865722073656e74206973206e6f7420636f72726563742e000000000000600082015250565b60006140e4601a83613264565b91506140ef826140ae565b602082019050919050565b60006020820190508181036000830152614113816140d7565b9050919050565b600061412582613225565b915061413083613225565b925082820390508181111561414857614147613cfb565b5b92915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006141aa602f83613264565b91506141b58261414e565b604082019050919050565b600060208201905081810360008301526141d98161419d565b9050919050565b600081905092915050565b60006141f682613259565b61420081856141e0565b9350614210818560208601613275565b80840191505092915050565b6000815461422981613a43565b61423381866141e0565b9450600182166000811461424e576001811461426357614296565b60ff1983168652811515820286019350614296565b61426c85613a7f565b60005b8381101561428e5781548189015260018201915060208101905061426f565b838801955050505b50505092915050565b60006142ab82866141eb565b91506142b782856141eb565b91506142c3828461421c565b9150819050949350505050565b6142d982613259565b67ffffffffffffffff8111156142f2576142f16136b8565b5b6142fc8254613a43565b614307828285613b9e565b600060209050601f83116001811461433a5760008415614328578287015190505b6143328582613c0f565b86555061439a565b601f19841661434886613a7f565b60005b828110156143705784890151825560018201915060208501945060208101905061434b565b8683101561438d5784890151614389601f891682613bf1565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143fe602683613264565b9150614409826143a2565b604082019050919050565b6000602082019050818103600083015261442d816143f1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061446a602083613264565b915061447582614434565b602082019050919050565b600060208201905081810360008301526144998161445d565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006144fc602a83613264565b9150614507826144a0565b604082019050919050565b6000602082019050818103600083015261452b816144ef565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614568601983613264565b915061457382614532565b602082019050919050565b600060208201905081810360008301526145978161455b565b9050919050565b60006145a982613225565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145db576145da613cfb565b5b600182019050919050565b60006145f182613225565b91506145fc83613225565b92508261460c5761460b613d6c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061466d82614646565b6146778185614651565b9350614687818560208601613275565b6146908161329f565b840191505092915050565b60006080820190506146b06000830187613396565b6146bd6020830186613396565b6146ca604083018561322f565b81810360608301526146dc8184614662565b905095945050505050565b6000815190506146f681613196565b92915050565b60006020828403121561471257614711613160565b5b6000614720848285016146e7565b9150509291505056fea26469706673582212205fd919b19bfbff4249241b7fab02253c67f8e3658278511b2d88019c1cc41ce664736f6c63430008130033000000000000000000000000cc1d1872dae0c4a22bd1e243c292eac8bf48839500000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode
0x6080604052600436106102885760003560e01c8063715018a61161015a578063c1e1ce29116100c1578063dc33e6811161007a578063dc33e68114610988578063e75179a4146109c5578063e985e9c5146109ee578063f2fde38b14610a2b578063f4a0a52814610a54578063fb796e6c14610a7d57610288565b8063c1e1ce2914610878578063c21b471b146108a3578063c6682862146108cc578063c6ab67a3146108f7578063c87b56dd14610922578063da3ef23f1461095f57610288565b8063a810e6ff11610113578063a810e6ff14610765578063aa592f251461078e578063b629f192146107b9578063b7c0b8e8146107f6578063b88d4fde1461081f578063bbadfe761461083b57610288565b8063715018a61461067b57806378acea1e146106925780638342083a146106bb5780638da5cb5b146106e657806395d89b4114610711578063a22cb4651461073c57610288565b80633418f565116101fe578063559c55b9116101b7578063559c55b91461055957806355f804b314610582578063601e5e77146105ab5780636352211e146105d65780636817c76c1461061357806370a082311461063e57610288565b80633418f5651461047b57806334531828146104b85780633ccfd60b146104e1578063402c3856146104f857806342842e0e1461051457806348c5bdaa1461053057610288565b80631096952311610250578063109695231461037957806318160ddd146103a257806323b872dd146103cd57806326aa420a146103e95780632a55205a1461041257806332cb6b0c1461045057610288565b806301ffc9a71461028d578063066453df146102ca57806306fdde03146102f5578063081812fc14610320578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906131c2565b610aa8565b6040516102c1919061320a565b60405180910390f35b3480156102d657600080fd5b506102df610aca565b6040516102ec919061323e565b60405180910390f35b34801561030157600080fd5b5061030a610ad0565b60405161031791906132e9565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190613337565b610b62565b60405161035491906133a5565b60405180910390f35b610377600480360381019061037291906133ec565b610be1565b005b34801561038557600080fd5b506103a0600480360381019061039b9190613491565b610c50565b005b3480156103ae57600080fd5b506103b7610d6f565b6040516103c4919061323e565b60405180910390f35b6103e760048036038101906103e291906134de565b610d86565b005b3480156103f557600080fd5b50610410600480360381019061040b9190613337565b610dff565b005b34801561041e57600080fd5b5061043960048036038101906104349190613531565b610e11565b604051610447929190613571565b60405180910390f35b34801561045c57600080fd5b50610465610ffb565b604051610472919061323e565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d919061359a565b611001565b6040516104af919061323e565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906131c2565b611019565b005b3480156104ed57600080fd5b506104f661108e565b005b610512600480360381019061050d91906135f3565b61113c565b005b61052e600480360381019061052991906134de565b611488565b005b34801561053c57600080fd5b5061055760048036038101906105529190613337565b611501565b005b34801561056557600080fd5b50610580600480360381019061057b9190613337565b611513565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613491565b611525565b005b3480156105b757600080fd5b506105c06115fc565b6040516105cd919061323e565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190613337565b611602565b60405161060a91906133a5565b60405180910390f35b34801561061f57600080fd5b50610628611614565b604051610635919061323e565b60405180910390f35b34801561064a57600080fd5b506106656004803603810190610660919061359a565b61161a565b604051610672919061323e565b60405180910390f35b34801561068757600080fd5b506106906116d2565b005b34801561069e57600080fd5b506106b960048036038101906106b49190613646565b6116e6565b005b3480156106c757600080fd5b506106d061170b565b6040516106dd919061323e565b60405180910390f35b3480156106f257600080fd5b506106fb611711565b60405161070891906133a5565b60405180910390f35b34801561071d57600080fd5b5061072661173b565b60405161073391906132e9565b60405180910390f35b34801561074857600080fd5b50610763600480360381019061075e9190613673565b6117cd565b005b34801561077157600080fd5b5061078c6004803603810190610787919061359a565b61183c565b005b34801561079a57600080fd5b506107a3611965565b6040516107b0919061323e565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db919061359a565b61196a565b6040516107ed919061320a565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190613646565b61198a565b005b610839600480360381019061083491906137e3565b611a68565b005b34801561084757600080fd5b50610862600480360381019061085d91906131c2565b611ae3565b60405161086f919061320a565b60405180910390f35b34801561088457600080fd5b5061088d611b03565b60405161089a919061320a565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c591906138aa565b611b16565b005b3480156108d857600080fd5b506108e1611b2c565b6040516108ee91906132e9565b60405180910390f35b34801561090357600080fd5b5061090c611bba565b60405161091991906132e9565b60405180910390f35b34801561092e57600080fd5b5061094960048036038101906109449190613337565b611c48565b60405161095691906132e9565b60405180910390f35b34801561096b57600080fd5b506109866004803603810190610981919061398b565b611cf2565b005b34801561099457600080fd5b506109af60048036038101906109aa919061359a565b611d0d565b6040516109bc919061323e565b60405180910390f35b3480156109d157600080fd5b506109ec60048036038101906109e7919061359a565b611d1f565b005b3480156109fa57600080fd5b50610a156004803603810190610a1091906139d4565b611e2f565b604051610a22919061320a565b60405180910390f35b348015610a3757600080fd5b50610a526004803603810190610a4d919061359a565b611ec3565b005b348015610a6057600080fd5b50610a7b6004803603810190610a769190613337565b611f46565b005b348015610a8957600080fd5b50610a92611f58565b604051610a9f919061320a565b60405180910390f35b6000610ab382611f6b565b80610ac35750610ac282611ffd565b5b9050919050565b600f5481565b606060028054610adf90613a43565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0b90613a43565b8015610b585780601f10610b2d57610100808354040283529160200191610b58565b820191906000526020600020905b815481529060010190602001808311610b3b57829003601f168201915b5050505050905090565b6000610b6d82612077565b610ba3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81601260009054906101000a900460ff168015610c405769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610c3a573d6000803e3d6000fd5b6000603a525b610c4a84846120d6565b50505050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615610d09576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1161221a565b600060118054610d2090613a43565b905014610d59576040517f19e24c1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160119182610d6a929190613c2b565b505050565b6000610d79612298565b6001546000540303905090565b82601260009054906101000a900460ff168015610ded57338260601b60601c14610dec5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610de6573d6000803e3d6000fd5b6000603a525b5b610df88585856122a1565b5050505050565b610e0761221a565b80600e8190555050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610fa65760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610fb06125c3565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610fdc9190613d2a565b610fe69190613d9b565b90508160000151819350935050509250929050565b61029481565b60146020528060005260406000206000915090505481565b61102161221a565b600160136000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61109661221a565b60003373ffffffffffffffffffffffffffffffffffffffff16476040516110bc90613dfd565b60006040518083038185875af1925050503d80600081146110f9576040519150601f19603f3d011682016040523d82523d6000602084013e6110fe565b606091505b5050905080611139576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b600e54821115611181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117890613e5e565b60405180910390fd5b60011515601560009054906101000a900460ff161515146111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90613eca565b60405180910390fd5b600f5482111561121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390613f5c565b60405180910390fd5b600f5482601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461126a9190613f7c565b11156112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290614022565b60405180910390fd5b610294826112b76125cd565b6112c19190613f7c565b1115611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f99061408e565b60405180910390fd5b6000601054836113129190613d2a565b905080341015611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e906140fa565b60405180910390fd5b61136184846125e0565b82600e6000828254611373919061411a565b9250508190555082601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113c99190613f7c565b9250508190555081601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080341115611482573373ffffffffffffffffffffffffffffffffffffffff166108fc8234611455919061411a565b9081150290604051600060405180830381858888f19350505050158015611480573d6000803e3d6000fd5b505b50505050565b82601260009054906101000a900460ff1680156114ef57338260601b60601c146114ee5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6114e8573d6000803e3d6000fd5b6000603a525b5b6114fa85858561279b565b5050505050565b61150961221a565b80600f8190555050565b61151b61221a565b80600d8190555050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff16156115de576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115e661221a565b8181600b91826115f7929190613c2b565b505050565b600d5481565b600061160d826127bb565b9050919050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611681576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116da61221a565b6116e46000612887565b565b6116ee61221a565b80601560006101000a81548160ff02191690831515021790555050565b600e5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461174a90613a43565b80601f016020809104026020016040519081016040528092919081815260200182805461177690613a43565b80156117c35780601f10611798576101008083540402835291602001916117c3565b820191906000526020600020905b8154815290600101906020018083116117a657829003601f168201915b5050505050905090565b81601260009054906101000a900460ff16801561182c5769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611826573d6000803e3d6000fd5b6000603a525b611836848461294d565b50505050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff16156118f5576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118fd61221a565b610294600d5461190b6125cd565b6119159190613f7c565b1115611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d9061408e565b60405180910390fd5b61196281600d546125e0565b50565b600581565b60166020528060005260406000206000915054906101000a900460ff1681565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611a43576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a4b61221a565b80601260006101000a81548160ff02191690831515021790555050565b83601260009054906101000a900460ff168015611acf57338260601b60601c14611ace5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611ac8573d6000803e3d6000fd5b6000603a525b5b611adb86868686612a58565b505050505050565b60136020528060005260406000206000915054906101000a900460ff1681565b601560009054906101000a900460ff1681565b611b1e61221a565b611b288282612acb565b5050565b600c8054611b3990613a43565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6590613a43565b8015611bb25780601f10611b8757610100808354040283529160200191611bb2565b820191906000526020600020905b815481529060010190602001808311611b9557829003601f168201915b505050505081565b60118054611bc790613a43565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf390613a43565b8015611c405780601f10611c1557610100808354040283529160200191611c40565b820191906000526020600020905b815481529060010190602001808311611c2357829003601f168201915b505050505081565b6060611c5382612077565b611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c89906141c0565b60405180910390fd5b6000611c9c612c60565b90506000815111611cbc5760405180602001604052806000815250611cea565b80611cc684612cf2565b600c604051602001611cda9392919061429f565b6040516020818303038152906040525b915050919050565b611cfa61221a565b80600c9081611d0991906142d0565b5050565b6000611d1882612e52565b9050919050565b6013600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611dd8576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611de061221a565b6005611dea6125cd565b10611e21576040517f1f0f14ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e2c8160056125e0565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ecb61221a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3190614414565b60405180910390fd5b611f4381612887565b50565b611f4e61221a565b8060108190555050565b601260009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fc657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ff65750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612070575061206f82612ea9565b5b9050919050565b600081612082612298565b11158015612091575060005482105b80156120cf575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006120e182611602565b90508073ffffffffffffffffffffffffffffffffffffffff16612102612f13565b73ffffffffffffffffffffffffffffffffffffffff16146121655761212e81612129612f13565b611e2f565b612164576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612222612f1b565b73ffffffffffffffffffffffffffffffffffffffff16612240611711565b73ffffffffffffffffffffffffffffffffffffffff1614612296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228d90614480565b60405180910390fd5b565b60006001905090565b60006122ac826127bb565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612313576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061231f84612f23565b915091506123358187612330612f13565b612f4a565b6123815761234a86612345612f13565b611e2f565b612380576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123e7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123f48686866001612f8e565b80156123ff57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506124cd856124a9888887612f94565b7c020000000000000000000000000000000000000000000000000000000017612fbc565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036125535760006001850190506000600460008381526020019081526020016000205403612551576000548114612550578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125bb8686866001612fe7565b505050505050565b6000612710905090565b60006125d7612298565b60005403905090565b60008054905060008203612620576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61262d6000848385612f8e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506126a4836126956000866000612f94565b61269e85612fed565b17612fbc565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461274557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061270a565b5060008203612780576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506127966000848385612fe7565b505050565b6127b683838360405180602001604052806000815250611a68565b505050565b600080829050806127ca612298565b116128505760005481101561284f5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361284d575b60008103612843576004600083600190039350838152602001908152602001600020549050612819565b8092505050612882565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806007600061295a612f13565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612a07612f13565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a4c919061320a565b60405180910390a35050565b612a63848484610d86565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ac557612a8e84848484612ffd565b612ac4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612ad36125c3565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2890614512565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b979061457e565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600b8054612c6f90613a43565b80601f0160208091040260200160405190810160405280929190818152602001828054612c9b90613a43565b8015612ce85780601f10612cbd57610100808354040283529160200191612ce8565b820191906000526020600020905b815481529060010190602001808311612ccb57829003601f168201915b5050505050905090565b606060008203612d39576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e4d565b600082905060005b60008214612d6b578080612d549061459e565b915050600a82612d649190613d9b565b9150612d41565b60008167ffffffffffffffff811115612d8757612d866136b8565b5b6040519080825280601f01601f191660200182016040528015612db95781602001600182028036833780820191505090505b5090505b60008514612e4657600182612dd2919061411a565b9150600a85612de191906145e6565b6030612ded9190613f7c565b60f81b818381518110612e0357612e02614617565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e3f9190613d9b565b9450612dbd565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612fab86868461314d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613023612f13565b8786866040518563ffffffff1660e01b8152600401613045949392919061469b565b6020604051808303816000875af192505050801561308157506040513d601f19601f8201168201806040525081019061307e91906146fc565b60015b6130fa573d80600081146130b1576040519150601f19603f3d011682016040523d82523d6000602084013e6130b6565b606091505b5060008151036130f2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61319f8161316a565b81146131aa57600080fd5b50565b6000813590506131bc81613196565b92915050565b6000602082840312156131d8576131d7613160565b5b60006131e6848285016131ad565b91505092915050565b60008115159050919050565b613204816131ef565b82525050565b600060208201905061321f60008301846131fb565b92915050565b6000819050919050565b61323881613225565b82525050565b6000602082019050613253600083018461322f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613293578082015181840152602081019050613278565b60008484015250505050565b6000601f19601f8301169050919050565b60006132bb82613259565b6132c58185613264565b93506132d5818560208601613275565b6132de8161329f565b840191505092915050565b6000602082019050818103600083015261330381846132b0565b905092915050565b61331481613225565b811461331f57600080fd5b50565b6000813590506133318161330b565b92915050565b60006020828403121561334d5761334c613160565b5b600061335b84828501613322565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061338f82613364565b9050919050565b61339f81613384565b82525050565b60006020820190506133ba6000830184613396565b92915050565b6133c981613384565b81146133d457600080fd5b50565b6000813590506133e6816133c0565b92915050565b6000806040838503121561340357613402613160565b5b6000613411858286016133d7565b925050602061342285828601613322565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126134515761345061342c565b5b8235905067ffffffffffffffff81111561346e5761346d613431565b5b60208301915083600182028301111561348a57613489613436565b5b9250929050565b600080602083850312156134a8576134a7613160565b5b600083013567ffffffffffffffff8111156134c6576134c5613165565b5b6134d28582860161343b565b92509250509250929050565b6000806000606084860312156134f7576134f6613160565b5b6000613505868287016133d7565b9350506020613516868287016133d7565b925050604061352786828701613322565b9150509250925092565b6000806040838503121561354857613547613160565b5b600061355685828601613322565b925050602061356785828601613322565b9150509250929050565b60006040820190506135866000830185613396565b613593602083018461322f565b9392505050565b6000602082840312156135b0576135af613160565b5b60006135be848285016133d7565b91505092915050565b6135d0816131ef565b81146135db57600080fd5b50565b6000813590506135ed816135c7565b92915050565b60008060006060848603121561360c5761360b613160565b5b600061361a868287016133d7565b935050602061362b86828701613322565b925050604061363c868287016135de565b9150509250925092565b60006020828403121561365c5761365b613160565b5b600061366a848285016135de565b91505092915050565b6000806040838503121561368a57613689613160565b5b6000613698858286016133d7565b92505060206136a9858286016135de565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136f08261329f565b810181811067ffffffffffffffff8211171561370f5761370e6136b8565b5b80604052505050565b6000613722613156565b905061372e82826136e7565b919050565b600067ffffffffffffffff82111561374e5761374d6136b8565b5b6137578261329f565b9050602081019050919050565b82818337600083830152505050565b600061378661378184613733565b613718565b9050828152602081018484840111156137a2576137a16136b3565b5b6137ad848285613764565b509392505050565b600082601f8301126137ca576137c961342c565b5b81356137da848260208601613773565b91505092915050565b600080600080608085870312156137fd576137fc613160565b5b600061380b878288016133d7565b945050602061381c878288016133d7565b935050604061382d87828801613322565b925050606085013567ffffffffffffffff81111561384e5761384d613165565b5b61385a878288016137b5565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b61388781613866565b811461389257600080fd5b50565b6000813590506138a48161387e565b92915050565b600080604083850312156138c1576138c0613160565b5b60006138cf858286016133d7565b92505060206138e085828601613895565b9150509250929050565b600067ffffffffffffffff821115613905576139046136b8565b5b61390e8261329f565b9050602081019050919050565b600061392e613929846138ea565b613718565b90508281526020810184848401111561394a576139496136b3565b5b613955848285613764565b509392505050565b600082601f8301126139725761397161342c565b5b813561398284826020860161391b565b91505092915050565b6000602082840312156139a1576139a0613160565b5b600082013567ffffffffffffffff8111156139bf576139be613165565b5b6139cb8482850161395d565b91505092915050565b600080604083850312156139eb576139ea613160565b5b60006139f9858286016133d7565b9250506020613a0a858286016133d7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a5b57607f821691505b602082108103613a6e57613a6d613a14565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ae17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613aa4565b613aeb8683613aa4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613b28613b23613b1e84613225565b613b03565b613225565b9050919050565b6000819050919050565b613b4283613b0d565b613b56613b4e82613b2f565b848454613ab1565b825550505050565b600090565b613b6b613b5e565b613b76818484613b39565b505050565b5b81811015613b9a57613b8f600082613b63565b600181019050613b7c565b5050565b601f821115613bdf57613bb081613a7f565b613bb984613a94565b81016020851015613bc8578190505b613bdc613bd485613a94565b830182613b7b565b50505b505050565b600082821c905092915050565b6000613c0260001984600802613be4565b1980831691505092915050565b6000613c1b8383613bf1565b9150826002028217905092915050565b613c358383613a74565b67ffffffffffffffff811115613c4e57613c4d6136b8565b5b613c588254613a43565b613c63828285613b9e565b6000601f831160018114613c925760008415613c80578287013590505b613c8a8582613c0f565b865550613cf2565b601f198416613ca086613a7f565b60005b82811015613cc857848901358255600182019150602085019450602081019050613ca3565b86831015613ce55784890135613ce1601f891682613bf1565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d3582613225565b9150613d4083613225565b9250828202613d4e81613225565b91508282048414831517613d6557613d64613cfb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613da682613225565b9150613db183613225565b925082613dc157613dc0613d6c565b5b828204905092915050565b600081905092915050565b50565b6000613de7600083613dcc565b9150613df282613dd7565b600082019050919050565b6000613e0882613dda565b9150819050919050565b7f4e465420616d6f756e7420657863656564730000000000000000000000000000600082015250565b6000613e48601283613264565b9150613e5382613e12565b602082019050919050565b60006020820190508181036000830152613e7781613e3b565b9050919050565b7f4d696e74696e67206973206e6f7420796574206f70656e2e0000000000000000600082015250565b6000613eb4601883613264565b9150613ebf82613e7e565b602082019050919050565b60006020820190508181036000830152613ee381613ea7565b9050919050565b7f416d6f756e742045786365656473204d6178696d756d204d696e747320416c6c60008201527f6f77656420506572204163636f756e742e000000000000000000000000000000602082015250565b6000613f46603183613264565b9150613f5182613eea565b604082019050919050565b60006020820190508181036000830152613f7581613f39565b9050919050565b6000613f8782613225565b9150613f9283613225565b9250828201905080821115613faa57613fa9613cfb565b5b92915050565b7f596f752063616e206e6f74206d696e74206d6f7265207468616e204d6178204d60008201527f696e74204c696d69742e00000000000000000000000000000000000000000000602082015250565b600061400c602a83613264565b915061401782613fb0565b604082019050919050565b6000602082019050818103600083015261403b81613fff565b9050919050565b7f45786365656473204d6178696d756d20537570706c7900000000000000000000600082015250565b6000614078601683613264565b915061408382614042565b602082019050919050565b600060208201905081810360008301526140a78161406b565b9050919050565b7f45746865722073656e74206973206e6f7420636f72726563742e000000000000600082015250565b60006140e4601a83613264565b91506140ef826140ae565b602082019050919050565b60006020820190508181036000830152614113816140d7565b9050919050565b600061412582613225565b915061413083613225565b925082820390508181111561414857614147613cfb565b5b92915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006141aa602f83613264565b91506141b58261414e565b604082019050919050565b600060208201905081810360008301526141d98161419d565b9050919050565b600081905092915050565b60006141f682613259565b61420081856141e0565b9350614210818560208601613275565b80840191505092915050565b6000815461422981613a43565b61423381866141e0565b9450600182166000811461424e576001811461426357614296565b60ff1983168652811515820286019350614296565b61426c85613a7f565b60005b8381101561428e5781548189015260018201915060208101905061426f565b838801955050505b50505092915050565b60006142ab82866141eb565b91506142b782856141eb565b91506142c3828461421c565b9150819050949350505050565b6142d982613259565b67ffffffffffffffff8111156142f2576142f16136b8565b5b6142fc8254613a43565b614307828285613b9e565b600060209050601f83116001811461433a5760008415614328578287015190505b6143328582613c0f565b86555061439a565b601f19841661434886613a7f565b60005b828110156143705784890151825560018201915060208501945060208101905061434b565b8683101561438d5784890151614389601f891682613bf1565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143fe602683613264565b9150614409826143a2565b604082019050919050565b6000602082019050818103600083015261442d816143f1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061446a602083613264565b915061447582614434565b602082019050919050565b600060208201905081810360008301526144998161445d565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006144fc602a83613264565b9150614507826144a0565b604082019050919050565b6000602082019050818103600083015261452b816144ef565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614568601983613264565b915061457382614532565b602082019050919050565b600060208201905081810360008301526145978161455b565b9050919050565b60006145a982613225565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145db576145da613cfb565b5b600182019050919050565b60006145f182613225565b91506145fc83613225565b92508261460c5761460b613d6c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061466d82614646565b6146778185614651565b9350614687818560208601613275565b6146908161329f565b840191505092915050565b60006080820190506146b06000830187613396565b6146bd6020830186613396565b6146ca604083018561322f565b81810360608301526146dc8184614662565b905095945050505050565b6000815190506146f681613196565b92915050565b60006020828403121561471257614711613160565b5b6000614720848285016146e7565b9150509291505056fea26469706673582212205fd919b19bfbff4249241b7fab02253c67f8e3658278511b2d88019c1cc41ce664736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cc1d1872dae0c4a22bd1e243c292eac8bf48839500000000000000000000000000000000000000000000000000000000000003e8
-----Decoded View---------------
Arg [0] : _royaltyReceiver (address): 0xcC1D1872Dae0c4A22bd1E243C292Eac8bf488395
Arg [1] : _royaltyFraction (uint96): 1000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000cc1d1872dae0c4a22bd1e243c292eac8bf488395
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode Sourcemap
80174:8529:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81509:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80546:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40962:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47453:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87245:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84207:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36713:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87637:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85975:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15758:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;80454:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80766:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83049:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86508:183;;;;;;;;;;;;;:::i;:::-;;84959:898;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88028:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86308:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86094:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83947:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80415:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42355:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80592:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37897:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21031:103;;;;;;;;;;;;;:::i;:::-;;86206:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80502:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20383:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41138:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86851:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84752:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80372:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80858;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83337:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88427:273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80714:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80821:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83688:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80328:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80636:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82142:446;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82006:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82756:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84576:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48402:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21289:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85865:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80671:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81509:274;81640:4;81682:38;81708:11;81682:25;:38::i;:::-;:93;;;;81737:38;81763:11;81737:25;:38::i;:::-;81682:93;81662:113;;81509:274;;;:::o;80546:39::-;;;;:::o;40962:100::-;41016:13;41049:5;41042:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40962:100;:::o;47453:218::-;47529:7;47554:16;47562:7;47554;:16::i;:::-;47549:64;;47579:34;;;;;;;;;;;;;;47549:64;47633:15;:24;47649:7;47633:24;;;;;;;;;;;:30;;;;;;;;;;;;47626:37;;47453:218;;;:::o;87245:232::-;87385:8;87395:24;;;;;;;;;;;78759:7;78756:925;;;78888:22;78882:4;78875:36;78989:9;78983:4;78976:23;79141:8;79137:2;79133:17;79129:2;79125:26;79119:4;79112:40;79328:4;79322;79316;79310;79283:25;79276:5;79265:68;79255:290;;79457:16;79451:4;79445;79430:44;79509:16;79503:4;79496:30;79255:290;79664:1;79658:4;79651:15;78756:925;87437:32:::1;87451:8;87461:7;87437:13;:32::i;:::-;87245:232:::0;;;;:::o;84207:224::-;81387:14;:23;81402:7;;;;81387:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81383:52;;;81419:16;;;;;;;;;;;;;;81383:52;20269:13:::1;:11;:13::i;:::-;84342:1:::2;84316:14;84310:28;;;;;:::i;:::-;;;:33;84306:72;;84352:26;;;;;;;;;;;;;;84306:72;84408:15;;84391:14;:32;;;;;;;:::i;:::-;;84207:224:::0;;:::o;36713:323::-;36774:7;37002:15;:13;:15::i;:::-;36987:12;;36971:13;;:28;:46;36964:53;;36713:323;:::o;87637:231::-;87780:4;87786:24;;;;;;;;;;;76532:7;76529:1643;;;76745:8;76737:4;76733:2;76729:13;76725:2;76721:22;76718:36;76708:1449;;77060:22;77054:4;77047:36;77169:9;77163:4;77156:23;77262:8;77256:4;77249:22;77455:4;77449;77443;77437;77410:25;77403:5;77392:68;77382:306;;77592:16;77586:4;77580;77565:44;77648:16;77642:4;77635:30;77382:306;78136:1;78130:4;78123:15;76708:1449;76529:1643;87823:37:::1;87842:4;87848:2;87852:7;87823:18;:37::i;:::-;87637:231:::0;;;;;:::o;85975:111::-;20269:13;:11;:13::i;:::-;86068:10:::1;86052:13;:26;;;;85975:111:::0;:::o;15758:442::-;15855:7;15864;15884:26;15913:17;:27;15931:8;15913:27;;;;;;;;;;;15884:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15985:1;15957:30;;:7;:16;;;:30;;;15953:92;;16014:19;16004:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15953:92;16057:21;16122:17;:15;:17::i;:::-;16081:58;;16095:7;:23;;;16082:36;;:10;:36;;;;:::i;:::-;16081:58;;;;:::i;:::-;16057:82;;16160:7;:16;;;16178:13;16152:40;;;;;;15758:442;;;;;:::o;80454:40::-;80491:3;80454:40;:::o;80766:44::-;;;;;;;;;;;;;;;;;:::o;83049:96::-;20269:13;:11;:13::i;:::-;83133:4:::1;83112:14;:18;83127:2;83112:18;;;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;83049:96:::0;:::o;86508:183::-;20269:13;:11;:13::i;:::-;86559:12:::1;86585:10;86577:24;;86609:21;86577:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86558:77;;;86651:7;86646:37;;86667:16;;;;;;;;;;;;;;86646:37;86547:144;86508:183::o:0;84959:898::-;85069:13;;85057:8;:25;;85049:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;85138:4;85124:18;;:10;;;;;;;;;;;:18;;;85116:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;85202:20;;85190:8;:32;;85182:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;85326:20;;85314:8;85295:12;:16;85308:2;85295:16;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;:51;;85287:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;80491:3;85429:8;85412:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;85404:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;85491:14;85519:9;;85508:8;:20;;;;:::i;:::-;85491:37;;85561:9;85548;:22;;85539:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;85613:19;85619:2;85623:8;85613:5;:19::i;:::-;85660:8;85643:13;;:25;;;;;;;:::i;:::-;;;;;;;;85699:8;85679:12;:16;85692:2;85679:16;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;85729:5;85718:4;:8;85723:2;85718:8;;;;;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;85761:9;85749;:21;85745:105;;;85795:10;85787:28;;:51;85828:9;85816;:21;;;;:::i;:::-;85787:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85745:105;85038:819;84959:898;;;:::o;88028:239::-;88175:4;88181:24;;;;;;;;;;;76532:7;76529:1643;;;76745:8;76737:4;76733:2;76729:13;76725:2;76721:22;76718:36;76708:1449;;77060:22;77054:4;77047:36;77169:9;77163:4;77156:23;77262:8;77256:4;77249:22;77455:4;77449;77443;77437;77410:25;77403:5;77392:68;77382:306;;77592:16;77586:4;77580;77565:44;77648:16;77642:4;77635:30;77382:306;78136:1;78130:4;78123:15;76708:1449;76529:1643;88218:41:::1;88241:4;88247:2;88251:7;88218:22;:41::i;:::-;88028:239:::0;;;;;:::o;86308:119::-;20269:13;:11;:13::i;:::-;86411:8:::1;86388:20;:31;;;;86308:119:::0;:::o;86094:106::-;20269:13;:11;:13::i;:::-;86186:6:::1;86171:12;:21;;;;86094:106:::0;:::o;83947:123::-;81387:14;:23;81402:7;;;;81387:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81383:52;;;81419:16;;;;;;;;;;;;;;81383:52;20269:13:::1;:11;:13::i;:::-;84051:11:::2;;84035:13;:27;;;;;;;:::i;:::-;;83947:123:::0;;:::o;80415:32::-;;;;:::o;42355:152::-;42427:7;42470:27;42489:7;42470:18;:27::i;:::-;42447:52;;42355:152;;;:::o;80592:37::-;;;;:::o;37897:233::-;37969:7;38010:1;37993:19;;:5;:19;;;37989:60;;38021:28;;;;;;;;;;;;;;37989:60;32056:13;38067:18;:25;38086:5;38067:25;;;;;;;;;;;;;;;;:55;38060:62;;37897:233;;;:::o;21031:103::-;20269:13;:11;:13::i;:::-;21096:30:::1;21123:1;21096:18;:30::i;:::-;21031:103::o:0;86206:94::-;20269:13;:11;:13::i;:::-;86285:7:::1;86272:10;;:20;;;;;;;;;;;;;;;;;;86206:94:::0;:::o;80502:34::-;;;;:::o;20383:87::-;20429:7;20456:6;;;;;;;;;;;20449:13;;20383:87;:::o;41138:104::-;41194:13;41227:7;41220:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41138:104;:::o;86851:234::-;86982:8;86992:24;;;;;;;;;;;78759:7;78756:925;;;78888:22;78882:4;78875:36;78989:9;78983:4;78976:23;79141:8;79137:2;79133:17;79129:2;79125:26;79119:4;79112:40;79328:4;79322;79316;79310;79283:25;79276:5;79265:68;79255:290;;79457:16;79451:4;79445;79430:44;79509:16;79503:4;79496:30;79255:290;79664:1;79658:4;79651:15;78756:925;87034:43:::1;87058:8;87068;87034:23;:43::i;:::-;86851:234:::0;;;;:::o;84752:199::-;81387:14;:23;81402:7;;;;81387:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81383:52;;;81419:16;;;;;;;;;;;;;;81383:52;20269:13:::1;:11;:13::i;:::-;80491:3:::2;84854:12;;84837:14;:12;:14::i;:::-;:29;;;;:::i;:::-;:43;;84829:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;84920:23;84926:2;84930:12;;84920:5;:23::i;:::-;84752:199:::0;:::o;80372:36::-;80407:1;80372:36;:::o;80858:::-;;;;;;;;;;;;;;;;;;;;;;:::o;83337:128::-;81387:14;:23;81402:7;;;;81387:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81383:52;;;81419:16;;;;;;;;;;;;;;81383:52;20269:13:::1;:11;:13::i;:::-;83452:5:::2;83425:24;;:32;;;;;;;;;;;;;;;;;;83337:128:::0;:::o;88427:273::-;88602:4;88608:24;;;;;;;;;;;76532:7;76529:1643;;;76745:8;76737:4;76733:2;76729:13;76725:2;76721:22;76718:36;76708:1449;;77060:22;77054:4;77047:36;77169:9;77163:4;77156:23;77262:8;77256:4;77249:22;77455:4;77449;77443;77437;77410:25;77403:5;77392:68;77382:306;;77592:16;77586:4;77580;77565:44;77648:16;77642:4;77635:30;77382:306;78136:1;78130:4;78123:15;76708:1449;76529:1643;88645:47:::1;88668:4;88674:2;88678:7;88687:4;88645:22;:47::i;:::-;88427:273:::0;;;;;;:::o;80714:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;80821:30::-;;;;;;;;;;;;;:::o;83688:147::-;20269:13;:11;:13::i;:::-;83782:45:::1;83801:8;83811:15;83782:18;:45::i;:::-;83688:147:::0;;:::o;80328:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80636:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;82142:446::-;82240:13;82283:16;82291:7;82283;:16::i;:::-;82267:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;82385:28;82416:10;:8;:10::i;:::-;82385:41;;82471:1;82446:14;82440:28;:32;:140;;;;;;;;;;;;;;;;;82508:14;82524:25;82541:7;82524:16;:25::i;:::-;82551:13;82491:74;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82440:140;82433:147;;;82142:446;;;:::o;82006:128::-;20269:13;:11;:13::i;:::-;82109:17:::1;82093:13;:33;;;;;;:::i;:::-;;82006:128:::0;:::o;82756:119::-;82818:7;82845:22;82859:7;82845:13;:22::i;:::-;82838:29;;82756:119;;;:::o;84576:168::-;81387:14;:23;81402:7;;;;81387:23;;;;;;;;;;;;;;;;;;;;;;;;;;;81383:52;;;81419:16;;;;;;;;;;;;;;81383:52;20269:13:::1;:11;:13::i;:::-;80407:1:::2;84648:14;:12;:14::i;:::-;:26;84644:62;;84683:23;;;;;;;;;;;;;;84644:62;84717:19;84723:2;80407:1;84717:5;:19::i;:::-;84576:168:::0;:::o;48402:164::-;48499:4;48523:18;:25;48542:5;48523:25;;;;;;;;;;;;;;;:35;48549:8;48523:35;;;;;;;;;;;;;;;;;;;;;;;;;48516:42;;48402:164;;;;:::o;21289:201::-;20269:13;:11;:13::i;:::-;21398:1:::1;21378:22;;:8;:22;;::::0;21370:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21454:28;21473:8;21454:18;:28::i;:::-;21289:201:::0;:::o;85865:102::-;20269:13;:11;:13::i;:::-;85950:9:::1;85938;:21;;;;85865:102:::0;:::o;80671:36::-;;;;;;;;;;;;;:::o;40060:639::-;40145:4;40484:10;40469:25;;:11;:25;;;;:102;;;;40561:10;40546:25;;:11;:25;;;;40469:102;:179;;;;40638:10;40623:25;;:11;:25;;;;40469:179;40449:199;;40060:639;;;:::o;15488:215::-;15590:4;15629:26;15614:41;;;:11;:41;;;;:81;;;;15659:36;15683:11;15659:23;:36::i;:::-;15614:81;15607:88;;15488:215;;;:::o;48824:282::-;48889:4;48945:7;48926:15;:13;:15::i;:::-;:26;;:66;;;;;48979:13;;48969:7;:23;48926:66;:153;;;;;49078:1;32832:8;49030:17;:26;49048:7;49030:26;;;;;;;;;;;;:44;:49;48926:153;48906:173;;48824:282;;;:::o;46886:408::-;46975:13;46991:16;46999:7;46991;:16::i;:::-;46975:32;;47047:5;47024:28;;:19;:17;:19::i;:::-;:28;;;47020:175;;47072:44;47089:5;47096:19;:17;:19::i;:::-;47072:16;:44::i;:::-;47067:128;;47144:35;;;;;;;;;;;;;;47067:128;47020:175;47240:2;47207:15;:24;47223:7;47207:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;47278:7;47274:2;47258:28;;47267:5;47258:28;;;;;;;;;;;;46964:330;46886:408;;:::o;20548:132::-;20623:12;:10;:12::i;:::-;20612:23;;:7;:5;:7::i;:::-;:23;;;20604:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20548:132::o;36229:92::-;36285:7;36312:1;36305:8;;36229:92;:::o;51092:2825::-;51234:27;51264;51283:7;51264:18;:27::i;:::-;51234:57;;51349:4;51308:45;;51324:19;51308:45;;;51304:86;;51362:28;;;;;;;;;;;;;;51304:86;51404:27;51433:23;51460:35;51487:7;51460:26;:35::i;:::-;51403:92;;;;51595:68;51620:15;51637:4;51643:19;:17;:19::i;:::-;51595:24;:68::i;:::-;51590:180;;51683:43;51700:4;51706:19;:17;:19::i;:::-;51683:16;:43::i;:::-;51678:92;;51735:35;;;;;;;;;;;;;;51678:92;51590:180;51801:1;51787:16;;:2;:16;;;51783:52;;51812:23;;;;;;;;;;;;;;51783:52;51848:43;51870:4;51876:2;51880:7;51889:1;51848:21;:43::i;:::-;51984:15;51981:160;;;52124:1;52103:19;52096:30;51981:160;52521:18;:24;52540:4;52521:24;;;;;;;;;;;;;;;;52519:26;;;;;;;;;;;;52590:18;:22;52609:2;52590:22;;;;;;;;;;;;;;;;52588:24;;;;;;;;;;;52912:146;52949:2;52998:45;53013:4;53019:2;53023:19;52998:14;:45::i;:::-;33112:8;52970:73;52912:18;:146::i;:::-;52883:17;:26;52901:7;52883:26;;;;;;;;;;;:175;;;;53229:1;33112:8;53178:19;:47;:52;53174:627;;53251:19;53283:1;53273:7;:11;53251:33;;53440:1;53406:17;:30;53424:11;53406:30;;;;;;;;;;;;:35;53402:384;;53544:13;;53529:11;:28;53525:242;;53724:19;53691:17;:30;53709:11;53691:30;;;;;;;;;;;:52;;;;53525:242;53402:384;53232:569;53174:627;53848:7;53844:2;53829:27;;53838:4;53829:27;;;;;;;;;;;;53867:42;53888:4;53894:2;53898:7;53907:1;53867:20;:42::i;:::-;51223:2694;;;51092:2825;;;:::o;16482:97::-;16540:6;16566:5;16559:12;;16482:97;:::o;37134:296::-;37189:7;37396:15;:13;:15::i;:::-;37380:13;;:31;37373:38;;37134:296;:::o;58473:2966::-;58546:20;58569:13;;58546:36;;58609:1;58597:8;:13;58593:44;;58619:18;;;;;;;;;;;;;;58593:44;58650:61;58680:1;58684:2;58688:12;58702:8;58650:21;:61::i;:::-;59194:1;32194:2;59164:1;:26;;59163:32;59151:8;:45;59125:18;:22;59144:2;59125:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;59473:139;59510:2;59564:33;59587:1;59591:2;59595:1;59564:14;:33::i;:::-;59531:30;59552:8;59531:20;:30::i;:::-;:66;59473:18;:139::i;:::-;59439:17;:31;59457:12;59439:31;;;;;;;;;;;:173;;;;59629:16;59660:11;59689:8;59674:12;:23;59660:37;;60210:16;60206:2;60202:25;60190:37;;60582:12;60542:8;60501:1;60439:25;60380:1;60319;60292:335;60953:1;60939:12;60935:20;60893:346;60994:3;60985:7;60982:16;60893:346;;61212:7;61202:8;61199:1;61172:25;61169:1;61166;61161:59;61047:1;61038:7;61034:15;61023:26;;60893:346;;;60897:77;61284:1;61272:8;:13;61268:45;;61294:19;;;;;;;;;;;;;;61268:45;61346:3;61330:13;:19;;;;58899:2462;;61371:60;61400:1;61404:2;61408:12;61422:8;61371:20;:60::i;:::-;58535:2904;58473:2966;;:::o;54013:193::-;54159:39;54176:4;54182:2;54186:7;54159:39;;;;;;;;;;;;:16;:39::i;:::-;54013:193;;;:::o;43510:1275::-;43577:7;43597:12;43612:7;43597:22;;43680:4;43661:15;:13;:15::i;:::-;:23;43657:1061;;43714:13;;43707:4;:20;43703:1015;;;43752:14;43769:17;:23;43787:4;43769:23;;;;;;;;;;;;43752:40;;43886:1;32832:8;43858:6;:24;:29;43854:845;;44523:113;44540:1;44530:6;:11;44523:113;;44583:17;:25;44601:6;;;;;;;44583:25;;;;;;;;;;;;44574:34;;44523:113;;;44669:6;44662:13;;;;;;43854:845;43729:989;43703:1015;43657:1061;44746:31;;;;;;;;;;;;;;43510:1275;;;;:::o;21650:191::-;21724:16;21743:6;;;;;;;;;;;21724:25;;21769:8;21760:6;;:17;;;;;;;;;;;;;;;;;;21824:8;21793:40;;21814:8;21793:40;;;;;;;;;;;;21713:128;21650:191;:::o;48011:234::-;48158:8;48106:18;:39;48125:19;:17;:19::i;:::-;48106:39;;;;;;;;;;;;;;;:49;48146:8;48106:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;48218:8;48182:55;;48197:19;:17;:19::i;:::-;48182:55;;;48228:8;48182:55;;;;;;:::i;:::-;;;;;;;;48011:234;;:::o;54804:407::-;54979:31;54992:4;54998:2;55002:7;54979:12;:31::i;:::-;55043:1;55025:2;:14;;;:19;55021:183;;55064:56;55095:4;55101:2;55105:7;55114:5;55064:30;:56::i;:::-;55059:145;;55148:40;;;;;;;;;;;;;;55059:145;55021:183;54804:407;;;;:::o;16850:332::-;16969:17;:15;:17::i;:::-;16953:33;;:12;:33;;;;16945:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;17072:1;17052:22;;:8;:22;;;17044:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;17139:35;;;;;;;;17151:8;17139:35;;;;;;17161:12;17139:35;;;;;17117:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16850:332;;:::o;81884:114::-;81944:13;81977;81970:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81884:114;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;38212:178::-;38273:7;32056:13;32194:2;38301:18;:25;38320:5;38301:25;;;;;;;;;;;;;;;;:50;;38300:82;38293:89;;38212:178;;;:::o;13040:157::-;13125:4;13164:25;13149:40;;;:11;:40;;;;13142:47;;13040:157;;;:::o;71132:105::-;71192:7;71219:10;71212:17;;71132:105;:::o;18934:98::-;18987:7;19014:10;19007:17;;18934:98;:::o;49987:485::-;50089:27;50118:23;50159:38;50200:15;:24;50216:7;50200:24;;;;;;;;;;;50159:65;;50377:18;50354:41;;50434:19;50428:26;50409:45;;50339:126;49987:485;;;:::o;49215:659::-;49364:11;49529:16;49522:5;49518:28;49509:37;;49689:16;49678:9;49674:32;49661:45;;49839:15;49828:9;49825:30;49817:5;49806:9;49803:20;49800:56;49790:66;;49215:659;;;;;:::o;55873:159::-;;;;;:::o;70441:311::-;70576:7;70596:16;33236:3;70622:19;:41;;70596:68;;33236:3;70690:31;70701:4;70707:2;70711:9;70690:10;:31::i;:::-;70682:40;;:62;;70675:69;;;70441:311;;;;;:::o;45333:450::-;45413:14;45581:16;45574:5;45570:28;45561:37;;45758:5;45744:11;45719:23;45715:41;45712:52;45705:5;45702:63;45692:73;;45333:450;;;;:::o;56697:158::-;;;;;:::o;45885:324::-;45955:14;46188:1;46178:8;46175:15;46149:24;46145:46;46135:56;;45885:324;;;:::o;57295:716::-;57458:4;57504:2;57479:45;;;57525:19;:17;:19::i;:::-;57546:4;57552:7;57561:5;57479:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57475:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57779:1;57762:6;:13;:18;57758:235;;57808:40;;;;;;;;;;;;;;57758:235;57951:6;57945:13;57936:6;57932:2;57928:15;57921:38;57475:529;57648:54;;;57638:64;;;:6;:64;;;;57631:71;;;57295:716;;;;;;:::o;70142:147::-;70279:6;70142:147;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:246::-;2314:1;2324:113;2338:6;2335:1;2332:13;2324:113;;;2423:1;2418:3;2414:11;2408:18;2404:1;2399:3;2395:11;2388:39;2360:2;2357:1;2353:10;2348:15;;2324:113;;;2471:1;2462:6;2457:3;2453:16;2446:27;2295:184;2233:246;;;:::o;2485:102::-;2526:6;2577:2;2573:7;2568:2;2561:5;2557:14;2553:28;2543:38;;2485:102;;;:::o;2593:377::-;2681:3;2709:39;2742:5;2709:39;:::i;:::-;2764:71;2828:6;2823:3;2764:71;:::i;:::-;2757:78;;2844:65;2902:6;2897:3;2890:4;2883:5;2879:16;2844:65;:::i;:::-;2934:29;2956:6;2934:29;:::i;:::-;2929:3;2925:39;2918:46;;2685:285;2593:377;;;;:::o;2976:313::-;3089:4;3127:2;3116:9;3112:18;3104:26;;3176:9;3170:4;3166:20;3162:1;3151:9;3147:17;3140:47;3204:78;3277:4;3268:6;3204:78;:::i;:::-;3196:86;;2976:313;;;;:::o;3295:122::-;3368:24;3386:5;3368:24;:::i;:::-;3361:5;3358:35;3348:63;;3407:1;3404;3397:12;3348:63;3295:122;:::o;3423:139::-;3469:5;3507:6;3494:20;3485:29;;3523:33;3550:5;3523:33;:::i;:::-;3423:139;;;;:::o;3568:329::-;3627:6;3676:2;3664:9;3655:7;3651:23;3647:32;3644:119;;;3682:79;;:::i;:::-;3644:119;3802:1;3827:53;3872:7;3863:6;3852:9;3848:22;3827:53;:::i;:::-;3817:63;;3773:117;3568:329;;;;:::o;3903:126::-;3940:7;3980:42;3973:5;3969:54;3958:65;;3903:126;;;:::o;4035:96::-;4072:7;4101:24;4119:5;4101:24;:::i;:::-;4090:35;;4035:96;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:117;5597:1;5594;5587:12;5625:553;5683:8;5693:6;5743:3;5736:4;5728:6;5724:17;5720:27;5710:122;;5751:79;;:::i;:::-;5710:122;5864:6;5851:20;5841:30;;5894:18;5886:6;5883:30;5880:117;;;5916:79;;:::i;:::-;5880:117;6030:4;6022:6;6018:17;6006:29;;6084:3;6076:4;6068:6;6064:17;6054:8;6050:32;6047:41;6044:128;;;6091:79;;:::i;:::-;6044:128;5625:553;;;;;:::o;6184:529::-;6255:6;6263;6312:2;6300:9;6291:7;6287:23;6283:32;6280:119;;;6318:79;;:::i;:::-;6280:119;6466:1;6455:9;6451:17;6438:31;6496:18;6488:6;6485:30;6482:117;;;6518:79;;:::i;:::-;6482:117;6631:65;6688:7;6679:6;6668:9;6664:22;6631:65;:::i;:::-;6613:83;;;;6409:297;6184:529;;;;;:::o;6719:619::-;6796:6;6804;6812;6861:2;6849:9;6840:7;6836:23;6832:32;6829:119;;;6867:79;;:::i;:::-;6829:119;6987:1;7012:53;7057:7;7048:6;7037:9;7033:22;7012:53;:::i;:::-;7002:63;;6958:117;7114:2;7140:53;7185:7;7176:6;7165:9;7161:22;7140:53;:::i;:::-;7130:63;;7085:118;7242:2;7268:53;7313:7;7304:6;7293:9;7289:22;7268:53;:::i;:::-;7258:63;;7213:118;6719:619;;;;;:::o;7344:474::-;7412:6;7420;7469:2;7457:9;7448:7;7444:23;7440:32;7437:119;;;7475:79;;:::i;:::-;7437:119;7595:1;7620:53;7665:7;7656:6;7645:9;7641:22;7620:53;:::i;:::-;7610:63;;7566:117;7722:2;7748:53;7793:7;7784:6;7773:9;7769:22;7748:53;:::i;:::-;7738:63;;7693:118;7344:474;;;;;:::o;7824:332::-;7945:4;7983:2;7972:9;7968:18;7960:26;;7996:71;8064:1;8053:9;8049:17;8040:6;7996:71;:::i;:::-;8077:72;8145:2;8134:9;8130:18;8121:6;8077:72;:::i;:::-;7824:332;;;;;:::o;8162:329::-;8221:6;8270:2;8258:9;8249:7;8245:23;8241:32;8238:119;;;8276:79;;:::i;:::-;8238:119;8396:1;8421:53;8466:7;8457:6;8446:9;8442:22;8421:53;:::i;:::-;8411:63;;8367:117;8162:329;;;;:::o;8497:116::-;8567:21;8582:5;8567:21;:::i;:::-;8560:5;8557:32;8547:60;;8603:1;8600;8593:12;8547:60;8497:116;:::o;8619:133::-;8662:5;8700:6;8687:20;8678:29;;8716:30;8740:5;8716:30;:::i;:::-;8619:133;;;;:::o;8758:613::-;8832:6;8840;8848;8897:2;8885:9;8876:7;8872:23;8868:32;8865:119;;;8903:79;;:::i;:::-;8865:119;9023:1;9048:53;9093:7;9084:6;9073:9;9069:22;9048:53;:::i;:::-;9038:63;;8994:117;9150:2;9176:53;9221:7;9212:6;9201:9;9197:22;9176:53;:::i;:::-;9166:63;;9121:118;9278:2;9304:50;9346:7;9337:6;9326:9;9322:22;9304:50;:::i;:::-;9294:60;;9249:115;8758:613;;;;;:::o;9377:323::-;9433:6;9482:2;9470:9;9461:7;9457:23;9453:32;9450:119;;;9488:79;;:::i;:::-;9450:119;9608:1;9633:50;9675:7;9666:6;9655:9;9651:22;9633:50;:::i;:::-;9623:60;;9579:114;9377:323;;;;:::o;9706:468::-;9771:6;9779;9828:2;9816:9;9807:7;9803:23;9799:32;9796:119;;;9834:79;;:::i;:::-;9796:119;9954:1;9979:53;10024:7;10015:6;10004:9;10000:22;9979:53;:::i;:::-;9969:63;;9925:117;10081:2;10107:50;10149:7;10140:6;10129:9;10125:22;10107:50;:::i;:::-;10097:60;;10052:115;9706:468;;;;;:::o;10180:117::-;10289:1;10286;10279:12;10303:180;10351:77;10348:1;10341:88;10448:4;10445:1;10438:15;10472:4;10469:1;10462:15;10489:281;10572:27;10594:4;10572:27;:::i;:::-;10564:6;10560:40;10702:6;10690:10;10687:22;10666:18;10654:10;10651:34;10648:62;10645:88;;;10713:18;;:::i;:::-;10645:88;10753:10;10749:2;10742:22;10532:238;10489:281;;:::o;10776:129::-;10810:6;10837:20;;:::i;:::-;10827:30;;10866:33;10894:4;10886:6;10866:33;:::i;:::-;10776:129;;;:::o;10911:307::-;10972:4;11062:18;11054:6;11051:30;11048:56;;;11084:18;;:::i;:::-;11048:56;11122:29;11144:6;11122:29;:::i;:::-;11114:37;;11206:4;11200;11196:15;11188:23;;10911:307;;;:::o;11224:146::-;11321:6;11316:3;11311;11298:30;11362:1;11353:6;11348:3;11344:16;11337:27;11224:146;;;:::o;11376:423::-;11453:5;11478:65;11494:48;11535:6;11494:48;:::i;:::-;11478:65;:::i;:::-;11469:74;;11566:6;11559:5;11552:21;11604:4;11597:5;11593:16;11642:3;11633:6;11628:3;11624:16;11621:25;11618:112;;;11649:79;;:::i;:::-;11618:112;11739:54;11786:6;11781:3;11776;11739:54;:::i;:::-;11459:340;11376:423;;;;;:::o;11818:338::-;11873:5;11922:3;11915:4;11907:6;11903:17;11899:27;11889:122;;11930:79;;:::i;:::-;11889:122;12047:6;12034:20;12072:78;12146:3;12138:6;12131:4;12123:6;12119:17;12072:78;:::i;:::-;12063:87;;11879:277;11818:338;;;;:::o;12162:943::-;12257:6;12265;12273;12281;12330:3;12318:9;12309:7;12305:23;12301:33;12298:120;;;12337:79;;:::i;:::-;12298:120;12457:1;12482:53;12527:7;12518:6;12507:9;12503:22;12482:53;:::i;:::-;12472:63;;12428:117;12584:2;12610:53;12655:7;12646:6;12635:9;12631:22;12610:53;:::i;:::-;12600:63;;12555:118;12712:2;12738:53;12783:7;12774:6;12763:9;12759:22;12738:53;:::i;:::-;12728:63;;12683:118;12868:2;12857:9;12853:18;12840:32;12899:18;12891:6;12888:30;12885:117;;;12921:79;;:::i;:::-;12885:117;13026:62;13080:7;13071:6;13060:9;13056:22;13026:62;:::i;:::-;13016:72;;12811:287;12162:943;;;;;;;:::o;13111:109::-;13147:7;13187:26;13180:5;13176:38;13165:49;;13111:109;;;:::o;13226:120::-;13298:23;13315:5;13298:23;:::i;:::-;13291:5;13288:34;13278:62;;13336:1;13333;13326:12;13278:62;13226:120;:::o;13352:137::-;13397:5;13435:6;13422:20;13413:29;;13451:32;13477:5;13451:32;:::i;:::-;13352:137;;;;:::o;13495:472::-;13562:6;13570;13619:2;13607:9;13598:7;13594:23;13590:32;13587:119;;;13625:79;;:::i;:::-;13587:119;13745:1;13770:53;13815:7;13806:6;13795:9;13791:22;13770:53;:::i;:::-;13760:63;;13716:117;13872:2;13898:52;13942:7;13933:6;13922:9;13918:22;13898:52;:::i;:::-;13888:62;;13843:117;13495:472;;;;;:::o;13973:308::-;14035:4;14125:18;14117:6;14114:30;14111:56;;;14147:18;;:::i;:::-;14111:56;14185:29;14207:6;14185:29;:::i;:::-;14177:37;;14269:4;14263;14259:15;14251:23;;13973:308;;;:::o;14287:425::-;14365:5;14390:66;14406:49;14448:6;14406:49;:::i;:::-;14390:66;:::i;:::-;14381:75;;14479:6;14472:5;14465:21;14517:4;14510:5;14506:16;14555:3;14546:6;14541:3;14537:16;14534:25;14531:112;;;14562:79;;:::i;:::-;14531:112;14652:54;14699:6;14694:3;14689;14652:54;:::i;:::-;14371:341;14287:425;;;;;:::o;14732:340::-;14788:5;14837:3;14830:4;14822:6;14818:17;14814:27;14804:122;;14845:79;;:::i;:::-;14804:122;14962:6;14949:20;14987:79;15062:3;15054:6;15047:4;15039:6;15035:17;14987:79;:::i;:::-;14978:88;;14794:278;14732:340;;;;:::o;15078:509::-;15147:6;15196:2;15184:9;15175:7;15171:23;15167:32;15164:119;;;15202:79;;:::i;:::-;15164:119;15350:1;15339:9;15335:17;15322:31;15380:18;15372:6;15369:30;15366:117;;;15402:79;;:::i;:::-;15366:117;15507:63;15562:7;15553:6;15542:9;15538:22;15507:63;:::i;:::-;15497:73;;15293:287;15078:509;;;;:::o;15593:474::-;15661:6;15669;15718:2;15706:9;15697:7;15693:23;15689:32;15686:119;;;15724:79;;:::i;:::-;15686:119;15844:1;15869:53;15914:7;15905:6;15894:9;15890:22;15869:53;:::i;:::-;15859:63;;15815:117;15971:2;15997:53;16042:7;16033:6;16022:9;16018:22;15997:53;:::i;:::-;15987:63;;15942:118;15593:474;;;;;:::o;16073:180::-;16121:77;16118:1;16111:88;16218:4;16215:1;16208:15;16242:4;16239:1;16232:15;16259:320;16303:6;16340:1;16334:4;16330:12;16320:22;;16387:1;16381:4;16377:12;16408:18;16398:81;;16464:4;16456:6;16452:17;16442:27;;16398:81;16526:2;16518:6;16515:14;16495:18;16492:38;16489:84;;16545:18;;:::i;:::-;16489:84;16310:269;16259:320;;;:::o;16585:97::-;16644:6;16672:3;16662:13;;16585:97;;;;:::o;16688:141::-;16737:4;16760:3;16752:11;;16783:3;16780:1;16773:14;16817:4;16814:1;16804:18;16796:26;;16688:141;;;:::o;16835:93::-;16872:6;16919:2;16914;16907:5;16903:14;16899:23;16889:33;;16835:93;;;:::o;16934:107::-;16978:8;17028:5;17022:4;17018:16;16997:37;;16934:107;;;;:::o;17047:393::-;17116:6;17166:1;17154:10;17150:18;17189:97;17219:66;17208:9;17189:97;:::i;:::-;17307:39;17337:8;17326:9;17307:39;:::i;:::-;17295:51;;17379:4;17375:9;17368:5;17364:21;17355:30;;17428:4;17418:8;17414:19;17407:5;17404:30;17394:40;;17123:317;;17047:393;;;;;:::o;17446:60::-;17474:3;17495:5;17488:12;;17446:60;;;:::o;17512:142::-;17562:9;17595:53;17613:34;17622:24;17640:5;17622:24;:::i;:::-;17613:34;:::i;:::-;17595:53;:::i;:::-;17582:66;;17512:142;;;:::o;17660:75::-;17703:3;17724:5;17717:12;;17660:75;;;:::o;17741:269::-;17851:39;17882:7;17851:39;:::i;:::-;17912:91;17961:41;17985:16;17961:41;:::i;:::-;17953:6;17946:4;17940:11;17912:91;:::i;:::-;17906:4;17899:105;17817:193;17741:269;;;:::o;18016:73::-;18061:3;18016:73;:::o;18095:189::-;18172:32;;:::i;:::-;18213:65;18271:6;18263;18257:4;18213:65;:::i;:::-;18148:136;18095:189;;:::o;18290:186::-;18350:120;18367:3;18360:5;18357:14;18350:120;;;18421:39;18458:1;18451:5;18421:39;:::i;:::-;18394:1;18387:5;18383:13;18374:22;;18350:120;;;18290:186;;:::o;18482:543::-;18583:2;18578:3;18575:11;18572:446;;;18617:38;18649:5;18617:38;:::i;:::-;18701:29;18719:10;18701:29;:::i;:::-;18691:8;18687:44;18884:2;18872:10;18869:18;18866:49;;;18905:8;18890:23;;18866:49;18928:80;18984:22;19002:3;18984:22;:::i;:::-;18974:8;18970:37;18957:11;18928:80;:::i;:::-;18587:431;;18572:446;18482:543;;;:::o;19031:117::-;19085:8;19135:5;19129:4;19125:16;19104:37;;19031:117;;;;:::o;19154:169::-;19198:6;19231:51;19279:1;19275:6;19267:5;19264:1;19260:13;19231:51;:::i;:::-;19227:56;19312:4;19306;19302:15;19292:25;;19205:118;19154:169;;;;:::o;19328:295::-;19404:4;19550:29;19575:3;19569:4;19550:29;:::i;:::-;19542:37;;19612:3;19609:1;19605:11;19599:4;19596:21;19588:29;;19328:295;;;;:::o;19628:1403::-;19752:44;19792:3;19787;19752:44;:::i;:::-;19861:18;19853:6;19850:30;19847:56;;;19883:18;;:::i;:::-;19847:56;19927:38;19959:4;19953:11;19927:38;:::i;:::-;20012:67;20072:6;20064;20058:4;20012:67;:::i;:::-;20106:1;20135:2;20127:6;20124:14;20152:1;20147:632;;;;20823:1;20840:6;20837:84;;;20896:9;20891:3;20887:19;20874:33;20865:42;;20837:84;20947:67;21007:6;21000:5;20947:67;:::i;:::-;20941:4;20934:81;20796:229;20117:908;;20147:632;20199:4;20195:9;20187:6;20183:22;20233:37;20265:4;20233:37;:::i;:::-;20292:1;20306:215;20320:7;20317:1;20314:14;20306:215;;;20406:9;20401:3;20397:19;20384:33;20376:6;20369:49;20457:1;20449:6;20445:14;20435:24;;20504:2;20493:9;20489:18;20476:31;;20343:4;20340:1;20336:12;20331:17;;20306:215;;;20549:6;20540:7;20537:19;20534:186;;;20614:9;20609:3;20605:19;20592:33;20657:48;20699:4;20691:6;20687:17;20676:9;20657:48;:::i;:::-;20649:6;20642:64;20557:163;20534:186;20766:1;20762;20754:6;20750:14;20746:22;20740:4;20733:36;20154:625;;;20117:908;;19727:1304;;;19628:1403;;;:::o;21037:180::-;21085:77;21082:1;21075:88;21182:4;21179:1;21172:15;21206:4;21203:1;21196:15;21223:410;21263:7;21286:20;21304:1;21286:20;:::i;:::-;21281:25;;21320:20;21338:1;21320:20;:::i;:::-;21315:25;;21375:1;21372;21368:9;21397:30;21415:11;21397:30;:::i;:::-;21386:41;;21576:1;21567:7;21563:15;21560:1;21557:22;21537:1;21530:9;21510:83;21487:139;;21606:18;;:::i;:::-;21487:139;21271:362;21223:410;;;;:::o;21639:180::-;21687:77;21684:1;21677:88;21784:4;21781:1;21774:15;21808:4;21805:1;21798:15;21825:185;21865:1;21882:20;21900:1;21882:20;:::i;:::-;21877:25;;21916:20;21934:1;21916:20;:::i;:::-;21911:25;;21955:1;21945:35;;21960:18;;:::i;:::-;21945:35;22002:1;21999;21995:9;21990:14;;21825:185;;;;:::o;22016:147::-;22117:11;22154:3;22139:18;;22016:147;;;;:::o;22169:114::-;;:::o;22289:398::-;22448:3;22469:83;22550:1;22545:3;22469:83;:::i;:::-;22462:90;;22561:93;22650:3;22561:93;:::i;:::-;22679:1;22674:3;22670:11;22663:18;;22289:398;;;:::o;22693:379::-;22877:3;22899:147;23042:3;22899:147;:::i;:::-;22892:154;;23063:3;23056:10;;22693:379;;;:::o;23078:168::-;23218:20;23214:1;23206:6;23202:14;23195:44;23078:168;:::o;23252:366::-;23394:3;23415:67;23479:2;23474:3;23415:67;:::i;:::-;23408:74;;23491:93;23580:3;23491:93;:::i;:::-;23609:2;23604:3;23600:12;23593:19;;23252:366;;;:::o;23624:419::-;23790:4;23828:2;23817:9;23813:18;23805:26;;23877:9;23871:4;23867:20;23863:1;23852:9;23848:17;23841:47;23905:131;24031:4;23905:131;:::i;:::-;23897:139;;23624:419;;;:::o;24049:174::-;24189:26;24185:1;24177:6;24173:14;24166:50;24049:174;:::o;24229:366::-;24371:3;24392:67;24456:2;24451:3;24392:67;:::i;:::-;24385:74;;24468:93;24557:3;24468:93;:::i;:::-;24586:2;24581:3;24577:12;24570:19;;24229:366;;;:::o;24601:419::-;24767:4;24805:2;24794:9;24790:18;24782:26;;24854:9;24848:4;24844:20;24840:1;24829:9;24825:17;24818:47;24882:131;25008:4;24882:131;:::i;:::-;24874:139;;24601:419;;;:::o;25026:236::-;25166:34;25162:1;25154:6;25150:14;25143:58;25235:19;25230:2;25222:6;25218:15;25211:44;25026:236;:::o;25268:366::-;25410:3;25431:67;25495:2;25490:3;25431:67;:::i;:::-;25424:74;;25507:93;25596:3;25507:93;:::i;:::-;25625:2;25620:3;25616:12;25609:19;;25268:366;;;:::o;25640:419::-;25806:4;25844:2;25833:9;25829:18;25821:26;;25893:9;25887:4;25883:20;25879:1;25868:9;25864:17;25857:47;25921:131;26047:4;25921:131;:::i;:::-;25913:139;;25640:419;;;:::o;26065:191::-;26105:3;26124:20;26142:1;26124:20;:::i;:::-;26119:25;;26158:20;26176:1;26158:20;:::i;:::-;26153:25;;26201:1;26198;26194:9;26187:16;;26222:3;26219:1;26216:10;26213:36;;;26229:18;;:::i;:::-;26213:36;26065:191;;;;:::o;26262:229::-;26402:34;26398:1;26390:6;26386:14;26379:58;26471:12;26466:2;26458:6;26454:15;26447:37;26262:229;:::o;26497:366::-;26639:3;26660:67;26724:2;26719:3;26660:67;:::i;:::-;26653:74;;26736:93;26825:3;26736:93;:::i;:::-;26854:2;26849:3;26845:12;26838:19;;26497:366;;;:::o;26869:419::-;27035:4;27073:2;27062:9;27058:18;27050:26;;27122:9;27116:4;27112:20;27108:1;27097:9;27093:17;27086:47;27150:131;27276:4;27150:131;:::i;:::-;27142:139;;26869:419;;;:::o;27294:172::-;27434:24;27430:1;27422:6;27418:14;27411:48;27294:172;:::o;27472:366::-;27614:3;27635:67;27699:2;27694:3;27635:67;:::i;:::-;27628:74;;27711:93;27800:3;27711:93;:::i;:::-;27829:2;27824:3;27820:12;27813:19;;27472:366;;;:::o;27844:419::-;28010:4;28048:2;28037:9;28033:18;28025:26;;28097:9;28091:4;28087:20;28083:1;28072:9;28068:17;28061:47;28125:131;28251:4;28125:131;:::i;:::-;28117:139;;27844:419;;;:::o;28269:176::-;28409:28;28405:1;28397:6;28393:14;28386:52;28269:176;:::o;28451:366::-;28593:3;28614:67;28678:2;28673:3;28614:67;:::i;:::-;28607:74;;28690:93;28779:3;28690:93;:::i;:::-;28808:2;28803:3;28799:12;28792:19;;28451:366;;;:::o;28823:419::-;28989:4;29027:2;29016:9;29012:18;29004:26;;29076:9;29070:4;29066:20;29062:1;29051:9;29047:17;29040:47;29104:131;29230:4;29104:131;:::i;:::-;29096:139;;28823:419;;;:::o;29248:194::-;29288:4;29308:20;29326:1;29308:20;:::i;:::-;29303:25;;29342:20;29360:1;29342:20;:::i;:::-;29337:25;;29386:1;29383;29379:9;29371:17;;29410:1;29404:4;29401:11;29398:37;;;29415:18;;:::i;:::-;29398:37;29248:194;;;;:::o;29448:234::-;29588:34;29584:1;29576:6;29572:14;29565:58;29657:17;29652:2;29644:6;29640:15;29633:42;29448:234;:::o;29688:366::-;29830:3;29851:67;29915:2;29910:3;29851:67;:::i;:::-;29844:74;;29927:93;30016:3;29927:93;:::i;:::-;30045:2;30040:3;30036:12;30029:19;;29688:366;;;:::o;30060:419::-;30226:4;30264:2;30253:9;30249:18;30241:26;;30313:9;30307:4;30303:20;30299:1;30288:9;30284:17;30277:47;30341:131;30467:4;30341:131;:::i;:::-;30333:139;;30060:419;;;:::o;30485:148::-;30587:11;30624:3;30609:18;;30485:148;;;;:::o;30639:390::-;30745:3;30773:39;30806:5;30773:39;:::i;:::-;30828:89;30910:6;30905:3;30828:89;:::i;:::-;30821:96;;30926:65;30984:6;30979:3;30972:4;30965:5;30961:16;30926:65;:::i;:::-;31016:6;31011:3;31007:16;31000:23;;30749:280;30639:390;;;;:::o;31059:874::-;31162:3;31199:5;31193:12;31228:36;31254:9;31228:36;:::i;:::-;31280:89;31362:6;31357:3;31280:89;:::i;:::-;31273:96;;31400:1;31389:9;31385:17;31416:1;31411:166;;;;31591:1;31586:341;;;;31378:549;;31411:166;31495:4;31491:9;31480;31476:25;31471:3;31464:38;31557:6;31550:14;31543:22;31535:6;31531:35;31526:3;31522:45;31515:52;;31411:166;;31586:341;31653:38;31685:5;31653:38;:::i;:::-;31713:1;31727:154;31741:6;31738:1;31735:13;31727:154;;;31815:7;31809:14;31805:1;31800:3;31796:11;31789:35;31865:1;31856:7;31852:15;31841:26;;31763:4;31760:1;31756:12;31751:17;;31727:154;;;31910:6;31905:3;31901:16;31894:23;;31593:334;;31378:549;;31166:767;;31059:874;;;;:::o;31939:589::-;32164:3;32186:95;32277:3;32268:6;32186:95;:::i;:::-;32179:102;;32298:95;32389:3;32380:6;32298:95;:::i;:::-;32291:102;;32410:92;32498:3;32489:6;32410:92;:::i;:::-;32403:99;;32519:3;32512:10;;31939:589;;;;;;:::o;32534:1395::-;32651:37;32684:3;32651:37;:::i;:::-;32753:18;32745:6;32742:30;32739:56;;;32775:18;;:::i;:::-;32739:56;32819:38;32851:4;32845:11;32819:38;:::i;:::-;32904:67;32964:6;32956;32950:4;32904:67;:::i;:::-;32998:1;33022:4;33009:17;;33054:2;33046:6;33043:14;33071:1;33066:618;;;;33728:1;33745:6;33742:77;;;33794:9;33789:3;33785:19;33779:26;33770:35;;33742:77;33845:67;33905:6;33898:5;33845:67;:::i;:::-;33839:4;33832:81;33701:222;33036:887;;33066:618;33118:4;33114:9;33106:6;33102:22;33152:37;33184:4;33152:37;:::i;:::-;33211:1;33225:208;33239:7;33236:1;33233:14;33225:208;;;33318:9;33313:3;33309:19;33303:26;33295:6;33288:42;33369:1;33361:6;33357:14;33347:24;;33416:2;33405:9;33401:18;33388:31;;33262:4;33259:1;33255:12;33250:17;;33225:208;;;33461:6;33452:7;33449:19;33446:179;;;33519:9;33514:3;33510:19;33504:26;33562:48;33604:4;33596:6;33592:17;33581:9;33562:48;:::i;:::-;33554:6;33547:64;33469:156;33446:179;33671:1;33667;33659:6;33655:14;33651:22;33645:4;33638:36;33073:611;;;33036:887;;32626:1303;;;32534:1395;;:::o;33935:225::-;34075:34;34071:1;34063:6;34059:14;34052:58;34144:8;34139:2;34131:6;34127:15;34120:33;33935:225;:::o;34166:366::-;34308:3;34329:67;34393:2;34388:3;34329:67;:::i;:::-;34322:74;;34405:93;34494:3;34405:93;:::i;:::-;34523:2;34518:3;34514:12;34507:19;;34166:366;;;:::o;34538:419::-;34704:4;34742:2;34731:9;34727:18;34719:26;;34791:9;34785:4;34781:20;34777:1;34766:9;34762:17;34755:47;34819:131;34945:4;34819:131;:::i;:::-;34811:139;;34538:419;;;:::o;34963:182::-;35103:34;35099:1;35091:6;35087:14;35080:58;34963:182;:::o;35151:366::-;35293:3;35314:67;35378:2;35373:3;35314:67;:::i;:::-;35307:74;;35390:93;35479:3;35390:93;:::i;:::-;35508:2;35503:3;35499:12;35492:19;;35151:366;;;:::o;35523:419::-;35689:4;35727:2;35716:9;35712:18;35704:26;;35776:9;35770:4;35766:20;35762:1;35751:9;35747:17;35740:47;35804:131;35930:4;35804:131;:::i;:::-;35796:139;;35523:419;;;:::o;35948:229::-;36088:34;36084:1;36076:6;36072:14;36065:58;36157:12;36152:2;36144:6;36140:15;36133:37;35948:229;:::o;36183:366::-;36325:3;36346:67;36410:2;36405:3;36346:67;:::i;:::-;36339:74;;36422:93;36511:3;36422:93;:::i;:::-;36540:2;36535:3;36531:12;36524:19;;36183:366;;;:::o;36555:419::-;36721:4;36759:2;36748:9;36744:18;36736:26;;36808:9;36802:4;36798:20;36794:1;36783:9;36779:17;36772:47;36836:131;36962:4;36836:131;:::i;:::-;36828:139;;36555:419;;;:::o;36980:175::-;37120:27;37116:1;37108:6;37104:14;37097:51;36980:175;:::o;37161:366::-;37303:3;37324:67;37388:2;37383:3;37324:67;:::i;:::-;37317:74;;37400:93;37489:3;37400:93;:::i;:::-;37518:2;37513:3;37509:12;37502:19;;37161:366;;;:::o;37533:419::-;37699:4;37737:2;37726:9;37722:18;37714:26;;37786:9;37780:4;37776:20;37772:1;37761:9;37757:17;37750:47;37814:131;37940:4;37814:131;:::i;:::-;37806:139;;37533:419;;;:::o;37958:233::-;37997:3;38020:24;38038:5;38020:24;:::i;:::-;38011:33;;38066:66;38059:5;38056:77;38053:103;;38136:18;;:::i;:::-;38053:103;38183:1;38176:5;38172:13;38165:20;;37958:233;;;:::o;38197:176::-;38229:1;38246:20;38264:1;38246:20;:::i;:::-;38241:25;;38280:20;38298:1;38280:20;:::i;:::-;38275:25;;38319:1;38309:35;;38324:18;;:::i;:::-;38309:35;38365:1;38362;38358:9;38353:14;;38197:176;;;;:::o;38379:180::-;38427:77;38424:1;38417:88;38524:4;38521:1;38514:15;38548:4;38545:1;38538:15;38565:98;38616:6;38650:5;38644:12;38634:22;;38565:98;;;:::o;38669:168::-;38752:11;38786:6;38781:3;38774:19;38826:4;38821:3;38817:14;38802:29;;38669:168;;;;:::o;38843:373::-;38929:3;38957:38;38989:5;38957:38;:::i;:::-;39011:70;39074:6;39069:3;39011:70;:::i;:::-;39004:77;;39090:65;39148:6;39143:3;39136:4;39129:5;39125:16;39090:65;:::i;:::-;39180:29;39202:6;39180:29;:::i;:::-;39175:3;39171:39;39164:46;;38933:283;38843:373;;;;:::o;39222:640::-;39417:4;39455:3;39444:9;39440:19;39432:27;;39469:71;39537:1;39526:9;39522:17;39513:6;39469:71;:::i;:::-;39550:72;39618:2;39607:9;39603:18;39594:6;39550:72;:::i;:::-;39632;39700:2;39689:9;39685:18;39676:6;39632:72;:::i;:::-;39751:9;39745:4;39741:20;39736:2;39725:9;39721:18;39714:48;39779:76;39850:4;39841:6;39779:76;:::i;:::-;39771:84;;39222:640;;;;;;;:::o;39868:141::-;39924:5;39955:6;39949:13;39940:22;;39971:32;39997:5;39971:32;:::i;:::-;39868:141;;;;:::o;40015:349::-;40084:6;40133:2;40121:9;40112:7;40108:23;40104:32;40101:119;;;40139:79;;:::i;:::-;40101:119;40259:1;40284:63;40339:7;40330:6;40319:9;40315:22;40284:63;:::i;:::-;40274:73;;40230:127;40015:349;;;;:::o
Swarm Source
ipfs://5fd919b19bfbff4249241b7fab02253c67f8e3658278511b2d88019c1cc41ce6
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.