Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
4,491 MHAC
Holders
420
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
8 MHACLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MatryoshkaHubAdventureClub
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-03 */ // SPDX-License-Identifier: MIT // File: contracts/IERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * 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(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of 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 through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // 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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev 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 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: contracts/ERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // 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 tokenId of the next token 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 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view 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 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 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 returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ 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: 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. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view 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 { 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; } /** * 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 ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * 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); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @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 See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { 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 ''; } /** * @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)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, 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 { _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 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 { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); 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 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _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 { 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 Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(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++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _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)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { 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 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; } /** * @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 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 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 returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // 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 v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/MatryoshkaHubAdventureClub.sol /*** ................................................................................ ................................................................................ .........PBBBB7......GBBBG...PBBY.....:BBB!......PBBBG.......~YG######BJ........ .........B@@@@&^....5@@@@&:..B@@P.....:@@@7.....5@@B@@P.....J@@&J!~~!7?!........ .........B@@Y&@B...7@@Y&@&...B@@P:::::~@@@7....?@@P.B@@?....G@@G................ .........B@@!7@@Y.:&@5^@@&...B@@@&&&&&&@@@7...~@@#:.^&@@~...G@@G................ .........B@@7.5@@7G@#.^@@&...B@@G:^^^:!@@@7..:#@@&BBB@@@#...G@@G................ .........B@@7..B@@@@~.^@@&...B@@P.....:@@@7..G@@5~!!!~G@@P..5@@&!:..::^^........ .........B@@7..^&@@J..^&@#...B@@5.....:&@@7.J@@B......:#@@?..JB&@&&&&&@P........ ................................................................................ .........................Matryoshka Hub Adventure Club.......................... ................................................................................ ....................................:~!88!~:.................................... .................................~V#&&####&&#V~................................. ...............................^G@&8!:....:!8&@G^............................... ..............................~&@8............8@&~.............................. ..............................&@J..............J@&.............................. [email protected]@B.............................. ..............................J@@B~..........~B@@J.............................. ...............................B@@@G?~::::~?G@@@B............................... ...............................:&@@@@@@&&@@@@@@&:............................... ..............................~8^B@@@@@@@@@@@@B^8~.............................. ............................:P@@8^8@@@@@@@@@@8^8@@P:............................ ...........................~&@@@@B!8#@@@@@@#8!B@@@@&~........................... ..........................:&@@@@@@@8~M#@@#M~8@@@@@@@&:.......................... ..........................V@@@@@@@@@&V!GG!V&@@@@@@@@@V.......................... ..........................M@@@@@@@@@@@&88&@@@@@@@@@@@M.......................... ..........................V@@@@@@@@@@@@@@@@@@@@@@@@@@V.......................... ..........................:&@@@@@@@@@@@@@@@@@@@@@@@@&:.......................... ...........................~&@@@@@@@@@@@@@@@@@@@@@@&~........................... ............................:P@@@@@@@@@@@@@@@@@@@@P:............................ ..............................~2#@@@@@@@@@@@@@@#4~.............................. .................................~JPB#&&&&#BPJ~................................. ................................................................................ ................................................................................ ***/ pragma solidity ^0.8.4; contract MatryoshkaHubAdventureClub is Ownable, ReentrancyGuard, ERC721A { uint256 public constant PRICE = 0.004 ether; uint256 public constant MAX_PER_MINT = 44; uint256 public constant MAX_PER_TRANSACTION = 8; uint256 public constant MAX_SUPPLY = 8888; uint256 public constant FREE_SUPPLY = MAX_SUPPLY / 2; uint256 public startingIndex; string public provenance; string public baseURI; bool public isMintActive = false; event MatryoshkaBirth(uint256 indexed tokenId, uint256 indexed tokenIndex); constructor() ERC721A('Matryoshka Hub Adventure Club', 'MHAC') {} function _startTokenId() internal view override returns (uint256) { return 1; } function _baseURI() internal view override returns (string memory) { return baseURI; } function mint(uint256 quantity) external payable { require(isMintActive, 'Mint is not active'); require(tx.origin == msg.sender, 'Contracts not allowed to mint'); uint256 totalMinted = _totalMinted(); uint256 nextMinted = totalMinted + quantity; require(nextMinted <= MAX_SUPPLY, 'Reached max supply'); require(quantity <= MAX_PER_TRANSACTION, 'Reached max amount per transaction'); require(_numberMinted(msg.sender) + quantity <= MAX_PER_MINT, 'Reached max amount per mint'); if (nextMinted > FREE_SUPPLY) { uint256 payableQuantity = quantity; if (totalMinted < FREE_SUPPLY) { payableQuantity = quantity - (FREE_SUPPLY - totalMinted); } uint256 payableValue = PRICE * payableQuantity; require(msg.value >= payableValue, 'Insufficient payment'); } _mint(msg.sender, quantity); } function setProvenance(string memory _provenance) external onlyOwner { require(bytes(provenance).length == 0, 'Provenance already set'); provenance = _provenance; } function setStartingIndex() external onlyOwner { require(bytes(provenance).length != 0, 'Provenance must be set'); require(startingIndex == 0, 'Starting index already set'); uint256 number = uint256( keccak256( abi.encodePacked( provenance, block.number, block.timestamp ) ) ); startingIndex = (number % MAX_SUPPLY) + _startTokenId(); } function setBaseURI(string memory URI) external onlyOwner { baseURI = URI; } function toggleMintActive() external onlyOwner { isMintActive = !isMintActive; } function withdraw() external onlyOwner nonReentrant { uint256 balance = address(this).balance; require(balance > 0, 'No balance to withdraw'); (bool success,) = payable(msg.sender).call{value: balance}(''); require(success, 'Withdraw failed'); } function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal override { if (from == address(0)) { for (uint256 tokenId = startTokenId; tokenId < startTokenId + quantity; tokenId++) { emit MatryoshkaBirth( tokenId, ((tokenId + startingIndex) % MAX_SUPPLY) + _startTokenId() ); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","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":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"MatryoshkaBirth","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":"FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TRANSACTION","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":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600d60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280601d81526020017f4d617472796f73686b612048756220416476656e7475726520436c75620000008152506040518060400160405280600481526020017f4d48414300000000000000000000000000000000000000000000000000000000815250620000b9620000ad6200011060201b60201c565b6200011860201b60201c565b600180819055508160049080519060200190620000d8929190620001e5565b508060059080519060200190620000f1929190620001e5565b5062000102620001dc60201b60201c565b6002819055505050620002fa565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b828054620001f39062000295565b90600052602060002090601f01602090048101928262000217576000855562000263565b82601f106200023257805160ff191683800117855562000263565b8280016001018555821562000263579182015b828111156200026257825182559160200191906001019062000245565b5b50905062000272919062000276565b5090565b5b808211156200029157600081600090555060010162000277565b5090565b60006002820490506001821680620002ae57607f821691505b60208210811415620002c557620002c4620002cb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61373e806200030a6000396000f3fe6080604052600436106101e35760003560e01c8063715018a611610102578063c87b56dd11610095578063e985e9c511610064578063e985e9c51461069f578063e9866550146106dc578063f2fde38b146106f3578063ffe630b51461071c576101e3565b8063c87b56dd146105f5578063cb14eb8714610632578063cb774d471461065d578063d02c2bf214610688576101e3565b80639858cf19116100d15780639858cf191461055c578063a0712d6814610587578063a22cb465146105a3578063b88d4fde146105cc576101e3565b8063715018a6146104c45780638d859f3e146104db5780638da5cb5b1461050657806395d89b4114610531576101e3565b806332cb6b0c1161017a5780635b92ac0d116101495780635b92ac0d146103f45780636352211e1461041f5780636c0360eb1461045c57806370a0823114610487576101e3565b806332cb6b0c146103605780633ccfd60b1461038b57806342842e0e146103a257806355f804b3146103cb576101e3565b806309d42b30116101b657806309d42b30146102b65780630f7309e8146102e157806318160ddd1461030c57806323b872dd14610337576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612896565b610745565b60405161021c9190612d9e565b60405180910390f35b34801561023157600080fd5b5061023a6107d7565b6040516102479190612db9565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612929565b610869565b6040516102849190612d37565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af919061285a565b6108e5565b005b3480156102c257600080fd5b506102cb610a26565b6040516102d89190612f9b565b60405180910390f35b3480156102ed57600080fd5b506102f6610a2b565b6040516103039190612db9565b60405180910390f35b34801561031857600080fd5b50610321610ab9565b60405161032e9190612f9b565b60405180910390f35b34801561034357600080fd5b5061035e60048036038101906103599190612754565b610ad0565b005b34801561036c57600080fd5b50610375610df5565b6040516103829190612f9b565b60405180910390f35b34801561039757600080fd5b506103a0610dfb565b005b3480156103ae57600080fd5b506103c960048036038101906103c49190612754565b610fc4565b005b3480156103d757600080fd5b506103f260048036038101906103ed91906128e8565b610fe4565b005b34801561040057600080fd5b5061040961107a565b6040516104169190612d9e565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190612929565b61108d565b6040516104539190612d37565b60405180910390f35b34801561046857600080fd5b5061047161109f565b60405161047e9190612db9565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a991906126ef565b61112d565b6040516104bb9190612f9b565b60405180910390f35b3480156104d057600080fd5b506104d96111e6565b005b3480156104e757600080fd5b506104f061126e565b6040516104fd9190612f9b565b60405180910390f35b34801561051257600080fd5b5061051b611279565b6040516105289190612d37565b60405180910390f35b34801561053d57600080fd5b506105466112a2565b6040516105539190612db9565b60405180910390f35b34801561056857600080fd5b50610571611334565b60405161057e9190612f9b565b60405180910390f35b6105a1600480360381019061059c9190612929565b611346565b005b3480156105af57600080fd5b506105ca60048036038101906105c5919061281e565b6115c4565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906127a3565b61173c565b005b34801561060157600080fd5b5061061c60048036038101906106179190612929565b6117af565b6040516106299190612db9565b60405180910390f35b34801561063e57600080fd5b5061064761184e565b6040516106549190612f9b565b60405180910390f35b34801561066957600080fd5b50610672611853565b60405161067f9190612f9b565b60405180910390f35b34801561069457600080fd5b5061069d611859565b005b3480156106ab57600080fd5b506106c660048036038101906106c19190612718565b611901565b6040516106d39190612d9e565b60405180910390f35b3480156106e857600080fd5b506106f1611995565b005b3480156106ff57600080fd5b5061071a600480360381019061071591906126ef565b611b04565b005b34801561072857600080fd5b50610743600480360381019061073e91906128e8565b611bfc565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600480546107e69061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546108129061326b565b801561085f5780601f106108345761010080835404028352916020019161085f565b820191906000526020600020905b81548152906001019060200180831161084257829003601f168201915b5050505050905090565b600061087482611ce3565b6108aa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f08261108d565b90508073ffffffffffffffffffffffffffffffffffffffff16610911611d42565b73ffffffffffffffffffffffffffffffffffffffff16146109745761093d81610938611d42565b611901565b610973576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b602c81565b600b8054610a389061326b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a649061326b565b8015610ab15780601f10610a8657610100808354040283529160200191610ab1565b820191906000526020600020905b815481529060010190602001808311610a9457829003601f168201915b505050505081565b6000610ac3611d4a565b6003546002540303905090565b6000610adb82611d53565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b42576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b4e84611e21565b91509150610b648187610b5f611d42565b611e43565b610bb057610b7986610b74611d42565b611901565b610baf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c17576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c248686866001611e87565b8015610c2f57600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610cfd85610cd9888887611e8d565b7c020000000000000000000000000000000000000000000000000000000017611eb5565b600660008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d85576000600185019050600060066000838152602001908152602001600020541415610d83576002548114610d82578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ded8686866001611ee0565b505050505050565b6122b881565b610e03611fa3565b73ffffffffffffffffffffffffffffffffffffffff16610e21611279565b73ffffffffffffffffffffffffffffffffffffffff1614610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90612edb565b60405180910390fd5b60026001541415610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490612f7b565b60405180910390fd5b6002600181905550600047905060008111610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490612f1b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610f3390612d22565b60006040518083038185875af1925050503d8060008114610f70576040519150601f19603f3d011682016040523d82523d6000602084013e610f75565b606091505b5050905080610fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb090612e1b565b60405180910390fd5b505060018081905550565b610fdf8383836040518060200160405280600081525061173c565b505050565b610fec611fa3565b73ffffffffffffffffffffffffffffffffffffffff1661100a611279565b73ffffffffffffffffffffffffffffffffffffffff1614611060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105790612edb565b60405180910390fd5b80600c9080519060200190611076929190612513565b5050565b600d60009054906101000a900460ff1681565b600061109882611d53565b9050919050565b600c80546110ac9061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546110d89061326b565b80156111255780601f106110fa57610100808354040283529160200191611125565b820191906000526020600020905b81548152906001019060200180831161110857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611195576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111ee611fa3565b73ffffffffffffffffffffffffffffffffffffffff1661120c611279565b73ffffffffffffffffffffffffffffffffffffffff1614611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990612edb565b60405180910390fd5b61126c6000611fab565b565b660e35fa931a000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546112b19061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546112dd9061326b565b801561132a5780601f106112ff5761010080835404028352916020019161132a565b820191906000526020600020905b81548152906001019060200180831161130d57829003601f168201915b5050505050905090565b60026122b861134391906130f6565b81565b600d60009054906101000a900460ff16611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90612efb565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fa90612ddb565b60405180910390fd5b600061140d61206f565b90506000828261141d91906130a0565b90506122b8811115611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90612e5b565b60405180910390fd5b60088311156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90612e7b565b60405180910390fd5b602c836114b433612082565b6114be91906130a0565b11156114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690612e3b565b60405180910390fd5b60026122b861150e91906130f6565b8111156115b557600083905060026122b861152991906130f6565b831015611558578260026122b861154091906130f6565b61154a9190613181565b846115559190613181565b90505b600081660e35fa931a000061156d9190613127565b9050803410156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990612ebb565b60405180910390fd5b50505b6115bf33846120d9565b505050565b6115cc611d42565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611631576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806009600061163e611d42565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116eb611d42565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117309190612d9e565b60405180910390a35050565b611747848484610ad0565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117a957611772848484846122ae565b6117a8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606117ba82611ce3565b6117f0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117fa61240e565b905060008151141561181b5760405180602001604052806000815250611846565b80611825846124a0565b604051602001611836929190612cc5565b6040516020818303038152906040525b915050919050565b600881565b600a5481565b611861611fa3565b73ffffffffffffffffffffffffffffffffffffffff1661187f611279565b73ffffffffffffffffffffffffffffffffffffffff16146118d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cc90612edb565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61199d611fa3565b73ffffffffffffffffffffffffffffffffffffffff166119bb611279565b73ffffffffffffffffffffffffffffffffffffffff1614611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0890612edb565b60405180910390fd5b6000600b8054611a209061326b565b90501415611a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5a90612f3b565b60405180910390fd5b6000600a5414611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90612e9b565b60405180910390fd5b6000600b4342604051602001611ac093929190612ce9565b6040516020818303038152906040528051906020012060001c9050611ae3611d4a565b6122b882611af19190613321565b611afb91906130a0565b600a8190555050565b611b0c611fa3565b73ffffffffffffffffffffffffffffffffffffffff16611b2a611279565b73ffffffffffffffffffffffffffffffffffffffff1614611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7790612edb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be790612dfb565b60405180910390fd5b611bf981611fab565b50565b611c04611fa3565b73ffffffffffffffffffffffffffffffffffffffff16611c22611279565b73ffffffffffffffffffffffffffffffffffffffff1614611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90612edb565b60405180910390fd5b6000600b8054611c879061326b565b905014611cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc090612f5b565b60405180910390fd5b80600b9080519060200190611cdf929190612513565b5050565b600081611cee611d4a565b11158015611cfd575060025482105b8015611d3b575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611d62611d4a565b11611dea57600254811015611de95760006006600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611de7575b6000811415611ddd576006600083600190039350838152602001908152602001600020549050611db2565b8092505050611e1c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600890508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ea48686846124fa565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f9d5760008290505b8183611f2791906130a0565b811015611f9b57611f36611d4a565b6122b8600a5483611f4791906130a0565b611f519190613321565b611f5b91906130a0565b817f38906b6a557fb827c86319494d14fa70d229f1e7701d828e3cee3d7f2910e13360405160405180910390a38080611f93906132ce565b915050611f1b565b505b50505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612079611d4a565b60025403905090565b600067ffffffffffffffff6040600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612147576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612182576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61218f6000848385611e87565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612206836121f76000866000611e8d565b61220085612503565b17611eb5565b60066000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061222a578060028190555050506122a96000848385611ee0565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122d4611d42565b8786866040518563ffffffff1660e01b81526004016122f69493929190612d52565b602060405180830381600087803b15801561231057600080fd5b505af192505050801561234157506040513d601f19601f8201168201806040525081019061233e91906128bf565b60015b6123bb573d8060008114612371576040519150601f19603f3d011682016040523d82523d6000602084013e612376565b606091505b506000815114156123b3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c805461241d9061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546124499061326b565b80156124965780601f1061246b57610100808354040283529160200191612496565b820191906000526020600020905b81548152906001019060200180831161247957829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156124e657600183039250600a81066030018353600a810490506124c6565b508181036020830392508083525050919050565b60009392505050565b60006001821460e11b9050919050565b82805461251f9061326b565b90600052602060002090601f0160209004810192826125415760008555612588565b82601f1061255a57805160ff1916838001178555612588565b82800160010185558215612588579182015b8281111561258757825182559160200191906001019061256c565b5b5090506125959190612599565b5090565b5b808211156125b257600081600090555060010161259a565b5090565b60006125c96125c484612fdb565b612fb6565b9050828152602081018484840111156125e157600080fd5b6125ec848285613229565b509392505050565b60006126076126028461300c565b612fb6565b90508281526020810184848401111561261f57600080fd5b61262a848285613229565b509392505050565b600081359050612641816136ac565b92915050565b600081359050612656816136c3565b92915050565b60008135905061266b816136da565b92915050565b600081519050612680816136da565b92915050565b600082601f83011261269757600080fd5b81356126a78482602086016125b6565b91505092915050565b600082601f8301126126c157600080fd5b81356126d18482602086016125f4565b91505092915050565b6000813590506126e9816136f1565b92915050565b60006020828403121561270157600080fd5b600061270f84828501612632565b91505092915050565b6000806040838503121561272b57600080fd5b600061273985828601612632565b925050602061274a85828601612632565b9150509250929050565b60008060006060848603121561276957600080fd5b600061277786828701612632565b935050602061278886828701612632565b9250506040612799868287016126da565b9150509250925092565b600080600080608085870312156127b957600080fd5b60006127c787828801612632565b94505060206127d887828801612632565b93505060406127e9878288016126da565b925050606085013567ffffffffffffffff81111561280657600080fd5b61281287828801612686565b91505092959194509250565b6000806040838503121561283157600080fd5b600061283f85828601612632565b925050602061285085828601612647565b9150509250929050565b6000806040838503121561286d57600080fd5b600061287b85828601612632565b925050602061288c858286016126da565b9150509250929050565b6000602082840312156128a857600080fd5b60006128b68482850161265c565b91505092915050565b6000602082840312156128d157600080fd5b60006128df84828501612671565b91505092915050565b6000602082840312156128fa57600080fd5b600082013567ffffffffffffffff81111561291457600080fd5b612920848285016126b0565b91505092915050565b60006020828403121561293b57600080fd5b6000612949848285016126da565b91505092915050565b61295b816131b5565b82525050565b61296a816131c7565b82525050565b600061297b82613052565b6129858185613068565b9350612995818560208601613238565b61299e8161340e565b840191505092915050565b60006129b48261305d565b6129be8185613084565b93506129ce818560208601613238565b6129d78161340e565b840191505092915050565b60006129ed8261305d565b6129f78185613095565b9350612a07818560208601613238565b80840191505092915050565b60008154612a208161326b565b612a2a8186613095565b94506001821660008114612a455760018114612a5657612a89565b60ff19831686528186019350612a89565b612a5f8561303d565b60005b83811015612a8157815481890152600182019150602081019050612a62565b838801955050505b50505092915050565b6000612a9f601d83613084565b9150612aaa8261341f565b602082019050919050565b6000612ac2602683613084565b9150612acd82613448565b604082019050919050565b6000612ae5600f83613084565b9150612af082613497565b602082019050919050565b6000612b08601b83613084565b9150612b13826134c0565b602082019050919050565b6000612b2b601283613084565b9150612b36826134e9565b602082019050919050565b6000612b4e602283613084565b9150612b5982613512565b604082019050919050565b6000612b71601a83613084565b9150612b7c82613561565b602082019050919050565b6000612b94601483613084565b9150612b9f8261358a565b602082019050919050565b6000612bb7602083613084565b9150612bc2826135b3565b602082019050919050565b6000612bda601283613084565b9150612be5826135dc565b602082019050919050565b6000612bfd601683613084565b9150612c0882613605565b602082019050919050565b6000612c20601683613084565b9150612c2b8261362e565b602082019050919050565b6000612c43600083613079565b9150612c4e82613657565b600082019050919050565b6000612c66601683613084565b9150612c718261365a565b602082019050919050565b6000612c89601f83613084565b9150612c9482613683565b602082019050919050565b612ca88161321f565b82525050565b612cbf612cba8261321f565b613317565b82525050565b6000612cd182856129e2565b9150612cdd82846129e2565b91508190509392505050565b6000612cf58286612a13565b9150612d018285612cae565b602082019150612d118284612cae565b602082019150819050949350505050565b6000612d2d82612c36565b9150819050919050565b6000602082019050612d4c6000830184612952565b92915050565b6000608082019050612d676000830187612952565b612d746020830186612952565b612d816040830185612c9f565b8181036060830152612d938184612970565b905095945050505050565b6000602082019050612db36000830184612961565b92915050565b60006020820190508181036000830152612dd381846129a9565b905092915050565b60006020820190508181036000830152612df481612a92565b9050919050565b60006020820190508181036000830152612e1481612ab5565b9050919050565b60006020820190508181036000830152612e3481612ad8565b9050919050565b60006020820190508181036000830152612e5481612afb565b9050919050565b60006020820190508181036000830152612e7481612b1e565b9050919050565b60006020820190508181036000830152612e9481612b41565b9050919050565b60006020820190508181036000830152612eb481612b64565b9050919050565b60006020820190508181036000830152612ed481612b87565b9050919050565b60006020820190508181036000830152612ef481612baa565b9050919050565b60006020820190508181036000830152612f1481612bcd565b9050919050565b60006020820190508181036000830152612f3481612bf0565b9050919050565b60006020820190508181036000830152612f5481612c13565b9050919050565b60006020820190508181036000830152612f7481612c59565b9050919050565b60006020820190508181036000830152612f9481612c7c565b9050919050565b6000602082019050612fb06000830184612c9f565b92915050565b6000612fc0612fd1565b9050612fcc828261329d565b919050565b6000604051905090565b600067ffffffffffffffff821115612ff657612ff56133df565b5b612fff8261340e565b9050602081019050919050565b600067ffffffffffffffff821115613027576130266133df565b5b6130308261340e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006130ab8261321f565b91506130b68361321f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130eb576130ea613352565b5b828201905092915050565b60006131018261321f565b915061310c8361321f565b92508261311c5761311b613381565b5b828204905092915050565b60006131328261321f565b915061313d8361321f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561317657613175613352565b5b828202905092915050565b600061318c8261321f565b91506131978361321f565b9250828210156131aa576131a9613352565b5b828203905092915050565b60006131c0826131ff565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561325657808201518184015260208101905061323b565b83811115613265576000848401525b50505050565b6000600282049050600182168061328357607f821691505b60208210811415613297576132966133b0565b5b50919050565b6132a68261340e565b810181811067ffffffffffffffff821117156132c5576132c46133df565b5b80604052505050565b60006132d98261321f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561330c5761330b613352565b5b600182019050919050565b6000819050919050565b600061332c8261321f565b91506133378361321f565b92508261334757613346613381565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f436f6e747261637473206e6f7420616c6c6f77656420746f206d696e74000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b7f52656163686564206d617820616d6f756e7420706572206d696e740000000000600082015250565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f52656163686564206d617820616d6f756e7420706572207472616e736163746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820616c726561647920736574000000000000600082015250565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e74206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4e6f2062616c616e636520746f20776974686472617700000000000000000000600082015250565b7f50726f76656e616e6365206d7573742062652073657400000000000000000000600082015250565b50565b7f50726f76656e616e636520616c72656164792073657400000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6136b5816131b5565b81146136c057600080fd5b50565b6136cc816131c7565b81146136d757600080fd5b50565b6136e3816131d3565b81146136ee57600080fd5b50565b6136fa8161321f565b811461370557600080fd5b5056fea2646970667358221220973b99fd3720ca6588e1b56d6e7fda536d68747411f3921531a22eb4b890cd0964736f6c63430008040033
Deployed Bytecode
0x6080604052600436106101e35760003560e01c8063715018a611610102578063c87b56dd11610095578063e985e9c511610064578063e985e9c51461069f578063e9866550146106dc578063f2fde38b146106f3578063ffe630b51461071c576101e3565b8063c87b56dd146105f5578063cb14eb8714610632578063cb774d471461065d578063d02c2bf214610688576101e3565b80639858cf19116100d15780639858cf191461055c578063a0712d6814610587578063a22cb465146105a3578063b88d4fde146105cc576101e3565b8063715018a6146104c45780638d859f3e146104db5780638da5cb5b1461050657806395d89b4114610531576101e3565b806332cb6b0c1161017a5780635b92ac0d116101495780635b92ac0d146103f45780636352211e1461041f5780636c0360eb1461045c57806370a0823114610487576101e3565b806332cb6b0c146103605780633ccfd60b1461038b57806342842e0e146103a257806355f804b3146103cb576101e3565b806309d42b30116101b657806309d42b30146102b65780630f7309e8146102e157806318160ddd1461030c57806323b872dd14610337576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612896565b610745565b60405161021c9190612d9e565b60405180910390f35b34801561023157600080fd5b5061023a6107d7565b6040516102479190612db9565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612929565b610869565b6040516102849190612d37565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af919061285a565b6108e5565b005b3480156102c257600080fd5b506102cb610a26565b6040516102d89190612f9b565b60405180910390f35b3480156102ed57600080fd5b506102f6610a2b565b6040516103039190612db9565b60405180910390f35b34801561031857600080fd5b50610321610ab9565b60405161032e9190612f9b565b60405180910390f35b34801561034357600080fd5b5061035e60048036038101906103599190612754565b610ad0565b005b34801561036c57600080fd5b50610375610df5565b6040516103829190612f9b565b60405180910390f35b34801561039757600080fd5b506103a0610dfb565b005b3480156103ae57600080fd5b506103c960048036038101906103c49190612754565b610fc4565b005b3480156103d757600080fd5b506103f260048036038101906103ed91906128e8565b610fe4565b005b34801561040057600080fd5b5061040961107a565b6040516104169190612d9e565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190612929565b61108d565b6040516104539190612d37565b60405180910390f35b34801561046857600080fd5b5061047161109f565b60405161047e9190612db9565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a991906126ef565b61112d565b6040516104bb9190612f9b565b60405180910390f35b3480156104d057600080fd5b506104d96111e6565b005b3480156104e757600080fd5b506104f061126e565b6040516104fd9190612f9b565b60405180910390f35b34801561051257600080fd5b5061051b611279565b6040516105289190612d37565b60405180910390f35b34801561053d57600080fd5b506105466112a2565b6040516105539190612db9565b60405180910390f35b34801561056857600080fd5b50610571611334565b60405161057e9190612f9b565b60405180910390f35b6105a1600480360381019061059c9190612929565b611346565b005b3480156105af57600080fd5b506105ca60048036038101906105c5919061281e565b6115c4565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906127a3565b61173c565b005b34801561060157600080fd5b5061061c60048036038101906106179190612929565b6117af565b6040516106299190612db9565b60405180910390f35b34801561063e57600080fd5b5061064761184e565b6040516106549190612f9b565b60405180910390f35b34801561066957600080fd5b50610672611853565b60405161067f9190612f9b565b60405180910390f35b34801561069457600080fd5b5061069d611859565b005b3480156106ab57600080fd5b506106c660048036038101906106c19190612718565b611901565b6040516106d39190612d9e565b60405180910390f35b3480156106e857600080fd5b506106f1611995565b005b3480156106ff57600080fd5b5061071a600480360381019061071591906126ef565b611b04565b005b34801561072857600080fd5b50610743600480360381019061073e91906128e8565b611bfc565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600480546107e69061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546108129061326b565b801561085f5780601f106108345761010080835404028352916020019161085f565b820191906000526020600020905b81548152906001019060200180831161084257829003601f168201915b5050505050905090565b600061087482611ce3565b6108aa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f08261108d565b90508073ffffffffffffffffffffffffffffffffffffffff16610911611d42565b73ffffffffffffffffffffffffffffffffffffffff16146109745761093d81610938611d42565b611901565b610973576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b602c81565b600b8054610a389061326b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a649061326b565b8015610ab15780601f10610a8657610100808354040283529160200191610ab1565b820191906000526020600020905b815481529060010190602001808311610a9457829003601f168201915b505050505081565b6000610ac3611d4a565b6003546002540303905090565b6000610adb82611d53565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b42576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b4e84611e21565b91509150610b648187610b5f611d42565b611e43565b610bb057610b7986610b74611d42565b611901565b610baf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c17576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c248686866001611e87565b8015610c2f57600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610cfd85610cd9888887611e8d565b7c020000000000000000000000000000000000000000000000000000000017611eb5565b600660008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d85576000600185019050600060066000838152602001908152602001600020541415610d83576002548114610d82578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ded8686866001611ee0565b505050505050565b6122b881565b610e03611fa3565b73ffffffffffffffffffffffffffffffffffffffff16610e21611279565b73ffffffffffffffffffffffffffffffffffffffff1614610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90612edb565b60405180910390fd5b60026001541415610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490612f7b565b60405180910390fd5b6002600181905550600047905060008111610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490612f1b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610f3390612d22565b60006040518083038185875af1925050503d8060008114610f70576040519150601f19603f3d011682016040523d82523d6000602084013e610f75565b606091505b5050905080610fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb090612e1b565b60405180910390fd5b505060018081905550565b610fdf8383836040518060200160405280600081525061173c565b505050565b610fec611fa3565b73ffffffffffffffffffffffffffffffffffffffff1661100a611279565b73ffffffffffffffffffffffffffffffffffffffff1614611060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105790612edb565b60405180910390fd5b80600c9080519060200190611076929190612513565b5050565b600d60009054906101000a900460ff1681565b600061109882611d53565b9050919050565b600c80546110ac9061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546110d89061326b565b80156111255780601f106110fa57610100808354040283529160200191611125565b820191906000526020600020905b81548152906001019060200180831161110857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611195576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111ee611fa3565b73ffffffffffffffffffffffffffffffffffffffff1661120c611279565b73ffffffffffffffffffffffffffffffffffffffff1614611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990612edb565b60405180910390fd5b61126c6000611fab565b565b660e35fa931a000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546112b19061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546112dd9061326b565b801561132a5780601f106112ff5761010080835404028352916020019161132a565b820191906000526020600020905b81548152906001019060200180831161130d57829003601f168201915b5050505050905090565b60026122b861134391906130f6565b81565b600d60009054906101000a900460ff16611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90612efb565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fa90612ddb565b60405180910390fd5b600061140d61206f565b90506000828261141d91906130a0565b90506122b8811115611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90612e5b565b60405180910390fd5b60088311156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90612e7b565b60405180910390fd5b602c836114b433612082565b6114be91906130a0565b11156114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690612e3b565b60405180910390fd5b60026122b861150e91906130f6565b8111156115b557600083905060026122b861152991906130f6565b831015611558578260026122b861154091906130f6565b61154a9190613181565b846115559190613181565b90505b600081660e35fa931a000061156d9190613127565b9050803410156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990612ebb565b60405180910390fd5b50505b6115bf33846120d9565b505050565b6115cc611d42565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611631576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806009600061163e611d42565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116eb611d42565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117309190612d9e565b60405180910390a35050565b611747848484610ad0565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117a957611772848484846122ae565b6117a8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606117ba82611ce3565b6117f0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117fa61240e565b905060008151141561181b5760405180602001604052806000815250611846565b80611825846124a0565b604051602001611836929190612cc5565b6040516020818303038152906040525b915050919050565b600881565b600a5481565b611861611fa3565b73ffffffffffffffffffffffffffffffffffffffff1661187f611279565b73ffffffffffffffffffffffffffffffffffffffff16146118d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cc90612edb565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61199d611fa3565b73ffffffffffffffffffffffffffffffffffffffff166119bb611279565b73ffffffffffffffffffffffffffffffffffffffff1614611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0890612edb565b60405180910390fd5b6000600b8054611a209061326b565b90501415611a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5a90612f3b565b60405180910390fd5b6000600a5414611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90612e9b565b60405180910390fd5b6000600b4342604051602001611ac093929190612ce9565b6040516020818303038152906040528051906020012060001c9050611ae3611d4a565b6122b882611af19190613321565b611afb91906130a0565b600a8190555050565b611b0c611fa3565b73ffffffffffffffffffffffffffffffffffffffff16611b2a611279565b73ffffffffffffffffffffffffffffffffffffffff1614611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7790612edb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be790612dfb565b60405180910390fd5b611bf981611fab565b50565b611c04611fa3565b73ffffffffffffffffffffffffffffffffffffffff16611c22611279565b73ffffffffffffffffffffffffffffffffffffffff1614611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90612edb565b60405180910390fd5b6000600b8054611c879061326b565b905014611cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc090612f5b565b60405180910390fd5b80600b9080519060200190611cdf929190612513565b5050565b600081611cee611d4a565b11158015611cfd575060025482105b8015611d3b575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611d62611d4a565b11611dea57600254811015611de95760006006600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611de7575b6000811415611ddd576006600083600190039350838152602001908152602001600020549050611db2565b8092505050611e1c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600890508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ea48686846124fa565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f9d5760008290505b8183611f2791906130a0565b811015611f9b57611f36611d4a565b6122b8600a5483611f4791906130a0565b611f519190613321565b611f5b91906130a0565b817f38906b6a557fb827c86319494d14fa70d229f1e7701d828e3cee3d7f2910e13360405160405180910390a38080611f93906132ce565b915050611f1b565b505b50505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612079611d4a565b60025403905090565b600067ffffffffffffffff6040600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612147576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612182576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61218f6000848385611e87565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612206836121f76000866000611e8d565b61220085612503565b17611eb5565b60066000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061222a578060028190555050506122a96000848385611ee0565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122d4611d42565b8786866040518563ffffffff1660e01b81526004016122f69493929190612d52565b602060405180830381600087803b15801561231057600080fd5b505af192505050801561234157506040513d601f19601f8201168201806040525081019061233e91906128bf565b60015b6123bb573d8060008114612371576040519150601f19603f3d011682016040523d82523d6000602084013e612376565b606091505b506000815114156123b3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c805461241d9061326b565b80601f01602080910402602001604051908101604052809291908181526020018280546124499061326b565b80156124965780601f1061246b57610100808354040283529160200191612496565b820191906000526020600020905b81548152906001019060200180831161247957829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156124e657600183039250600a81066030018353600a810490506124c6565b508181036020830392508083525050919050565b60009392505050565b60006001821460e11b9050919050565b82805461251f9061326b565b90600052602060002090601f0160209004810192826125415760008555612588565b82601f1061255a57805160ff1916838001178555612588565b82800160010185558215612588579182015b8281111561258757825182559160200191906001019061256c565b5b5090506125959190612599565b5090565b5b808211156125b257600081600090555060010161259a565b5090565b60006125c96125c484612fdb565b612fb6565b9050828152602081018484840111156125e157600080fd5b6125ec848285613229565b509392505050565b60006126076126028461300c565b612fb6565b90508281526020810184848401111561261f57600080fd5b61262a848285613229565b509392505050565b600081359050612641816136ac565b92915050565b600081359050612656816136c3565b92915050565b60008135905061266b816136da565b92915050565b600081519050612680816136da565b92915050565b600082601f83011261269757600080fd5b81356126a78482602086016125b6565b91505092915050565b600082601f8301126126c157600080fd5b81356126d18482602086016125f4565b91505092915050565b6000813590506126e9816136f1565b92915050565b60006020828403121561270157600080fd5b600061270f84828501612632565b91505092915050565b6000806040838503121561272b57600080fd5b600061273985828601612632565b925050602061274a85828601612632565b9150509250929050565b60008060006060848603121561276957600080fd5b600061277786828701612632565b935050602061278886828701612632565b9250506040612799868287016126da565b9150509250925092565b600080600080608085870312156127b957600080fd5b60006127c787828801612632565b94505060206127d887828801612632565b93505060406127e9878288016126da565b925050606085013567ffffffffffffffff81111561280657600080fd5b61281287828801612686565b91505092959194509250565b6000806040838503121561283157600080fd5b600061283f85828601612632565b925050602061285085828601612647565b9150509250929050565b6000806040838503121561286d57600080fd5b600061287b85828601612632565b925050602061288c858286016126da565b9150509250929050565b6000602082840312156128a857600080fd5b60006128b68482850161265c565b91505092915050565b6000602082840312156128d157600080fd5b60006128df84828501612671565b91505092915050565b6000602082840312156128fa57600080fd5b600082013567ffffffffffffffff81111561291457600080fd5b612920848285016126b0565b91505092915050565b60006020828403121561293b57600080fd5b6000612949848285016126da565b91505092915050565b61295b816131b5565b82525050565b61296a816131c7565b82525050565b600061297b82613052565b6129858185613068565b9350612995818560208601613238565b61299e8161340e565b840191505092915050565b60006129b48261305d565b6129be8185613084565b93506129ce818560208601613238565b6129d78161340e565b840191505092915050565b60006129ed8261305d565b6129f78185613095565b9350612a07818560208601613238565b80840191505092915050565b60008154612a208161326b565b612a2a8186613095565b94506001821660008114612a455760018114612a5657612a89565b60ff19831686528186019350612a89565b612a5f8561303d565b60005b83811015612a8157815481890152600182019150602081019050612a62565b838801955050505b50505092915050565b6000612a9f601d83613084565b9150612aaa8261341f565b602082019050919050565b6000612ac2602683613084565b9150612acd82613448565b604082019050919050565b6000612ae5600f83613084565b9150612af082613497565b602082019050919050565b6000612b08601b83613084565b9150612b13826134c0565b602082019050919050565b6000612b2b601283613084565b9150612b36826134e9565b602082019050919050565b6000612b4e602283613084565b9150612b5982613512565b604082019050919050565b6000612b71601a83613084565b9150612b7c82613561565b602082019050919050565b6000612b94601483613084565b9150612b9f8261358a565b602082019050919050565b6000612bb7602083613084565b9150612bc2826135b3565b602082019050919050565b6000612bda601283613084565b9150612be5826135dc565b602082019050919050565b6000612bfd601683613084565b9150612c0882613605565b602082019050919050565b6000612c20601683613084565b9150612c2b8261362e565b602082019050919050565b6000612c43600083613079565b9150612c4e82613657565b600082019050919050565b6000612c66601683613084565b9150612c718261365a565b602082019050919050565b6000612c89601f83613084565b9150612c9482613683565b602082019050919050565b612ca88161321f565b82525050565b612cbf612cba8261321f565b613317565b82525050565b6000612cd182856129e2565b9150612cdd82846129e2565b91508190509392505050565b6000612cf58286612a13565b9150612d018285612cae565b602082019150612d118284612cae565b602082019150819050949350505050565b6000612d2d82612c36565b9150819050919050565b6000602082019050612d4c6000830184612952565b92915050565b6000608082019050612d676000830187612952565b612d746020830186612952565b612d816040830185612c9f565b8181036060830152612d938184612970565b905095945050505050565b6000602082019050612db36000830184612961565b92915050565b60006020820190508181036000830152612dd381846129a9565b905092915050565b60006020820190508181036000830152612df481612a92565b9050919050565b60006020820190508181036000830152612e1481612ab5565b9050919050565b60006020820190508181036000830152612e3481612ad8565b9050919050565b60006020820190508181036000830152612e5481612afb565b9050919050565b60006020820190508181036000830152612e7481612b1e565b9050919050565b60006020820190508181036000830152612e9481612b41565b9050919050565b60006020820190508181036000830152612eb481612b64565b9050919050565b60006020820190508181036000830152612ed481612b87565b9050919050565b60006020820190508181036000830152612ef481612baa565b9050919050565b60006020820190508181036000830152612f1481612bcd565b9050919050565b60006020820190508181036000830152612f3481612bf0565b9050919050565b60006020820190508181036000830152612f5481612c13565b9050919050565b60006020820190508181036000830152612f7481612c59565b9050919050565b60006020820190508181036000830152612f9481612c7c565b9050919050565b6000602082019050612fb06000830184612c9f565b92915050565b6000612fc0612fd1565b9050612fcc828261329d565b919050565b6000604051905090565b600067ffffffffffffffff821115612ff657612ff56133df565b5b612fff8261340e565b9050602081019050919050565b600067ffffffffffffffff821115613027576130266133df565b5b6130308261340e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006130ab8261321f565b91506130b68361321f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130eb576130ea613352565b5b828201905092915050565b60006131018261321f565b915061310c8361321f565b92508261311c5761311b613381565b5b828204905092915050565b60006131328261321f565b915061313d8361321f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561317657613175613352565b5b828202905092915050565b600061318c8261321f565b91506131978361321f565b9250828210156131aa576131a9613352565b5b828203905092915050565b60006131c0826131ff565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561325657808201518184015260208101905061323b565b83811115613265576000848401525b50505050565b6000600282049050600182168061328357607f821691505b60208210811415613297576132966133b0565b5b50919050565b6132a68261340e565b810181811067ffffffffffffffff821117156132c5576132c46133df565b5b80604052505050565b60006132d98261321f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561330c5761330b613352565b5b600182019050919050565b6000819050919050565b600061332c8261321f565b91506133378361321f565b92508261334757613346613381565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f436f6e747261637473206e6f7420616c6c6f77656420746f206d696e74000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b7f52656163686564206d617820616d6f756e7420706572206d696e740000000000600082015250565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f52656163686564206d617820616d6f756e7420706572207472616e736163746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820616c726561647920736574000000000000600082015250565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e74206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4e6f2062616c616e636520746f20776974686472617700000000000000000000600082015250565b7f50726f76656e616e6365206d7573742062652073657400000000000000000000600082015250565b50565b7f50726f76656e616e636520616c72656164792073657400000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6136b5816131b5565b81146136c057600080fd5b50565b6136cc816131c7565b81146136d757600080fd5b50565b6136e3816131d3565b81146136ee57600080fd5b50565b6136fa8161321f565b811461370557600080fd5b5056fea2646970667358221220973b99fd3720ca6588e1b56d6e7fda536d68747411f3921531a22eb4b890cd0964736f6c63430008040033
Deployed Bytecode Sourcemap
53891:3524:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14607:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20254:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22200:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21748:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54021:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54265:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13661:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31465:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54123:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56623:288;;;;;;;;;;;;;:::i;:::-;;23090:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56423:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54324:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20043:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54296:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15286:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50102:103;;;;;;;;;;;;;:::i;:::-;;53971:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49451:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20423:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54171:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54730:967;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22476:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23346:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20598:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54069:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54230:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56521:94;;;;;;;;;;;;;:::i;:::-;;22855:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55902:513;;;;;;;;;;;;;:::i;:::-;;50360:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55705:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14607:615;14692:4;15007:10;14992:25;;:11;:25;;;;:102;;;;15084:10;15069:25;;:11;:25;;;;14992:102;:179;;;;15161:10;15146:25;;:11;:25;;;;14992:179;14972:199;;14607:615;;;:::o;20254:100::-;20308:13;20341:5;20334:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20254:100;:::o;22200:204::-;22268:7;22293:16;22301:7;22293;:16::i;:::-;22288:64;;22318:34;;;;;;;;;;;;;;22288:64;22372:15;:24;22388:7;22372:24;;;;;;;;;;;;;;;;;;;;;22365:31;;22200:204;;;:::o;21748:386::-;21821:13;21837:16;21845:7;21837;:16::i;:::-;21821:32;;21893:5;21870:28;;:19;:17;:19::i;:::-;:28;;;21866:175;;21918:44;21935:5;21942:19;:17;:19::i;:::-;21918:16;:44::i;:::-;21913:128;;21990:35;;;;;;;;;;;;;;21913:128;21866:175;22080:2;22053:15;:24;22069:7;22053:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22118:7;22114:2;22098:28;;22107:5;22098:28;;;;;;;;;;;;21748:386;;;:::o;54021:41::-;54060:2;54021:41;:::o;54265:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13661:315::-;13714:7;13942:15;:13;:15::i;:::-;13927:12;;13911:13;;:28;:46;13904:53;;13661:315;:::o;31465:2800::-;31599:27;31629;31648:7;31629:18;:27::i;:::-;31599:57;;31714:4;31673:45;;31689:19;31673:45;;;31669:86;;31727:28;;;;;;;;;;;;;;31669:86;31769:27;31798:23;31825:28;31845:7;31825:19;:28::i;:::-;31768:85;;;;31953:62;31972:15;31989:4;31995:19;:17;:19::i;:::-;31953:18;:62::i;:::-;31948:174;;32035:43;32052:4;32058:19;:17;:19::i;:::-;32035:16;:43::i;:::-;32030:92;;32087:35;;;;;;;;;;;;;;32030:92;31948:174;32153:1;32139:16;;:2;:16;;;32135:52;;;32164:23;;;;;;;;;;;;;;32135:52;32200:43;32222:4;32228:2;32232:7;32241:1;32200:21;:43::i;:::-;32336:15;32333:2;;;32476:1;32455:19;32448:30;32333:2;32871:18;:24;32890:4;32871:24;;;;;;;;;;;;;;;;32869:26;;;;;;;;;;;;32940:18;:22;32959:2;32940:22;;;;;;;;;;;;;;;;32938:24;;;;;;;;;;;33262:145;33299:2;33347:45;33362:4;33368:2;33372:19;33347:14;:45::i;:::-;10889:8;33320:72;33262:18;:145::i;:::-;33233:17;:26;33251:7;33233:26;;;;;;;;;;;:174;;;;33577:1;10889:8;33527:19;:46;:51;33523:626;;;33599:19;33631:1;33621:7;:11;33599:33;;33788:1;33754:17;:30;33772:11;33754:30;;;;;;;;;;;;:35;33750:384;;;33892:13;;33877:11;:28;33873:242;;34072:19;34039:17;:30;34057:11;34039:30;;;;;;;;;;;:52;;;;33873:242;33750:384;33523:626;;34196:7;34192:2;34177:27;;34186:4;34177:27;;;;;;;;;;;;34215:42;34236:4;34242:2;34246:7;34255:1;34215:20;:42::i;:::-;31465:2800;;;;;;:::o;54123:41::-;54160:4;54123:41;:::o;56623:288::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46549:1:::1;47147:7;;:19;;47139:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46549:1;47280:7;:18;;;;56686:15:::2;56704:21;56686:39;;56754:1;56744:7;:11;56736:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;56796:12;56821:10;56813:24;;56845:7;56813:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56795:62;;;56876:7;56868:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;47311:1;;46505::::1;47459:7:::0;:22:::1;;;;56623:288::o:0;23090:185::-;23228:39;23245:4;23251:2;23255:7;23228:39;;;;;;;;;;;;:16;:39::i;:::-;23090:185;;;:::o;56423:90::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56502:3:::1;56492:7;:13;;;;;;;;;;;;:::i;:::-;;56423:90:::0;:::o;54324:32::-;;;;;;;;;;;;;:::o;20043:144::-;20107:7;20150:27;20169:7;20150:18;:27::i;:::-;20127:52;;20043:144;;;:::o;54296:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15286:224::-;15350:7;15391:1;15374:19;;:5;:19;;;15370:60;;;15402:28;;;;;;;;;;;;;;15370:60;9841:13;15448:18;:25;15467:5;15448:25;;;;;;;;;;;;;;;;:54;15441:61;;15286:224;;;:::o;50102:103::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50167:30:::1;50194:1;50167:18;:30::i;:::-;50102:103::o:0;53971:43::-;54003:11;53971:43;:::o;49451:87::-;49497:7;49524:6;;;;;;;;;;;49517:13;;49451:87;:::o;20423:104::-;20479:13;20512:7;20505:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20423:104;:::o;54171:52::-;54222:1;54160:4;54209:14;;;;:::i;:::-;54171:52;:::o;54730:967::-;54798:12;;;;;;;;;;;54790:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;54865:10;54852:23;;:9;:23;;;54844:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54922:19;54944:14;:12;:14::i;:::-;54922:36;;54969:18;55004:8;54990:11;:22;;;;:::i;:::-;54969:43;;54160:4;55033:10;:24;;55025:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54115:1;55099:8;:31;;55091:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;54060:2;55216:8;55188:25;55202:10;55188:13;:25::i;:::-;:36;;;;:::i;:::-;:52;;55180:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;54222:1;54160:4;54209:14;;;;:::i;:::-;55289:10;:24;55285:365;;;55330:23;55356:8;55330:34;;54222:1;54160:4;54209:14;;;;:::i;:::-;55385:11;:25;55381:122;;;55475:11;54222:1;54160:4;54209:14;;;;:::i;:::-;55461:25;;;;:::i;:::-;55449:8;:38;;;;:::i;:::-;55431:56;;55381:122;55519:20;55550:15;54003:11;55542:23;;;;:::i;:::-;55519:46;;55601:12;55588:9;:25;;55580:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55285:365;;;55662:27;55668:10;55680:8;55662:5;:27::i;:::-;54730:967;;;:::o;22476:308::-;22587:19;:17;:19::i;:::-;22575:31;;:8;:31;;;22571:61;;;22615:17;;;;;;;;;;;;;;22571:61;22697:8;22645:18;:39;22664:19;:17;:19::i;:::-;22645:39;;;;;;;;;;;;;;;:49;22685:8;22645:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;22757:8;22721:55;;22736:19;:17;:19::i;:::-;22721:55;;;22767:8;22721:55;;;;;;:::i;:::-;;;;;;;;22476:308;;:::o;23346:399::-;23513:31;23526:4;23532:2;23536:7;23513:12;:31::i;:::-;23577:1;23559:2;:14;;;:19;23555:183;;23598:56;23629:4;23635:2;23639:7;23648:5;23598:30;:56::i;:::-;23593:145;;23682:40;;;;;;;;;;;;;;23593:145;23555:183;23346:399;;;;:::o;20598:318::-;20671:13;20702:16;20710:7;20702;:16::i;:::-;20697:59;;20727:29;;;;;;;;;;;;;;20697:59;20769:21;20793:10;:8;:10::i;:::-;20769:34;;20846:1;20827:7;20821:21;:26;;:87;;;;;;;;;;;;;;;;;20874:7;20883:18;20893:7;20883:9;:18::i;:::-;20857:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20821:87;20814:94;;;20598:318;;;:::o;54069:47::-;54115:1;54069:47;:::o;54230:28::-;;;;:::o;56521:94::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56595:12:::1;;;;;;;;;;;56594:13;56579:12;;:28;;;;;;;;;;;;;;;;;;56521:94::o:0;22855:164::-;22952:4;22976:18;:25;22995:5;22976:25;;;;;;;;;;;;;;;:35;23002:8;22976:35;;;;;;;;;;;;;;;;;;;;;;;;;22969:42;;22855:164;;;;:::o;55902:513::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55996:1:::1;55974:10;55968:24;;;;;:::i;:::-;;;:29;;55960:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;56060:1;56043:13;;:18;56035:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56105:14;56211:10;56244:12;56279:15;56172:141;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56144:184;;;;;;56122:217;;56105:234;;56392:15;:13;:15::i;:::-;54160:4;56369:6;:19;;;;:::i;:::-;56368:39;;;;:::i;:::-;56352:13;:55;;;;49742:1;55902:513::o:0;50360:201::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50469:1:::1;50449:22;;:8;:22;;;;50441:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50525:28;50544:8;50525:18;:28::i;:::-;50360:201:::0;:::o;55705:189::-;49682:12;:10;:12::i;:::-;49671:23;;:7;:5;:7::i;:::-;:23;;;49663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55821:1:::1;55799:10;55793:24;;;;;:::i;:::-;;;:29;55785:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;55875:11;55862:10;:24;;;;;;;;;;;;:::i;:::-;;55705:189:::0;:::o;24000:273::-;24057:4;24113:7;24094:15;:13;:15::i;:::-;:26;;:66;;;;;24147:13;;24137:7;:23;24094:66;:152;;;;;24245:1;10611:8;24198:17;:26;24216:7;24198:26;;;;;;;;;;;;:43;:48;24094:152;24074:172;;24000:273;;;:::o;42561:105::-;42621:7;42648:10;42641:17;;42561:105;:::o;54521:93::-;54578:7;54605:1;54598:8;;54521:93;:::o;16960:1129::-;17027:7;17047:12;17062:7;17047:22;;17130:4;17111:15;:13;:15::i;:::-;:23;17107:915;;17164:13;;17157:4;:20;17153:869;;;17202:14;17219:17;:23;17237:4;17219:23;;;;;;;;;;;;17202:40;;17335:1;10611:8;17308:6;:23;:28;17304:699;;;17827:113;17844:1;17834:6;:11;17827:113;;;17887:17;:25;17905:6;;;;;;;17887:25;;;;;;;;;;;;17878:34;;17827:113;;;17973:6;17966:13;;;;;;17304:699;17153:869;;17107:915;18050:31;;;;;;;;;;;;;;16960:1129;;;;:::o;29801:652::-;29896:27;29925:23;29966:53;30022:15;29966:71;;30208:7;30202:4;30195:21;30243:22;30237:4;30230:36;30319:4;30313;30303:21;30280:44;;30415:19;30409:26;30390:45;;30146:300;;;;:::o;30566:645::-;30708:11;30870:15;30864:4;30860:26;30852:34;;31029:15;31018:9;31014:31;31001:44;;31176:15;31165:9;31162:30;31155:4;31144:9;31141:19;31138:55;31128:65;;30741:463;;;;;:::o;41394:159::-;;;;;:::o;39706:309::-;39841:7;39861:16;11012:3;39887:19;:40;;39861:67;;11012:3;39954:31;39965:4;39971:2;39975:9;39954:10;:31::i;:::-;39946:40;;:61;;39939:68;;;39706:309;;;;;:::o;19534:447::-;19614:14;19782:15;19775:5;19771:27;19762:36;;19956:5;19942:11;19918:22;19914:40;19911:51;19904:5;19901:62;19891:72;;19650:324;;;;:::o;56919:493::-;57107:1;57091:18;;:4;:18;;;57087:318;;;57131:15;57149:12;57131:30;;57126:268;57188:8;57173:12;:23;;;;:::i;:::-;57163:7;:33;57126:268;;;57344:15;:13;:15::i;:::-;54160:4;57313:13;;57303:7;:23;;;;:::i;:::-;57302:38;;;;:::i;:::-;57301:58;;;;:::i;:::-;57271:7;57233:145;;;;;;;;;;57198:9;;;;;:::i;:::-;;;;57126:268;;;;57087:318;56919:493;;;;:::o;48175:98::-;48228:7;48255:10;48248:17;;48175:98;:::o;50721:191::-;50795:16;50814:6;;;;;;;;;;;50795:25;;50840:8;50831:6;;:17;;;;;;;;;;;;;;;;;;50895:8;50864:40;;50885:8;50864:40;;;;;;;;;;;;50721:191;;:::o;14074:285::-;14121:7;14325:15;:13;:15::i;:::-;14309:13;;:31;14302:38;;14074:285;:::o;15592:176::-;15653:7;9841:13;9978:2;15681:18;:25;15700:5;15681:25;;;;;;;;;;;;;;;;:49;;15680:80;15673:87;;15592:176;;;:::o;25831:1529::-;25896:20;25919:13;;25896:36;;25961:1;25947:16;;:2;:16;;;25943:48;;;25972:19;;;;;;;;;;;;;;25943:48;26018:1;26006:8;:13;26002:44;;;26028:18;;;;;;;;;;;;;;26002:44;26059:61;26089:1;26093:2;26097:12;26111:8;26059:21;:61::i;:::-;26602:1;9978:2;26573:1;:25;;26572:31;26560:8;:44;26534:18;:22;26553:2;26534:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;26881:139;26918:2;26972:33;26995:1;26999:2;27003:1;26972:14;:33::i;:::-;26939:30;26960:8;26939:20;:30::i;:::-;:66;26881:18;:139::i;:::-;26847:17;:31;26865:12;26847:31;;;;;;;;;;;:173;;;;27037:15;27055:12;27037:30;;27082:11;27111:8;27096:12;:23;27082:37;;27134:101;27186:9;;;;;;27182:2;27161:35;;27178:1;27161:35;;;;;;;;;;;;27230:3;27220:7;:13;27134:101;;27267:3;27251:13;:19;;;;25831:1529;;27292:60;27321:1;27325:2;27329:12;27343:8;27292:20;:60::i;:::-;25831:1529;;;:::o;38216:716::-;38379:4;38425:2;38400:45;;;38446:19;:17;:19::i;:::-;38467:4;38473:7;38482:5;38400:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38396:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38700:1;38683:6;:13;:18;38679:235;;;38729:40;;;;;;;;;;;;;;38679:235;38872:6;38866:13;38857:6;38853:2;38849:15;38842:38;38396:529;38569:54;;;38559:64;;;:6;:64;;;;38552:71;;;38216:716;;;;;;:::o;54622:100::-;54674:13;54707:7;54700:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54622:100;:::o;42772:1960::-;42829:17;43248:3;43241:4;43235:11;43231:21;43224:28;;43339:3;43333:4;43326:17;43445:3;43901:5;44031:1;44026:3;44022:11;44015:18;;44168:2;44162:4;44158:13;44154:2;44150:22;44145:3;44137:36;44209:2;44203:4;44199:13;44191:21;;43793:697;44228:4;43793:697;;;44419:1;44414:3;44410:11;44403:18;;44470:2;44464:4;44460:13;44456:2;44452:22;44447:3;44439:36;44323:2;44317:4;44313:13;44305:21;;43793:697;;;43797:430;44529:3;44524;44520:13;44644:2;44639:3;44635:12;44628:19;;44707:6;44702:3;44695:19;42868:1857;;;;;:::o;40591:147::-;40728:6;40591:147;;;;;:::o;21364:322::-;21434:14;21665:1;21655:8;21652:15;21627:23;21623:45;21613:55;;21536:143;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:118::-;6173:24;6191:5;6173:24;:::i;:::-;6168:3;6161:37;6151:53;;:::o;6210:109::-;6291:21;6306:5;6291:21;:::i;:::-;6286:3;6279:34;6269:50;;:::o;6325:360::-;6411:3;6439:38;6471:5;6439:38;:::i;:::-;6493:70;6556:6;6551:3;6493:70;:::i;:::-;6486:77;;6572:52;6617:6;6612:3;6605:4;6598:5;6594:16;6572:52;:::i;:::-;6649:29;6671:6;6649:29;:::i;:::-;6644:3;6640:39;6633:46;;6415:270;;;;;:::o;6691:364::-;6779:3;6807:39;6840:5;6807:39;:::i;:::-;6862:71;6926:6;6921:3;6862:71;:::i;:::-;6855:78;;6942:52;6987:6;6982:3;6975:4;6968:5;6964:16;6942:52;:::i;:::-;7019:29;7041:6;7019:29;:::i;:::-;7014:3;7010:39;7003:46;;6783:272;;;;;:::o;7061:377::-;7167:3;7195:39;7228:5;7195:39;:::i;:::-;7250:89;7332:6;7327:3;7250:89;:::i;:::-;7243:96;;7348:52;7393:6;7388:3;7381:4;7374:5;7370:16;7348:52;:::i;:::-;7425:6;7420:3;7416:16;7409:23;;7171:267;;;;;:::o;7468:845::-;7571:3;7608:5;7602:12;7637:36;7663:9;7637:36;:::i;:::-;7689:89;7771:6;7766:3;7689:89;:::i;:::-;7682:96;;7809:1;7798:9;7794:17;7825:1;7820:137;;;;7971:1;7966:341;;;;7787:520;;7820:137;7904:4;7900:9;7889;7885:25;7880:3;7873:38;7940:6;7935:3;7931:16;7924:23;;7820:137;;7966:341;8033:38;8065:5;8033:38;:::i;:::-;8093:1;8107:154;8121:6;8118:1;8115:13;8107:154;;;8195:7;8189:14;8185:1;8180:3;8176:11;8169:35;8245:1;8236:7;8232:15;8221:26;;8143:4;8140:1;8136:12;8131:17;;8107:154;;;8290:6;8285:3;8281:16;8274:23;;7973:334;;7787:520;;7575:738;;;;;;:::o;8319:366::-;8461:3;8482:67;8546:2;8541:3;8482:67;:::i;:::-;8475:74;;8558:93;8647:3;8558:93;:::i;:::-;8676:2;8671:3;8667:12;8660:19;;8465:220;;;:::o;8691:366::-;8833:3;8854:67;8918:2;8913:3;8854:67;:::i;:::-;8847:74;;8930:93;9019:3;8930:93;:::i;:::-;9048:2;9043:3;9039:12;9032:19;;8837:220;;;:::o;9063:366::-;9205:3;9226:67;9290:2;9285:3;9226:67;:::i;:::-;9219:74;;9302:93;9391:3;9302:93;:::i;:::-;9420:2;9415:3;9411:12;9404:19;;9209:220;;;:::o;9435:366::-;9577:3;9598:67;9662:2;9657:3;9598:67;:::i;:::-;9591:74;;9674:93;9763:3;9674:93;:::i;:::-;9792:2;9787:3;9783:12;9776:19;;9581:220;;;:::o;9807:366::-;9949:3;9970:67;10034:2;10029:3;9970:67;:::i;:::-;9963:74;;10046:93;10135:3;10046:93;:::i;:::-;10164:2;10159:3;10155:12;10148:19;;9953:220;;;:::o;10179:366::-;10321:3;10342:67;10406:2;10401:3;10342:67;:::i;:::-;10335:74;;10418:93;10507:3;10418:93;:::i;:::-;10536:2;10531:3;10527:12;10520:19;;10325:220;;;:::o;10551:366::-;10693:3;10714:67;10778:2;10773:3;10714:67;:::i;:::-;10707:74;;10790:93;10879:3;10790:93;:::i;:::-;10908:2;10903:3;10899:12;10892:19;;10697:220;;;:::o;10923:366::-;11065:3;11086:67;11150:2;11145:3;11086:67;:::i;:::-;11079:74;;11162:93;11251:3;11162:93;:::i;:::-;11280:2;11275:3;11271:12;11264:19;;11069:220;;;:::o;11295:366::-;11437:3;11458:67;11522:2;11517:3;11458:67;:::i;:::-;11451:74;;11534:93;11623:3;11534:93;:::i;:::-;11652:2;11647:3;11643:12;11636:19;;11441:220;;;:::o;11667:366::-;11809:3;11830:67;11894:2;11889:3;11830:67;:::i;:::-;11823:74;;11906:93;11995:3;11906:93;:::i;:::-;12024:2;12019:3;12015:12;12008:19;;11813:220;;;:::o;12039:366::-;12181:3;12202:67;12266:2;12261:3;12202:67;:::i;:::-;12195:74;;12278:93;12367:3;12278:93;:::i;:::-;12396:2;12391:3;12387:12;12380:19;;12185:220;;;:::o;12411:366::-;12553:3;12574:67;12638:2;12633:3;12574:67;:::i;:::-;12567:74;;12650:93;12739:3;12650:93;:::i;:::-;12768:2;12763:3;12759:12;12752:19;;12557:220;;;:::o;12783:398::-;12942:3;12963:83;13044:1;13039:3;12963:83;:::i;:::-;12956:90;;13055:93;13144:3;13055:93;:::i;:::-;13173:1;13168:3;13164:11;13157:18;;12946:235;;;:::o;13187:366::-;13329:3;13350:67;13414:2;13409:3;13350:67;:::i;:::-;13343:74;;13426:93;13515:3;13426:93;:::i;:::-;13544:2;13539:3;13535:12;13528:19;;13333:220;;;:::o;13559:366::-;13701:3;13722:67;13786:2;13781:3;13722:67;:::i;:::-;13715:74;;13798:93;13887:3;13798:93;:::i;:::-;13916:2;13911:3;13907:12;13900:19;;13705:220;;;:::o;13931:118::-;14018:24;14036:5;14018:24;:::i;:::-;14013:3;14006:37;13996:53;;:::o;14055:157::-;14160:45;14180:24;14198:5;14180:24;:::i;:::-;14160:45;:::i;:::-;14155:3;14148:58;14138:74;;:::o;14218:435::-;14398:3;14420:95;14511:3;14502:6;14420:95;:::i;:::-;14413:102;;14532:95;14623:3;14614:6;14532:95;:::i;:::-;14525:102;;14644:3;14637:10;;14402:251;;;;;:::o;14659:551::-;14844:3;14866:92;14954:3;14945:6;14866:92;:::i;:::-;14859:99;;14968:75;15039:3;15030:6;14968:75;:::i;:::-;15068:2;15063:3;15059:12;15052:19;;15081:75;15152:3;15143:6;15081:75;:::i;:::-;15181:2;15176:3;15172:12;15165:19;;15201:3;15194:10;;14848:362;;;;;;:::o;15216:379::-;15400:3;15422:147;15565:3;15422:147;:::i;:::-;15415:154;;15586:3;15579:10;;15404:191;;;:::o;15601:222::-;15694:4;15732:2;15721:9;15717:18;15709:26;;15745:71;15813:1;15802:9;15798:17;15789:6;15745:71;:::i;:::-;15699:124;;;;:::o;15829:640::-;16024:4;16062:3;16051:9;16047:19;16039:27;;16076:71;16144:1;16133:9;16129:17;16120:6;16076:71;:::i;:::-;16157:72;16225:2;16214:9;16210:18;16201:6;16157:72;:::i;:::-;16239;16307:2;16296:9;16292:18;16283:6;16239:72;:::i;:::-;16358:9;16352:4;16348:20;16343:2;16332:9;16328:18;16321:48;16386:76;16457:4;16448:6;16386:76;:::i;:::-;16378:84;;16029:440;;;;;;;:::o;16475:210::-;16562:4;16600:2;16589:9;16585:18;16577:26;;16613:65;16675:1;16664:9;16660:17;16651:6;16613:65;:::i;:::-;16567:118;;;;:::o;16691:313::-;16804:4;16842:2;16831:9;16827:18;16819:26;;16891:9;16885:4;16881:20;16877:1;16866:9;16862:17;16855:47;16919:78;16992:4;16983:6;16919:78;:::i;:::-;16911:86;;16809:195;;;;:::o;17010:419::-;17176:4;17214:2;17203:9;17199:18;17191:26;;17263:9;17257:4;17253:20;17249:1;17238:9;17234:17;17227:47;17291:131;17417:4;17291:131;:::i;:::-;17283:139;;17181:248;;;:::o;17435:419::-;17601:4;17639:2;17628:9;17624:18;17616:26;;17688:9;17682:4;17678:20;17674:1;17663:9;17659:17;17652:47;17716:131;17842:4;17716:131;:::i;:::-;17708:139;;17606:248;;;:::o;17860:419::-;18026:4;18064:2;18053:9;18049:18;18041:26;;18113:9;18107:4;18103:20;18099:1;18088:9;18084:17;18077:47;18141:131;18267:4;18141:131;:::i;:::-;18133:139;;18031:248;;;:::o;18285:419::-;18451:4;18489:2;18478:9;18474:18;18466:26;;18538:9;18532:4;18528:20;18524:1;18513:9;18509:17;18502:47;18566:131;18692:4;18566:131;:::i;:::-;18558:139;;18456:248;;;:::o;18710:419::-;18876:4;18914:2;18903:9;18899:18;18891:26;;18963:9;18957:4;18953:20;18949:1;18938:9;18934:17;18927:47;18991:131;19117:4;18991:131;:::i;:::-;18983:139;;18881:248;;;:::o;19135:419::-;19301:4;19339:2;19328:9;19324:18;19316:26;;19388:9;19382:4;19378:20;19374:1;19363:9;19359:17;19352:47;19416:131;19542:4;19416:131;:::i;:::-;19408:139;;19306:248;;;:::o;19560:419::-;19726:4;19764:2;19753:9;19749:18;19741:26;;19813:9;19807:4;19803:20;19799:1;19788:9;19784:17;19777:47;19841:131;19967:4;19841:131;:::i;:::-;19833:139;;19731:248;;;:::o;19985:419::-;20151:4;20189:2;20178:9;20174:18;20166:26;;20238:9;20232:4;20228:20;20224:1;20213:9;20209:17;20202:47;20266:131;20392:4;20266:131;:::i;:::-;20258:139;;20156:248;;;:::o;20410:419::-;20576:4;20614:2;20603:9;20599:18;20591:26;;20663:9;20657:4;20653:20;20649:1;20638:9;20634:17;20627:47;20691:131;20817:4;20691:131;:::i;:::-;20683:139;;20581:248;;;:::o;20835:419::-;21001:4;21039:2;21028:9;21024:18;21016:26;;21088:9;21082:4;21078:20;21074:1;21063:9;21059:17;21052:47;21116:131;21242:4;21116:131;:::i;:::-;21108:139;;21006:248;;;:::o;21260:419::-;21426:4;21464:2;21453:9;21449:18;21441:26;;21513:9;21507:4;21503:20;21499:1;21488:9;21484:17;21477:47;21541:131;21667:4;21541:131;:::i;:::-;21533:139;;21431:248;;;:::o;21685:419::-;21851:4;21889:2;21878:9;21874:18;21866:26;;21938:9;21932:4;21928:20;21924:1;21913:9;21909:17;21902:47;21966:131;22092:4;21966:131;:::i;:::-;21958:139;;21856:248;;;:::o;22110:419::-;22276:4;22314:2;22303:9;22299:18;22291:26;;22363:9;22357:4;22353:20;22349:1;22338:9;22334:17;22327:47;22391:131;22517:4;22391:131;:::i;:::-;22383:139;;22281:248;;;:::o;22535:419::-;22701:4;22739:2;22728:9;22724:18;22716:26;;22788:9;22782:4;22778:20;22774:1;22763:9;22759:17;22752:47;22816:131;22942:4;22816:131;:::i;:::-;22808:139;;22706:248;;;:::o;22960:222::-;23053:4;23091:2;23080:9;23076:18;23068:26;;23104:71;23172:1;23161:9;23157:17;23148:6;23104:71;:::i;:::-;23058:124;;;;:::o;23188:129::-;23222:6;23249:20;;:::i;:::-;23239:30;;23278:33;23306:4;23298:6;23278:33;:::i;:::-;23229:88;;;:::o;23323:75::-;23356:6;23389:2;23383:9;23373:19;;23363:35;:::o;23404:307::-;23465:4;23555:18;23547:6;23544:30;23541:2;;;23577:18;;:::i;:::-;23541:2;23615:29;23637:6;23615:29;:::i;:::-;23607:37;;23699:4;23693;23689:15;23681:23;;23470:241;;;:::o;23717:308::-;23779:4;23869:18;23861:6;23858:30;23855:2;;;23891:18;;:::i;:::-;23855:2;23929:29;23951:6;23929:29;:::i;:::-;23921:37;;24013:4;24007;24003:15;23995:23;;23784:241;;;:::o;24031:141::-;24080:4;24103:3;24095:11;;24126:3;24123:1;24116:14;24160:4;24157:1;24147:18;24139:26;;24085:87;;;:::o;24178:98::-;24229:6;24263:5;24257:12;24247:22;;24236:40;;;:::o;24282:99::-;24334:6;24368:5;24362:12;24352:22;;24341:40;;;:::o;24387:168::-;24470:11;24504:6;24499:3;24492:19;24544:4;24539:3;24535:14;24520:29;;24482:73;;;;:::o;24561:147::-;24662:11;24699:3;24684:18;;24674:34;;;;:::o;24714:169::-;24798:11;24832:6;24827:3;24820:19;24872:4;24867:3;24863:14;24848:29;;24810:73;;;;:::o;24889:148::-;24991:11;25028:3;25013:18;;25003:34;;;;:::o;25043:305::-;25083:3;25102:20;25120:1;25102:20;:::i;:::-;25097:25;;25136:20;25154:1;25136:20;:::i;:::-;25131:25;;25290:1;25222:66;25218:74;25215:1;25212:81;25209:2;;;25296:18;;:::i;:::-;25209:2;25340:1;25337;25333:9;25326:16;;25087:261;;;;:::o;25354:185::-;25394:1;25411:20;25429:1;25411:20;:::i;:::-;25406:25;;25445:20;25463:1;25445:20;:::i;:::-;25440:25;;25484:1;25474:2;;25489:18;;:::i;:::-;25474:2;25531:1;25528;25524:9;25519:14;;25396:143;;;;:::o;25545:348::-;25585:7;25608:20;25626:1;25608:20;:::i;:::-;25603:25;;25642:20;25660:1;25642:20;:::i;:::-;25637:25;;25830:1;25762:66;25758:74;25755:1;25752:81;25747:1;25740:9;25733:17;25729:105;25726:2;;;25837:18;;:::i;:::-;25726:2;25885:1;25882;25878:9;25867:20;;25593:300;;;;:::o;25899:191::-;25939:4;25959:20;25977:1;25959:20;:::i;:::-;25954:25;;25993:20;26011:1;25993:20;:::i;:::-;25988:25;;26032:1;26029;26026:8;26023:2;;;26037:18;;:::i;:::-;26023:2;26082:1;26079;26075:9;26067:17;;25944:146;;;;:::o;26096:96::-;26133:7;26162:24;26180:5;26162:24;:::i;:::-;26151:35;;26141:51;;;:::o;26198:90::-;26232:7;26275:5;26268:13;26261:21;26250:32;;26240:48;;;:::o;26294:149::-;26330:7;26370:66;26363:5;26359:78;26348:89;;26338:105;;;:::o;26449:126::-;26486:7;26526:42;26519:5;26515:54;26504:65;;26494:81;;;:::o;26581:77::-;26618:7;26647:5;26636:16;;26626:32;;;:::o;26664:154::-;26748:6;26743:3;26738;26725:30;26810:1;26801:6;26796:3;26792:16;26785:27;26715:103;;;:::o;26824:307::-;26892:1;26902:113;26916:6;26913:1;26910:13;26902:113;;;27001:1;26996:3;26992:11;26986:18;26982:1;26977:3;26973:11;26966:39;26938:2;26935:1;26931:10;26926:15;;26902:113;;;27033:6;27030:1;27027:13;27024:2;;;27113:1;27104:6;27099:3;27095:16;27088:27;27024:2;26873:258;;;;:::o;27137:320::-;27181:6;27218:1;27212:4;27208:12;27198:22;;27265:1;27259:4;27255:12;27286:18;27276:2;;27342:4;27334:6;27330:17;27320:27;;27276:2;27404;27396:6;27393:14;27373:18;27370:38;27367:2;;;27423:18;;:::i;:::-;27367:2;27188:269;;;;:::o;27463:281::-;27546:27;27568:4;27546:27;:::i;:::-;27538:6;27534:40;27676:6;27664:10;27661:22;27640:18;27628:10;27625:34;27622:62;27619:2;;;27687:18;;:::i;:::-;27619:2;27727:10;27723:2;27716:22;27506:238;;;:::o;27750:233::-;27789:3;27812:24;27830:5;27812:24;:::i;:::-;27803:33;;27858:66;27851:5;27848:77;27845:2;;;27928:18;;:::i;:::-;27845:2;27975:1;27968:5;27964:13;27957:20;;27793:190;;;:::o;27989:79::-;28028:7;28057:5;28046:16;;28036:32;;;:::o;28074:176::-;28106:1;28123:20;28141:1;28123:20;:::i;:::-;28118:25;;28157:20;28175:1;28157:20;:::i;:::-;28152:25;;28196:1;28186:2;;28201:18;;:::i;:::-;28186:2;28242:1;28239;28235:9;28230:14;;28108:142;;;;:::o;28256:180::-;28304:77;28301:1;28294:88;28401:4;28398:1;28391:15;28425:4;28422:1;28415:15;28442:180;28490:77;28487:1;28480:88;28587:4;28584:1;28577:15;28611:4;28608:1;28601:15;28628:180;28676:77;28673:1;28666:88;28773:4;28770:1;28763:15;28797:4;28794:1;28787:15;28814:180;28862:77;28859:1;28852:88;28959:4;28956:1;28949:15;28983:4;28980:1;28973:15;29000:102;29041:6;29092:2;29088:7;29083:2;29076:5;29072:14;29068:28;29058:38;;29048:54;;;:::o;29108:179::-;29248:31;29244:1;29236:6;29232:14;29225:55;29214:73;:::o;29293:225::-;29433:34;29429:1;29421:6;29417:14;29410:58;29502:8;29497:2;29489:6;29485:15;29478:33;29399:119;:::o;29524:165::-;29664:17;29660:1;29652:6;29648:14;29641:41;29630:59;:::o;29695:177::-;29835:29;29831:1;29823:6;29819:14;29812:53;29801:71;:::o;29878:168::-;30018:20;30014:1;30006:6;30002:14;29995:44;29984:62;:::o;30052:221::-;30192:34;30188:1;30180:6;30176:14;30169:58;30261:4;30256:2;30248:6;30244:15;30237:29;30158:115;:::o;30279:176::-;30419:28;30415:1;30407:6;30403:14;30396:52;30385:70;:::o;30461:170::-;30601:22;30597:1;30589:6;30585:14;30578:46;30567:64;:::o;30637:182::-;30777:34;30773:1;30765:6;30761:14;30754:58;30743:76;:::o;30825:168::-;30965:20;30961:1;30953:6;30949:14;30942:44;30931:62;:::o;30999:172::-;31139:24;31135:1;31127:6;31123:14;31116:48;31105:66;:::o;31177:172::-;31317:24;31313:1;31305:6;31301:14;31294:48;31283:66;:::o;31355:114::-;31461:8;:::o;31475:172::-;31615:24;31611:1;31603:6;31599:14;31592:48;31581:66;:::o;31653:181::-;31793:33;31789:1;31781:6;31777:14;31770:57;31759:75;:::o;31840:122::-;31913:24;31931:5;31913:24;:::i;:::-;31906:5;31903:35;31893:2;;31952:1;31949;31942:12;31893:2;31883:79;:::o;31968:116::-;32038:21;32053:5;32038:21;:::i;:::-;32031:5;32028:32;32018:2;;32074:1;32071;32064:12;32018:2;32008:76;:::o;32090:120::-;32162:23;32179:5;32162:23;:::i;:::-;32155:5;32152:34;32142:2;;32200:1;32197;32190:12;32142:2;32132:78;:::o;32216:122::-;32289:24;32307:5;32289:24;:::i;:::-;32282:5;32279:35;32269:2;;32328:1;32325;32318:12;32269:2;32259:79;:::o
Swarm Source
ipfs://973b99fd3720ca6588e1b56d6e7fda536d68747411f3921531a22eb4b890cd09
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.