ERC-721
Overview
Max Total Supply
473 3DC
Holders
19
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 3DCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
TDCNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./ERC721A.sol"; import "./Ownable.sol"; import "./Strings.sol"; import "./ReentrancyGuard.sol"; import "./MerkleProof.sol"; contract TDCNFT is ERC721A, Ownable, ReentrancyGuard { string public baseTokenURI; bool public isPaused = false; uint256 public constant maxSupply = 5555; bytes32 public merkleRoot = 0x9db6fccf86cd6b84d01d32673a8cce2e7e9aaa6667109823fa4e2fc32777c464; uint256 public constant price = 0.089 ether; uint256 public constant wlPrice = 0.069 ether; uint256 public wlSaleStartTime = 1666890000; uint256 public wlSaleEndTime = 1666897200; uint256 public publicSaleStartTime = 1666900800; uint256 public publicSaleEndTime = 1674849600; uint8 public amountPerAddr = 3; uint8 public wlAmountPerAddr = 2; uint16 public customDropMaxSupply = 51; uint8 public totalCustomDrop = 0; mapping(address => uint8) public holdedNumAry; constructor( string memory _name, string memory _symbol, string memory _uri ) ERC721A(_name, _symbol) { baseTokenURI = _uri; } function publicSale(uint8 _purchaseNum) external payable onlyUser nonReentrant { require(!isPaused, "3DCNFT: currently paused"); require( block.timestamp >= publicSaleStartTime, "3DCNFT: public sale is not started yet" ); require( block.timestamp < publicSaleEndTime, "3DCNFT: public sale is ended" ); require( (holdedNumAry[_msgSender()] + _purchaseNum) <= amountPerAddr, "3DCNFT: Each Address can only purchase 3" ); uint256 supply = totalSupply(); require( (supply + _purchaseNum) <= maxSupply, "3DCNFT: reached max supply" ); require( msg.value >= (price * _purchaseNum), "3DCNFT: price is incorrect" ); _safeMint(_msgSender(), _purchaseNum); holdedNumAry[_msgSender()] = holdedNumAry[_msgSender()] + _purchaseNum; } function whiteListSale(bytes32[] calldata _merkleProof, uint8 _purchaseNum) external payable onlyUser nonReentrant { require(!isPaused, "3DCNFT: currently paused"); require( block.timestamp >= wlSaleStartTime, "3DCNFT: WhiteList sale is not started yet" ); require( block.timestamp < wlSaleEndTime, "3DCNFT: WhiteList sale is ended" ); require(verifyAddress(_merkleProof), "3DCNFT: You are not on WhiteList" ); require( (holdedNumAry[_msgSender()] + _purchaseNum) <= wlAmountPerAddr, "3DCNFT: Each Address during presale can only purchase 2" ); uint256 supply = totalSupply(); require( (supply + _purchaseNum) <= maxSupply, "3DCNFT: reached max supply" ); require( msg.value >= (wlPrice * _purchaseNum), "3DCNFT: price is incorrect" ); _safeMint(_msgSender(), _purchaseNum); holdedNumAry[_msgSender()] = holdedNumAry[_msgSender()] + _purchaseNum; } function ownerMint(address _addr, uint8 _amount) external onlyOwner { uint256 supply = totalSupply(); require( (supply + _amount) <= maxSupply, "3DCNFT: reached max supply" ); _safeMint(_addr, _amount); } function ownerBatchMint(address[] memory _addrs, uint8[] memory _amount, uint256 _total) external onlyOwner { uint256 supply = totalSupply(); require( (supply + _total) <= maxSupply, "3DCNFT: reached max supply" ); for (uint256 i = 0; i < _addrs.length; i++) { _safeMint(_addrs[i], _amount[i]); } } function ownerCustomMint(address _addr, uint8 _amount) external onlyOwner { require( totalCustomDrop + _amount <= customDropMaxSupply, "3DCNFT: reached max custom drop supply" ); _safeMint(_addr, _amount); totalCustomDrop = totalCustomDrop + _amount; } function ownerBatchTransfer(address[] memory _addrs, uint256[] memory _ids) external onlyOwner { for (uint256 i = 0; i < _addrs.length; i++) { transferFrom(_msgSender(), _addrs[i], _ids[i]); } } modifier onlyUser() { require(_msgSender() == tx.origin, "3DCNFT: no contract mint"); _; } function verifyAddress(bytes32[] calldata _merkleProof) private view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); return MerkleProof.verify(_merkleProof, merkleRoot, leaf); } function setBaseURI(string memory _baseURI) external onlyOwner { baseTokenURI = _baseURI; } function setMerkleRoot(bytes32 merkleRootHash) external onlyOwner { merkleRoot = merkleRootHash; } function setPause(bool _isPaused) external onlyOwner returns (bool) { isPaused = _isPaused; return true; } function setWlStartTime(uint256 _time) external onlyOwner { wlSaleStartTime = _time; } function setWlEndTime(uint256 _time) external onlyOwner { wlSaleEndTime = _time; } function setPublicStartTime(uint256 _time) external onlyOwner { publicSaleStartTime = _time; } function setPublicEndTime(uint256 _time) external onlyOwner { publicSaleEndTime = _time; } function setCustomDropMaxSupply(uint16 _amount) external onlyOwner { require( _amount >= totalCustomDrop, "3DCNFT: amount less than dropped" ); customDropMaxSupply = _amount; } function withdraw() external onlyOwner { payable(owner()).transfer(address(this).balance); } function tokenURI(uint256 _tokenId) public view override(ERC721A) returns (string memory) { return string(abi.encodePacked(baseTokenURI, Strings.toString(_tokenId))); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; import "./IERC721A.sol"; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // 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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","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":"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":"amountPerAddr","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customDropMaxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"","type":"address"}],"name":"holdedNumAry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":"address[]","name":"_addrs","type":"address[]"},{"internalType":"uint8[]","name":"_amount","type":"uint8[]"},{"internalType":"uint256","name":"_total","type":"uint256"}],"name":"ownerBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"ownerBatchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint8","name":"_amount","type":"uint8"}],"name":"ownerCustomMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint8","name":"_amount","type":"uint8"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_purchaseNum","type":"uint8"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setCustomDropMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRootHash","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPaused","type":"bool"}],"name":"setPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setPublicEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setPublicStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setWlEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setWlStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCustomDrop","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint8","name":"_purchaseNum","type":"uint8"}],"name":"whiteListSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlAmountPerAddr","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlSaleEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlSaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600b805460ff191690557f9db6fccf86cd6b84d01d32673a8cce2e7e9aaa6667109823fa4e2fc32777c464600c5563635ab910600d5563635ad530600e5563635ae340600f556363d42d406010556011805464ffffffffff1916623302031790553480156200007257600080fd5b5060405162002b2638038062002b268339810160408190526200009591620002aa565b825183908390620000ae9060029060208501906200014d565b508051620000c49060039060208401906200014d565b5050600160005550620000d733620000fb565b60016009558051620000f190600a9060208401906200014d565b505050506200038e565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200015b906200033b565b90600052602060002090601f0160209004810192826200017f5760008555620001ca565b82601f106200019a57805160ff1916838001178555620001ca565b82800160010185558215620001ca579182015b82811115620001ca578251825591602001919060010190620001ad565b50620001d8929150620001dc565b5090565b5b80821115620001d85760008155600101620001dd565b600082601f8301126200020557600080fd5b81516001600160401b038082111562000222576200022262000378565b604051601f8301601f19908116603f011681019082821181831017156200024d576200024d62000378565b816040528381526020925086838588010111156200026a57600080fd5b600091505b838210156200028e57858201830151818301840152908201906200026f565b83821115620002a05760008385830101525b9695505050505050565b600080600060608486031215620002c057600080fd5b83516001600160401b0380821115620002d857600080fd5b620002e687838801620001f3565b94506020860151915080821115620002fd57600080fd5b6200030b87838801620001f3565b935060408601519150808211156200032257600080fd5b506200033186828701620001f3565b9150509250925092565b600181811c908216806200035057607f821691505b602082108114156200037257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612788806200039e6000396000f3fe6080604052600436106102875760003560e01c80636bb7b1d91161015a578063bb2d7102116100c1578063d547cfb71161007a578063d547cfb71461076c578063d5abeb0114610781578063db8cc8fa14610797578063e892e2e7146107b7578063e985e9c5146107ca578063f2fde38b1461081357600080fd5b8063bb2d71021461069b578063bedb86fb146106cf578063c7f8d01a146106ef578063c87b56dd1461070a578063ce91804a1461072a578063d2dbe5fb1461074c57600080fd5b80638da5cb5b116101135780638da5cb5b146105ff57806395d89b411461061d578063a035b1fe14610632578063a22cb4651461064e578063b187bd261461066e578063b88d4fde1461068857600080fd5b80636bb7b1d91461054457806370a082311461055a578063715018a61461057a5780637be2e7891461058f5780637cb64759146105bf57806384606943146105df57600080fd5b80631e4d185f116101fe5780634481c66e116101b75780634481c66e1461049957806345ea45e1146104b85780634c796686146104ce57806355f804b3146104ee578063629403f51461050e5780636352211e1461052457600080fd5b80631e4d185f1461041257806323b872dd146104285780632eb4a7ab1461043b5780633855c60d146104515780633ccfd60b1461047157806342842e0e1461048657600080fd5b806307f1891e1161025057806307f1891e14610345578063081812fc14610365578063095ea7b31461039d5780631751b554146103b057806318160ddd146103dc5780631bcc80ac146103ff57600080fd5b80621e201b1461028c57806301ffc9a7146102ae57806302cdc713146102e357806306ab59e71461030357806306fdde0314610323575b600080fd5b34801561029857600080fd5b506102ac6102a73660046123bd565b610833565b005b3480156102ba57600080fd5b506102ce6102c936600461233a565b6108c1565b60405190151581526020015b60405180910390f35b3480156102ef57600080fd5b506102ac6102fe366004612321565b610913565b34801561030f57600080fd5b506102ac61031e3660046120ef565b610920565b34801561032f57600080fd5b50610338610988565b6040516102da9190612528565b34801561035157600080fd5b506102ac610360366004612321565b610a1a565b34801561037157600080fd5b50610385610380366004612321565b610a27565b6040516001600160a01b0390911681526020016102da565b6102ac6103ab36600461209b565b610a6b565b3480156103bc57600080fd5b506011546103ca9060ff1681565b60405160ff90911681526020016102da565b3480156103e857600080fd5b506103f1610b0b565b6040519081526020016102da565b6102ac61040d3660046123e1565b610b19565b34801561041e57600080fd5b506103f160105481565b6102ac610436366004611fb9565b610de9565b34801561044757600080fd5b506103f1600c5481565b34801561045d57600080fd5b506102ac61046c3660046120c5565b610f7a565b34801561047d57600080fd5b506102ac610fc9565b6102ac610494366004611fb9565b61100a565b3480156104a557600080fd5b506011546103ca90610100900460ff1681565b3480156104c457600080fd5b506103f1600d5481565b3480156104da57600080fd5b506102ac6104e93660046120c5565b611025565b3480156104fa57600080fd5b506102ac610509366004612374565b6110f5565b34801561051a57600080fd5b506103f1600e5481565b34801561053057600080fd5b5061038561053f366004612321565b611114565b34801561055057600080fd5b506103f1600f5481565b34801561056657600080fd5b506103f1610575366004611f6b565b61111f565b34801561058657600080fd5b506102ac61116e565b34801561059b57600080fd5b506103ca6105aa366004611f6b565b60126020526000908152604090205460ff1681565b3480156105cb57600080fd5b506102ac6105da366004612321565b611182565b3480156105eb57600080fd5b506102ac6105fa366004612321565b61118f565b34801561060b57600080fd5b506008546001600160a01b0316610385565b34801561062957600080fd5b5061033861119c565b34801561063e57600080fd5b506103f167013c31074902800081565b34801561065a57600080fd5b506102ac610669366004612071565b6111ab565b34801561067a57600080fd5b50600b546102ce9060ff1681565b6102ac610696366004611ff5565b611217565b3480156106a757600080fd5b506011546106bc9062010000900461ffff1681565b60405161ffff90911681526020016102da565b3480156106db57600080fd5b506102ce6106ea366004612306565b611261565b3480156106fb57600080fd5b506103f166f523226980800081565b34801561071657600080fd5b50610338610725366004612321565b611282565b34801561073657600080fd5b506011546103ca90640100000000900460ff1681565b34801561075857600080fd5b506102ac6107673660046121b1565b6112b6565b34801561077857600080fd5b50610338611359565b34801561078d57600080fd5b506103f16115b381565b3480156107a357600080fd5b506102ac6107b2366004612321565b6113e7565b6102ac6107c5366004612282565b6113f4565b3480156107d657600080fd5b506102ce6107e5366004611f86565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561081f57600080fd5b506102ac61082e366004611f6b565b611730565b61083b6117a6565b601154640100000000900460ff1661ffff821610156108a15760405162461bcd60e51b815260206004820181905260248201527f3344434e46543a20616d6f756e74206c657373207468616e2064726f7070656460448201526064015b60405180910390fd5b6011805461ffff909216620100000263ffff000019909216919091179055565b60006301ffc9a760e01b6001600160e01b0319831614806108f257506380ac58cd60e01b6001600160e01b03198316145b8061090d5750635b5e139f60e01b6001600160e01b03198316145b92915050565b61091b6117a6565b600e55565b6109286117a6565b60005b8251811015610983576109713384838151811061094a5761094a612710565b602002602001015184848151811061096457610964612710565b6020026020010151610de9565b8061097b816126b5565b91505061092b565b505050565b6060600280546109979061267a565b80601f01602080910402602001604051908101604052809291908181526020018280546109c39061267a565b8015610a105780601f106109e557610100808354040283529160200191610a10565b820191906000526020600020905b8154815290600101906020018083116109f357829003601f168201915b5050505050905090565b610a226117a6565b600d55565b6000610a3282611800565b610a4f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a7682611114565b9050336001600160a01b03821614610aaf57610a9281336107e5565b610aaf576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600154600054036000190190565b333214610b635760405162461bcd60e51b81526020600482015260186024820152770cd110d391950e881b9bc818dbdb9d1c9858dd081b5a5b9d60421b6044820152606401610898565b610b6b611835565b600b5460ff1615610bb95760405162461bcd60e51b81526020600482015260186024820152770cd110d391950e8818dd5c9c995b9d1b1e481c185d5cd95960421b6044820152606401610898565b600f54421015610c1a5760405162461bcd60e51b815260206004820152602660248201527f3344434e46543a207075626c69632073616c65206973206e6f742073746172746044820152651959081e595d60d21b6064820152608401610898565b6010544210610c6b5760405162461bcd60e51b815260206004820152601c60248201527f3344434e46543a207075626c69632073616c6520697320656e646564000000006044820152606401610898565b6011543360009081526012602052604090205460ff91821691610c90918491166125df565b60ff161115610cf25760405162461bcd60e51b815260206004820152602860248201527f3344434e46543a204561636820416464726573732063616e206f6e6c79207075604482015267726368617365203360c01b6064820152608401610898565b6000610cfc610b0b565b90506115b3610d0e60ff8416836125c7565b1115610d2c5760405162461bcd60e51b81526004016108989061253b565b610d4160ff831667013c310749028000612618565b341015610d905760405162461bcd60e51b815260206004820152601a60248201527f3344434e46543a20707269636520697320696e636f72726563740000000000006044820152606401610898565b610d9e335b8360ff1661188f565b33600090815260126020526040902054610dbc90839060ff166125df565b336000908152601260205260409020805460ff191660ff9290921691909117905550506001600955565b50565b6000610df4826118a9565b9050836001600160a01b0316816001600160a01b031614610e275760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610e7457610e5786336107e5565b610e7457604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610e9b57604051633a954ecd60e21b815260040160405180910390fd5b8015610ea657600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610f315760018401600081815260046020526040902054610f2f576000548114610f2f5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b610f826117a6565b6000610f8c610b0b565b90506115b3610f9e60ff8416836125c7565b1115610fbc5760405162461bcd60e51b81526004016108989061253b565b610983838360ff1661188f565b610fd16117a6565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610de6573d6000803e3d6000fd5b61098383838360405180602001604052806000815250611217565b61102d6117a6565b60115462010000810461ffff1690611051908390640100000000900460ff166125df565b60ff1611156110b15760405162461bcd60e51b815260206004820152602660248201527f3344434e46543a2072656163686564206d617820637573746f6d2064726f7020604482015265737570706c7960d01b6064820152608401610898565b6110be828260ff1661188f565b6011546110d7908290640100000000900460ff166125df565b601160046101000a81548160ff021916908360ff1602179055505050565b6110fd6117a6565b805161111090600a906020840190611dc9565b5050565b600061090d826118a9565b60006001600160a01b038216611148576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6111766117a6565b6111806000611919565b565b61118a6117a6565b600c55565b6111976117a6565b601055565b6060600380546109979061267a565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611222848484610de9565b6001600160a01b0383163b1561125b5761123e8484848461196b565b61125b576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600061126b6117a6565b50600b805460ff191682151517905560015b919050565b6060600a61128f83611a63565b6040516020016112a0929190612444565b6040516020818303038152906040529050919050565b6112be6117a6565b60006112c8610b0b565b90506115b36112d783836125c7565b11156112f55760405162461bcd60e51b81526004016108989061253b565b60005b84518110156113525761134085828151811061131657611316612710565b602002602001015185838151811061133057611330612710565b602002602001015160ff1661188f565b8061134a816126b5565b9150506112f8565b5050505050565b600a80546113669061267a565b80601f01602080910402602001604051908101604052809291908181526020018280546113929061267a565b80156113df5780601f106113b4576101008083540402835291602001916113df565b820191906000526020600020905b8154815290600101906020018083116113c257829003601f168201915b505050505081565b6113ef6117a6565b600f55565b33321461143e5760405162461bcd60e51b81526020600482015260186024820152770cd110d391950e881b9bc818dbdb9d1c9858dd081b5a5b9d60421b6044820152606401610898565b611446611835565b600b5460ff16156114945760405162461bcd60e51b81526020600482015260186024820152770cd110d391950e8818dd5c9c995b9d1b1e481c185d5cd95960421b6044820152606401610898565b600d544210156114f85760405162461bcd60e51b815260206004820152602960248201527f3344434e46543a2057686974654c6973742073616c65206973206e6f74207374604482015268185c9d1959081e595d60ba1b6064820152608401610898565b600e5442106115495760405162461bcd60e51b815260206004820152601f60248201527f3344434e46543a2057686974654c6973742073616c6520697320656e646564006044820152606401610898565b6115538383611b61565b61159f5760405162461bcd60e51b815260206004820181905260248201527f3344434e46543a20596f7520617265206e6f74206f6e2057686974654c6973746044820152606401610898565b6011543360009081526012602052604090205460ff6101009092048216916115c9918491166125df565b60ff1611156116405760405162461bcd60e51b815260206004820152603760248201527f3344434e46543a2045616368204164647265737320647572696e67207072657360448201527f616c652063616e206f6e6c7920707572636861736520320000000000000000006064820152608401610898565b600061164a610b0b565b90506115b361165c60ff8416836125c7565b111561167a5760405162461bcd60e51b81526004016108989061253b565b61168e60ff831666f5232269808000612618565b3410156116dd5760405162461bcd60e51b815260206004820152601a60248201527f3344434e46543a20707269636520697320696e636f72726563740000000000006044820152606401610898565b6116e633610d95565b3360009081526012602052604090205461170490839060ff166125df565b336000908152601260205260409020805460ff191660ff92909216919091179055505060016009555050565b6117386117a6565b6001600160a01b03811661179d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610898565b610de681611919565b6008546001600160a01b031633146111805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610898565b600081600111158015611814575060005482105b801561090d575050600090815260046020526040902054600160e01b161590565b600260095414156118885760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610898565b6002600955565b611110828260405180602001604052806000815250611bdd565b600081806001116119005760005481101561190057600081815260046020526040902054600160e01b81166118fe575b806118f75750600019016000818152600460205260409020546118d9565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119a09033908990889088906004016124eb565b602060405180830381600087803b1580156119ba57600080fd5b505af19250505080156119ea575060408051601f3d908101601f191682019092526119e791810190612357565b60015b611a45573d808015611a18576040519150601f19603f3d011682016040523d82523d6000602084013e611a1d565b606091505b508051611a3d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081611a875750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ab15780611a9b816126b5565b9150611aaa9050600a83612604565b9150611a8b565b60008167ffffffffffffffff811115611acc57611acc612726565b6040519080825280601f01601f191660200182016040528015611af6576020820181803683370190505b5090505b8415611a5b57611b0b600183612637565b9150611b18600a866126d0565b611b239060306125c7565b60f81b818381518110611b3857611b38612710565b60200101906001600160f81b031916908160001a905350611b5a600a86612604565b9450611afa565b6040516bffffffffffffffffffffffff193360601b1660208201526000908190603401604051602081830303815290604052805190602001209050611a5b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c549150849050611c43565b611be78383611c59565b6001600160a01b0383163b15610983576000548281035b611c11600086838060010194508661196b565b611c2e576040516368d2bf6b60e11b815260040160405180910390fd5b818110611bfe57816000541461135257600080fd5b600082611c508584611d50565b14949350505050565b60005481611c7a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611d2957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611cf1565b5081611d4757604051622e076360e81b815260040160405180910390fd5b60005550505050565b600081815b8451811015611d9557611d8182868381518110611d7457611d74612710565b6020026020010151611d9d565b915080611d8d816126b5565b915050611d55565b509392505050565b6000818310611db95760008281526020849052604090206118f7565b5060009182526020526040902090565b828054611dd59061267a565b90600052602060002090601f016020900481019282611df75760008555611e3d565b82601f10611e1057805160ff1916838001178555611e3d565b82800160010185558215611e3d579182015b82811115611e3d578251825591602001919060010190611e22565b50611e49929150611e4d565b5090565b5b80821115611e495760008155600101611e4e565b600067ffffffffffffffff831115611e7c57611e7c612726565b611e8f601f8401601f1916602001612572565b9050828152838383011115611ea357600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461127d57600080fd5b600082601f830112611ee257600080fd5b81356020611ef7611ef2836125a3565b612572565b80838252828201915082860187848660051b8901011115611f1757600080fd5b60005b85811015611f3d57611f2b82611eba565b84529284019290840190600101611f1a565b5090979650505050505050565b8035801515811461127d57600080fd5b803560ff8116811461127d57600080fd5b600060208284031215611f7d57600080fd5b6118f782611eba565b60008060408385031215611f9957600080fd5b611fa283611eba565b9150611fb060208401611eba565b90509250929050565b600080600060608486031215611fce57600080fd5b611fd784611eba565b9250611fe560208501611eba565b9150604084013590509250925092565b6000806000806080858703121561200b57600080fd5b61201485611eba565b935061202260208601611eba565b925060408501359150606085013567ffffffffffffffff81111561204557600080fd5b8501601f8101871361205657600080fd5b61206587823560208401611e62565b91505092959194509250565b6000806040838503121561208457600080fd5b61208d83611eba565b9150611fb060208401611f4a565b600080604083850312156120ae57600080fd5b6120b783611eba565b946020939093013593505050565b600080604083850312156120d857600080fd5b6120e183611eba565b9150611fb060208401611f5a565b6000806040838503121561210257600080fd5b823567ffffffffffffffff8082111561211a57600080fd5b61212686838701611ed1565b935060209150818501358181111561213d57600080fd5b85019050601f8101861361215057600080fd5b803561215e611ef2826125a3565b80828252848201915084840189868560051b870101111561217e57600080fd5b600094505b838510156121a1578035835260019490940193918501918501612183565b5080955050505050509250929050565b6000806000606084860312156121c657600080fd5b833567ffffffffffffffff808211156121de57600080fd5b6121ea87838801611ed1565b945060209150818601358181111561220157600080fd5b86019050601f8101871361221457600080fd5b8035612222611ef2826125a3565b8082825284820191508484018a868560051b870101111561224257600080fd5b600094505b8385101561226c5761225881611f5a565b835260019490940193918501918501612247565b5096999698505050506040949094013593505050565b60008060006040848603121561229757600080fd5b833567ffffffffffffffff808211156122af57600080fd5b818601915086601f8301126122c357600080fd5b8135818111156122d257600080fd5b8760208260051b85010111156122e757600080fd5b6020928301955093506122fd9186019050611f5a565b90509250925092565b60006020828403121561231857600080fd5b6118f782611f4a565b60006020828403121561233357600080fd5b5035919050565b60006020828403121561234c57600080fd5b81356118f78161273c565b60006020828403121561236957600080fd5b81516118f78161273c565b60006020828403121561238657600080fd5b813567ffffffffffffffff81111561239d57600080fd5b8201601f810184136123ae57600080fd5b611a5b84823560208401611e62565b6000602082840312156123cf57600080fd5b813561ffff811681146118f757600080fd5b6000602082840312156123f357600080fd5b6118f782611f5a565b6000815180845261241481602086016020860161264e565b601f01601f19169290920160200192915050565b6000815161243a81856020860161264e565b9290920192915050565b600080845481600182811c91508083168061246057607f831692505b602080841082141561248057634e487b7160e01b86526022600452602486fd5b81801561249457600181146124a5576124d2565b60ff198616895284890196506124d2565b60008b81526020902060005b868110156124ca5781548b8201529085019083016124b1565b505084890196505b5050505050506124e28185612428565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061251e908301846123fc565b9695505050505050565b6020815260006118f760208301846123fc565b6020808252601a908201527f3344434e46543a2072656163686564206d617820737570706c79000000000000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561259b5761259b612726565b604052919050565b600067ffffffffffffffff8211156125bd576125bd612726565b5060051b60200190565b600082198211156125da576125da6126e4565b500190565b600060ff821660ff84168060ff038211156125fc576125fc6126e4565b019392505050565b600082612613576126136126fa565b500490565b6000816000190483118215151615612632576126326126e4565b500290565b600082821015612649576126496126e4565b500390565b60005b83811015612669578181015183820152602001612651565b8381111561125b5750506000910152565b600181811c9082168061268e57607f821691505b602082108114156126af57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126c9576126c96126e4565b5060010190565b6000826126df576126df6126fa565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610de657600080fdfea264697066735822122088b51b7fd40ae555ad2738268171655b64e9ff36976afeb4fd594b93ffab848064736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000063344434e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033344430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f6170692e66616e73692e6d652f4e46542f74647261676f6e2f00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102875760003560e01c80636bb7b1d91161015a578063bb2d7102116100c1578063d547cfb71161007a578063d547cfb71461076c578063d5abeb0114610781578063db8cc8fa14610797578063e892e2e7146107b7578063e985e9c5146107ca578063f2fde38b1461081357600080fd5b8063bb2d71021461069b578063bedb86fb146106cf578063c7f8d01a146106ef578063c87b56dd1461070a578063ce91804a1461072a578063d2dbe5fb1461074c57600080fd5b80638da5cb5b116101135780638da5cb5b146105ff57806395d89b411461061d578063a035b1fe14610632578063a22cb4651461064e578063b187bd261461066e578063b88d4fde1461068857600080fd5b80636bb7b1d91461054457806370a082311461055a578063715018a61461057a5780637be2e7891461058f5780637cb64759146105bf57806384606943146105df57600080fd5b80631e4d185f116101fe5780634481c66e116101b75780634481c66e1461049957806345ea45e1146104b85780634c796686146104ce57806355f804b3146104ee578063629403f51461050e5780636352211e1461052457600080fd5b80631e4d185f1461041257806323b872dd146104285780632eb4a7ab1461043b5780633855c60d146104515780633ccfd60b1461047157806342842e0e1461048657600080fd5b806307f1891e1161025057806307f1891e14610345578063081812fc14610365578063095ea7b31461039d5780631751b554146103b057806318160ddd146103dc5780631bcc80ac146103ff57600080fd5b80621e201b1461028c57806301ffc9a7146102ae57806302cdc713146102e357806306ab59e71461030357806306fdde0314610323575b600080fd5b34801561029857600080fd5b506102ac6102a73660046123bd565b610833565b005b3480156102ba57600080fd5b506102ce6102c936600461233a565b6108c1565b60405190151581526020015b60405180910390f35b3480156102ef57600080fd5b506102ac6102fe366004612321565b610913565b34801561030f57600080fd5b506102ac61031e3660046120ef565b610920565b34801561032f57600080fd5b50610338610988565b6040516102da9190612528565b34801561035157600080fd5b506102ac610360366004612321565b610a1a565b34801561037157600080fd5b50610385610380366004612321565b610a27565b6040516001600160a01b0390911681526020016102da565b6102ac6103ab36600461209b565b610a6b565b3480156103bc57600080fd5b506011546103ca9060ff1681565b60405160ff90911681526020016102da565b3480156103e857600080fd5b506103f1610b0b565b6040519081526020016102da565b6102ac61040d3660046123e1565b610b19565b34801561041e57600080fd5b506103f160105481565b6102ac610436366004611fb9565b610de9565b34801561044757600080fd5b506103f1600c5481565b34801561045d57600080fd5b506102ac61046c3660046120c5565b610f7a565b34801561047d57600080fd5b506102ac610fc9565b6102ac610494366004611fb9565b61100a565b3480156104a557600080fd5b506011546103ca90610100900460ff1681565b3480156104c457600080fd5b506103f1600d5481565b3480156104da57600080fd5b506102ac6104e93660046120c5565b611025565b3480156104fa57600080fd5b506102ac610509366004612374565b6110f5565b34801561051a57600080fd5b506103f1600e5481565b34801561053057600080fd5b5061038561053f366004612321565b611114565b34801561055057600080fd5b506103f1600f5481565b34801561056657600080fd5b506103f1610575366004611f6b565b61111f565b34801561058657600080fd5b506102ac61116e565b34801561059b57600080fd5b506103ca6105aa366004611f6b565b60126020526000908152604090205460ff1681565b3480156105cb57600080fd5b506102ac6105da366004612321565b611182565b3480156105eb57600080fd5b506102ac6105fa366004612321565b61118f565b34801561060b57600080fd5b506008546001600160a01b0316610385565b34801561062957600080fd5b5061033861119c565b34801561063e57600080fd5b506103f167013c31074902800081565b34801561065a57600080fd5b506102ac610669366004612071565b6111ab565b34801561067a57600080fd5b50600b546102ce9060ff1681565b6102ac610696366004611ff5565b611217565b3480156106a757600080fd5b506011546106bc9062010000900461ffff1681565b60405161ffff90911681526020016102da565b3480156106db57600080fd5b506102ce6106ea366004612306565b611261565b3480156106fb57600080fd5b506103f166f523226980800081565b34801561071657600080fd5b50610338610725366004612321565b611282565b34801561073657600080fd5b506011546103ca90640100000000900460ff1681565b34801561075857600080fd5b506102ac6107673660046121b1565b6112b6565b34801561077857600080fd5b50610338611359565b34801561078d57600080fd5b506103f16115b381565b3480156107a357600080fd5b506102ac6107b2366004612321565b6113e7565b6102ac6107c5366004612282565b6113f4565b3480156107d657600080fd5b506102ce6107e5366004611f86565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561081f57600080fd5b506102ac61082e366004611f6b565b611730565b61083b6117a6565b601154640100000000900460ff1661ffff821610156108a15760405162461bcd60e51b815260206004820181905260248201527f3344434e46543a20616d6f756e74206c657373207468616e2064726f7070656460448201526064015b60405180910390fd5b6011805461ffff909216620100000263ffff000019909216919091179055565b60006301ffc9a760e01b6001600160e01b0319831614806108f257506380ac58cd60e01b6001600160e01b03198316145b8061090d5750635b5e139f60e01b6001600160e01b03198316145b92915050565b61091b6117a6565b600e55565b6109286117a6565b60005b8251811015610983576109713384838151811061094a5761094a612710565b602002602001015184848151811061096457610964612710565b6020026020010151610de9565b8061097b816126b5565b91505061092b565b505050565b6060600280546109979061267a565b80601f01602080910402602001604051908101604052809291908181526020018280546109c39061267a565b8015610a105780601f106109e557610100808354040283529160200191610a10565b820191906000526020600020905b8154815290600101906020018083116109f357829003601f168201915b5050505050905090565b610a226117a6565b600d55565b6000610a3282611800565b610a4f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a7682611114565b9050336001600160a01b03821614610aaf57610a9281336107e5565b610aaf576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600154600054036000190190565b333214610b635760405162461bcd60e51b81526020600482015260186024820152770cd110d391950e881b9bc818dbdb9d1c9858dd081b5a5b9d60421b6044820152606401610898565b610b6b611835565b600b5460ff1615610bb95760405162461bcd60e51b81526020600482015260186024820152770cd110d391950e8818dd5c9c995b9d1b1e481c185d5cd95960421b6044820152606401610898565b600f54421015610c1a5760405162461bcd60e51b815260206004820152602660248201527f3344434e46543a207075626c69632073616c65206973206e6f742073746172746044820152651959081e595d60d21b6064820152608401610898565b6010544210610c6b5760405162461bcd60e51b815260206004820152601c60248201527f3344434e46543a207075626c69632073616c6520697320656e646564000000006044820152606401610898565b6011543360009081526012602052604090205460ff91821691610c90918491166125df565b60ff161115610cf25760405162461bcd60e51b815260206004820152602860248201527f3344434e46543a204561636820416464726573732063616e206f6e6c79207075604482015267726368617365203360c01b6064820152608401610898565b6000610cfc610b0b565b90506115b3610d0e60ff8416836125c7565b1115610d2c5760405162461bcd60e51b81526004016108989061253b565b610d4160ff831667013c310749028000612618565b341015610d905760405162461bcd60e51b815260206004820152601a60248201527f3344434e46543a20707269636520697320696e636f72726563740000000000006044820152606401610898565b610d9e335b8360ff1661188f565b33600090815260126020526040902054610dbc90839060ff166125df565b336000908152601260205260409020805460ff191660ff9290921691909117905550506001600955565b50565b6000610df4826118a9565b9050836001600160a01b0316816001600160a01b031614610e275760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610e7457610e5786336107e5565b610e7457604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610e9b57604051633a954ecd60e21b815260040160405180910390fd5b8015610ea657600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610f315760018401600081815260046020526040902054610f2f576000548114610f2f5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b610f826117a6565b6000610f8c610b0b565b90506115b3610f9e60ff8416836125c7565b1115610fbc5760405162461bcd60e51b81526004016108989061253b565b610983838360ff1661188f565b610fd16117a6565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610de6573d6000803e3d6000fd5b61098383838360405180602001604052806000815250611217565b61102d6117a6565b60115462010000810461ffff1690611051908390640100000000900460ff166125df565b60ff1611156110b15760405162461bcd60e51b815260206004820152602660248201527f3344434e46543a2072656163686564206d617820637573746f6d2064726f7020604482015265737570706c7960d01b6064820152608401610898565b6110be828260ff1661188f565b6011546110d7908290640100000000900460ff166125df565b601160046101000a81548160ff021916908360ff1602179055505050565b6110fd6117a6565b805161111090600a906020840190611dc9565b5050565b600061090d826118a9565b60006001600160a01b038216611148576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6111766117a6565b6111806000611919565b565b61118a6117a6565b600c55565b6111976117a6565b601055565b6060600380546109979061267a565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611222848484610de9565b6001600160a01b0383163b1561125b5761123e8484848461196b565b61125b576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600061126b6117a6565b50600b805460ff191682151517905560015b919050565b6060600a61128f83611a63565b6040516020016112a0929190612444565b6040516020818303038152906040529050919050565b6112be6117a6565b60006112c8610b0b565b90506115b36112d783836125c7565b11156112f55760405162461bcd60e51b81526004016108989061253b565b60005b84518110156113525761134085828151811061131657611316612710565b602002602001015185838151811061133057611330612710565b602002602001015160ff1661188f565b8061134a816126b5565b9150506112f8565b5050505050565b600a80546113669061267a565b80601f01602080910402602001604051908101604052809291908181526020018280546113929061267a565b80156113df5780601f106113b4576101008083540402835291602001916113df565b820191906000526020600020905b8154815290600101906020018083116113c257829003601f168201915b505050505081565b6113ef6117a6565b600f55565b33321461143e5760405162461bcd60e51b81526020600482015260186024820152770cd110d391950e881b9bc818dbdb9d1c9858dd081b5a5b9d60421b6044820152606401610898565b611446611835565b600b5460ff16156114945760405162461bcd60e51b81526020600482015260186024820152770cd110d391950e8818dd5c9c995b9d1b1e481c185d5cd95960421b6044820152606401610898565b600d544210156114f85760405162461bcd60e51b815260206004820152602960248201527f3344434e46543a2057686974654c6973742073616c65206973206e6f74207374604482015268185c9d1959081e595d60ba1b6064820152608401610898565b600e5442106115495760405162461bcd60e51b815260206004820152601f60248201527f3344434e46543a2057686974654c6973742073616c6520697320656e646564006044820152606401610898565b6115538383611b61565b61159f5760405162461bcd60e51b815260206004820181905260248201527f3344434e46543a20596f7520617265206e6f74206f6e2057686974654c6973746044820152606401610898565b6011543360009081526012602052604090205460ff6101009092048216916115c9918491166125df565b60ff1611156116405760405162461bcd60e51b815260206004820152603760248201527f3344434e46543a2045616368204164647265737320647572696e67207072657360448201527f616c652063616e206f6e6c7920707572636861736520320000000000000000006064820152608401610898565b600061164a610b0b565b90506115b361165c60ff8416836125c7565b111561167a5760405162461bcd60e51b81526004016108989061253b565b61168e60ff831666f5232269808000612618565b3410156116dd5760405162461bcd60e51b815260206004820152601a60248201527f3344434e46543a20707269636520697320696e636f72726563740000000000006044820152606401610898565b6116e633610d95565b3360009081526012602052604090205461170490839060ff166125df565b336000908152601260205260409020805460ff191660ff92909216919091179055505060016009555050565b6117386117a6565b6001600160a01b03811661179d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610898565b610de681611919565b6008546001600160a01b031633146111805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610898565b600081600111158015611814575060005482105b801561090d575050600090815260046020526040902054600160e01b161590565b600260095414156118885760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610898565b6002600955565b611110828260405180602001604052806000815250611bdd565b600081806001116119005760005481101561190057600081815260046020526040902054600160e01b81166118fe575b806118f75750600019016000818152600460205260409020546118d9565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119a09033908990889088906004016124eb565b602060405180830381600087803b1580156119ba57600080fd5b505af19250505080156119ea575060408051601f3d908101601f191682019092526119e791810190612357565b60015b611a45573d808015611a18576040519150601f19603f3d011682016040523d82523d6000602084013e611a1d565b606091505b508051611a3d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081611a875750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ab15780611a9b816126b5565b9150611aaa9050600a83612604565b9150611a8b565b60008167ffffffffffffffff811115611acc57611acc612726565b6040519080825280601f01601f191660200182016040528015611af6576020820181803683370190505b5090505b8415611a5b57611b0b600183612637565b9150611b18600a866126d0565b611b239060306125c7565b60f81b818381518110611b3857611b38612710565b60200101906001600160f81b031916908160001a905350611b5a600a86612604565b9450611afa565b6040516bffffffffffffffffffffffff193360601b1660208201526000908190603401604051602081830303815290604052805190602001209050611a5b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c549150849050611c43565b611be78383611c59565b6001600160a01b0383163b15610983576000548281035b611c11600086838060010194508661196b565b611c2e576040516368d2bf6b60e11b815260040160405180910390fd5b818110611bfe57816000541461135257600080fd5b600082611c508584611d50565b14949350505050565b60005481611c7a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611d2957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611cf1565b5081611d4757604051622e076360e81b815260040160405180910390fd5b60005550505050565b600081815b8451811015611d9557611d8182868381518110611d7457611d74612710565b6020026020010151611d9d565b915080611d8d816126b5565b915050611d55565b509392505050565b6000818310611db95760008281526020849052604090206118f7565b5060009182526020526040902090565b828054611dd59061267a565b90600052602060002090601f016020900481019282611df75760008555611e3d565b82601f10611e1057805160ff1916838001178555611e3d565b82800160010185558215611e3d579182015b82811115611e3d578251825591602001919060010190611e22565b50611e49929150611e4d565b5090565b5b80821115611e495760008155600101611e4e565b600067ffffffffffffffff831115611e7c57611e7c612726565b611e8f601f8401601f1916602001612572565b9050828152838383011115611ea357600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461127d57600080fd5b600082601f830112611ee257600080fd5b81356020611ef7611ef2836125a3565b612572565b80838252828201915082860187848660051b8901011115611f1757600080fd5b60005b85811015611f3d57611f2b82611eba565b84529284019290840190600101611f1a565b5090979650505050505050565b8035801515811461127d57600080fd5b803560ff8116811461127d57600080fd5b600060208284031215611f7d57600080fd5b6118f782611eba565b60008060408385031215611f9957600080fd5b611fa283611eba565b9150611fb060208401611eba565b90509250929050565b600080600060608486031215611fce57600080fd5b611fd784611eba565b9250611fe560208501611eba565b9150604084013590509250925092565b6000806000806080858703121561200b57600080fd5b61201485611eba565b935061202260208601611eba565b925060408501359150606085013567ffffffffffffffff81111561204557600080fd5b8501601f8101871361205657600080fd5b61206587823560208401611e62565b91505092959194509250565b6000806040838503121561208457600080fd5b61208d83611eba565b9150611fb060208401611f4a565b600080604083850312156120ae57600080fd5b6120b783611eba565b946020939093013593505050565b600080604083850312156120d857600080fd5b6120e183611eba565b9150611fb060208401611f5a565b6000806040838503121561210257600080fd5b823567ffffffffffffffff8082111561211a57600080fd5b61212686838701611ed1565b935060209150818501358181111561213d57600080fd5b85019050601f8101861361215057600080fd5b803561215e611ef2826125a3565b80828252848201915084840189868560051b870101111561217e57600080fd5b600094505b838510156121a1578035835260019490940193918501918501612183565b5080955050505050509250929050565b6000806000606084860312156121c657600080fd5b833567ffffffffffffffff808211156121de57600080fd5b6121ea87838801611ed1565b945060209150818601358181111561220157600080fd5b86019050601f8101871361221457600080fd5b8035612222611ef2826125a3565b8082825284820191508484018a868560051b870101111561224257600080fd5b600094505b8385101561226c5761225881611f5a565b835260019490940193918501918501612247565b5096999698505050506040949094013593505050565b60008060006040848603121561229757600080fd5b833567ffffffffffffffff808211156122af57600080fd5b818601915086601f8301126122c357600080fd5b8135818111156122d257600080fd5b8760208260051b85010111156122e757600080fd5b6020928301955093506122fd9186019050611f5a565b90509250925092565b60006020828403121561231857600080fd5b6118f782611f4a565b60006020828403121561233357600080fd5b5035919050565b60006020828403121561234c57600080fd5b81356118f78161273c565b60006020828403121561236957600080fd5b81516118f78161273c565b60006020828403121561238657600080fd5b813567ffffffffffffffff81111561239d57600080fd5b8201601f810184136123ae57600080fd5b611a5b84823560208401611e62565b6000602082840312156123cf57600080fd5b813561ffff811681146118f757600080fd5b6000602082840312156123f357600080fd5b6118f782611f5a565b6000815180845261241481602086016020860161264e565b601f01601f19169290920160200192915050565b6000815161243a81856020860161264e565b9290920192915050565b600080845481600182811c91508083168061246057607f831692505b602080841082141561248057634e487b7160e01b86526022600452602486fd5b81801561249457600181146124a5576124d2565b60ff198616895284890196506124d2565b60008b81526020902060005b868110156124ca5781548b8201529085019083016124b1565b505084890196505b5050505050506124e28185612428565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061251e908301846123fc565b9695505050505050565b6020815260006118f760208301846123fc565b6020808252601a908201527f3344434e46543a2072656163686564206d617820737570706c79000000000000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561259b5761259b612726565b604052919050565b600067ffffffffffffffff8211156125bd576125bd612726565b5060051b60200190565b600082198211156125da576125da6126e4565b500190565b600060ff821660ff84168060ff038211156125fc576125fc6126e4565b019392505050565b600082612613576126136126fa565b500490565b6000816000190483118215151615612632576126326126e4565b500290565b600082821015612649576126496126e4565b500390565b60005b83811015612669578181015183820152602001612651565b8381111561125b5750506000910152565b600181811c9082168061268e57607f821691505b602082108114156126af57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126c9576126c96126e4565b5060010190565b6000826126df576126df6126fa565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610de657600080fdfea264697066735822122088b51b7fd40ae555ad2738268171655b64e9ff36976afeb4fd594b93ffab848064736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000063344434e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033344430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f6170692e66616e73692e6d652f4e46542f74647261676f6e2f00000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): 3DCNFT
Arg [1] : _symbol (string): 3DC
Arg [2] : _uri (string): https://api.fansi.me/NFT/tdragon/
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [4] : 3344434e46540000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 3344430000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [8] : 68747470733a2f2f6170692e66616e73692e6d652f4e46542f74647261676f6e
Arg [9] : 2f00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
199:6359:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5852:234;;;;;;;;;;-1:-1:-1;5852:234:0;;;;;:::i;:::-;;:::i;:::-;;9410:639:2;;;;;;;;;;-1:-1:-1;9410:639:2;;;;;:::i;:::-;;:::i;:::-;;;11635:14:8;;11628:22;11610:41;;11598:2;11583:18;9410:639:2;;;;;;;;5520:96:0;;;;;;;;;;-1:-1:-1;5520:96:0;;;;;:::i;:::-;;:::i;4441:230::-;;;;;;;;;;-1:-1:-1;4441:230:0;;;;;:::i;:::-;;:::i;10312:100:2:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5412::0:-;;;;;;;;;;-1:-1:-1;5412:100:0;;;;;:::i;:::-;;:::i;16803:218:2:-;;;;;;;;;;-1:-1:-1;16803:218:2;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10933:32:8;;;10915:51;;10903:2;10888:18;16803:218:2;10769:203:8;16236:408:2;;;;;;:::i;:::-;;:::i;810:30:0:-;;;;;;;;;;-1:-1:-1;810:30:0;;;;;;;;;;;18655:4:8;18643:17;;;18625:36;;18613:2;18598:18;810:30:0;18483:184:8;6063:323:2;;;;;;;;;;;;;:::i;:::-;;;11808:25:8;;;11796:2;11781:18;6063:323:2;11662:177:8;1206:1024:0;;;;;;:::i;:::-;;:::i;752:45::-;;;;;;;;;;;;;;;;20442:2825:2;;;;;;:::i;:::-;;:::i;383:94:0:-;;;;;;;;;;;;;;;;3426:273;;;;;;;;;;-1:-1:-1;3426:273:0;;;;;:::i;:::-;;:::i;6094:106::-;;;;;;;;;;;;;:::i;23363:193:2:-;;;;;;:::i;:::-;;:::i;847:32:0:-;;;;;;;;;;-1:-1:-1;847:32:0;;;;;;;;;;;594:43;;;;;;;;;;;;;;;;4106:321;;;;;;;;;;-1:-1:-1;4106:321:0;;;;;:::i;:::-;;:::i;5035:105::-;;;;;;;;;;-1:-1:-1;5035:105:0;;;;;:::i;:::-;;:::i;644:41::-;;;;;;;;;;;;;;;;11705:152:2;;;;;;;;;;-1:-1:-1;11705:152:2;;;;;:::i;:::-;;:::i;698:47:0:-;;;;;;;;;;;;;;;;7247:233:2;;;;;;;;;;-1:-1:-1;7247:233:2;;;;;:::i;:::-;;:::i;1884:103:5:-;;;;;;;;;;;;;:::i;972:45:0:-;;;;;;;;;;-1:-1:-1;972:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;5148:117;;;;;;;;;;-1:-1:-1;5148:117:0;;;;;:::i;:::-;;:::i;5740:104::-;;;;;;;;;;-1:-1:-1;5740:104:0;;;;;:::i;:::-;;:::i;1236:87:5:-;;;;;;;;;;-1:-1:-1;1309:6:5;;-1:-1:-1;;;;;1309:6:5;1236:87;;10488:104:2;;;;;;;;;;;;;:::i;486:43:0:-;;;;;;;;;;;;518:11;486:43;;17361:234:2;;;;;;;;;;-1:-1:-1;17361:234:2;;;;;:::i;:::-;;:::i;293:28:0:-;;;;;;;;;;-1:-1:-1;293:28:0;;;;;;;;24154:407:2;;;;;;:::i;:::-;;:::i;886:38:0:-;;;;;;;;;;-1:-1:-1;886:38:0;;;;;;;;;;;;;;18282:6:8;18270:19;;;18252:38;;18240:2;18225:18;886:38:0;18108:188:8;5273:131:0;;;;;;;;;;-1:-1:-1;5273:131:0;;;;;:::i;:::-;;:::i;536:45::-;;;;;;;;;;;;570:11;536:45;;6208:236;;;;;;;;;;-1:-1:-1;6208:236:0;;;;;:::i;:::-;;:::i;931:32::-;;;;;;;;;;-1:-1:-1;931:32:0;;;;;;;;;;;3707:391;;;;;;;;;;-1:-1:-1;3707:391:0;;;;;:::i;:::-;;:::i;260:26::-;;;;;;;;;;;;;:::i;330:40::-;;;;;;;;;;;;366:4;330:40;;5624:108;;;;;;;;;;-1:-1:-1;5624:108:0;;;;;:::i;:::-;;:::i;2238:1180::-;;;;;;:::i;:::-;;:::i;17752:164:2:-;;;;;;;;;;-1:-1:-1;17752:164:2;;;;;:::i;:::-;-1:-1:-1;;;;;17873:25:2;;;17849:4;17873:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;17752:164;2142:201:5;;;;;;;;;;-1:-1:-1;2142:201:5;;;;;:::i;:::-;;:::i;5852:234:0:-;1122:13:5;:11;:13::i;:::-;5963:15:0::1;::::0;;;::::1;;;5952:26;::::0;::::1;;;5930:108;;;::::0;-1:-1:-1;;;5930:108:0;;16002:2:8;5930:108:0::1;::::0;::::1;15984:21:8::0;;;16021:18;;;16014:30;16080:34;16060:18;;;16053:62;16132:18;;5930:108:0::1;;;;;;;;;6049:19;:29:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;6049:29:0;;::::1;::::0;;;::::1;::::0;;5852:234::o;9410:639:2:-;9495:4;-1:-1:-1;;;;;;;;;9819:25:2;;;;:102;;-1:-1:-1;;;;;;;;;;9896:25:2;;;9819:102;:179;;;-1:-1:-1;;;;;;;;;;9973:25:2;;;9819:179;9799:199;9410:639;-1:-1:-1;;9410:639:2:o;5520:96:0:-;1122:13:5;:11;:13::i;:::-;5587::0::1;:21:::0;5520:96::o;4441:230::-;1122:13:5;:11;:13::i;:::-;4552:9:0::1;4547:117;4571:6;:13;4567:1;:17;4547:117;;;4606:46;736:10:1::0;4633:6:0::1;4640:1;4633:9;;;;;;;;:::i;:::-;;;;;;;4644:4;4649:1;4644:7;;;;;;;;:::i;:::-;;;;;;;4606:12;:46::i;:::-;4586:3:::0;::::1;::::0;::::1;:::i;:::-;;;;4547:117;;;;4441:230:::0;;:::o;10312:100:2:-;10366:13;10399:5;10392:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10312:100;:::o;5412::0:-;1122:13:5;:11;:13::i;:::-;5481:15:0::1;:23:::0;5412:100::o;16803:218:2:-;16879:7;16904:16;16912:7;16904;:16::i;:::-;16899:64;;16929:34;;-1:-1:-1;;;16929:34:2;;;;;;;;;;;16899:64;-1:-1:-1;16983:24:2;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;16983:30:2;;16803:218::o;16236:408::-;16325:13;16341:16;16349:7;16341;:16::i;:::-;16325:32;-1:-1:-1;736:10:1;-1:-1:-1;;;;;16374:28:2;;;16370:175;;16422:44;16439:5;736:10:1;17752:164:2;:::i;16422:44::-;16417:128;;16494:35;;-1:-1:-1;;;16494:35:2;;;;;;;;;;;16417:128;16557:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;16557:35:2;-1:-1:-1;;;;;16557:35:2;;;;;;;;;16608:28;;16557:24;;16608:28;;;;;;;16314:330;16236:408;;:::o;6063:323::-;6544:1:0;6337:12:2;6124:7;6321:13;:28;-1:-1:-1;;6321:46:2;;6063:323::o;1206:1024:0:-;736:10:1;4734:9:0;4718:25;4710:62;;;;-1:-1:-1;;;4710:62:0;;12984:2:8;4710:62:0;;;12966:21:8;13023:2;13003:18;;;12996:30;-1:-1:-1;;;13042:18:8;;;13035:54;13106:18;;4710:62:0;12782:348:8;4710:62:0;2296:21:6::1;:19;:21::i;:::-;1346:8:0::2;::::0;::::2;;1345:9;1337:46;;;::::0;-1:-1:-1;;;1337:46:0;;12631:2:8;1337:46:0::2;::::0;::::2;12613:21:8::0;12670:2;12650:18;;;12643:30;-1:-1:-1;;;12689:18:8;;;12682:54;12753:18;;1337:46:0::2;12429:348:8::0;1337:46:0::2;1435:19;;1416:15;:38;;1394:126;;;::::0;-1:-1:-1;;;1394:126:0;;14880:2:8;1394:126:0::2;::::0;::::2;14862:21:8::0;14919:2;14899:18;;;14892:30;14958:34;14938:18;;;14931:62;-1:-1:-1;;;15009:18:8;;;15002:36;15055:19;;1394:126:0::2;14678:402:8::0;1394:126:0::2;1571:17;;1553:15;:35;1531:113;;;::::0;-1:-1:-1;;;1531:113:0;;14168:2:8;1531:113:0::2;::::0;::::2;14150:21:8::0;14207:2;14187:18;;;14180:30;14246;14226:18;;;14219:58;14294:18;;1531:113:0::2;13966:352:8::0;1531:113:0::2;1724:13;::::0;736:10:1;1724:13:0::2;1678:26:::0;;;:12:::2;:26;::::0;;;;;1724:13:::2;::::0;;::::2;::::0;1678:41:::2;::::0;1707:12;;1678:26:::2;:41;:::i;:::-;1677:60;;;;1655:150;;;::::0;-1:-1:-1;;;1655:150:0;;16363:2:8;1655:150:0::2;::::0;::::2;16345:21:8::0;16402:2;16382:18;;;16375:30;16441:34;16421:18;;;16414:62;-1:-1:-1;;;16492:18:8;;;16485:38;16540:19;;1655:150:0::2;16161:404:8::0;1655:150:0::2;1816:14;1833:13;:11;:13::i;:::-;1816:30:::0;-1:-1:-1;366:4:0::2;1880:21;;::::0;::::2;1816:30:::0;1880:21:::2;:::i;:::-;1879:36;;1857:112;;;;-1:-1:-1::0;;;1857:112:0::2;;;;;;;:::i;:::-;2016:20;;::::0;::::2;518:11;2016:20;:::i;:::-;2002:9;:35;;1980:111;;;::::0;-1:-1:-1;;;1980:111:0;;14525:2:8;1980:111:0::2;::::0;::::2;14507:21:8::0;14564:2;14544:18;;;14537:30;14603:28;14583:18;;;14576:56;14649:18;;1980:111:0::2;14323:350:8::0;1980:111:0::2;2104:37;736:10:1::0;2114:12:0::2;2128;2104:37;;:9;:37::i;:::-;736:10:1::0;2181:26:0::2;::::0;;;:12:::2;:26;::::0;;;;;:41:::2;::::0;2210:12;;2181:26:::2;;:41;:::i;:::-;736:10:1::0;2152:26:0::2;::::0;;;:12:::2;:26;::::0;;;;:70;;-1:-1:-1;;2152:70:0::2;;::::0;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;2860:7:6;:22;1206:1024:0:o;2340:20:6:-:1;1206:1024:0::0;:::o;20442:2825:2:-;20584:27;20614;20633:7;20614:18;:27::i;:::-;20584:57;;20699:4;-1:-1:-1;;;;;20658:45:2;20674:19;-1:-1:-1;;;;;20658:45:2;;20654:86;;20712:28;;-1:-1:-1;;;20712:28:2;;;;;;;;;;;20654:86;20754:27;19550:24;;;:15;:24;;;;;19778:26;;736:10:1;19175:30:2;;;-1:-1:-1;;;;;18868:28:2;;19153:20;;;19150:56;20940:180;;21033:43;21050:4;736:10:1;17752:164:2;:::i;21033:43::-;21028:92;;21085:35;;-1:-1:-1;;;21085:35:2;;;;;;;;;;;21028:92;-1:-1:-1;;;;;21137:16:2;;21133:52;;21162:23;;-1:-1:-1;;;21162:23:2;;;;;;;;;;;21133:52;21334:15;21331:160;;;21474:1;21453:19;21446:30;21331:160;-1:-1:-1;;;;;21871:24:2;;;;;;;:18;:24;;;;;;21869:26;;-1:-1:-1;;21869:26:2;;;21940:22;;;;;;;;;21938:24;;-1:-1:-1;21938:24:2;;;15094:11;15069:23;15065:41;15052:63;-1:-1:-1;;;15052:63:2;22233:26;;;;:17;:26;;;;;:175;-1:-1:-1;;;22528:47:2;;22524:627;;22633:1;22623:11;;22601:19;22756:30;;;:17;:30;;;;;;22752:384;;22894:13;;22879:11;:28;22875:242;;23041:30;;;;:17;:30;;;;;:52;;;22875:242;22582:569;22524:627;23198:7;23194:2;-1:-1:-1;;;;;23179:27:2;23188:4;-1:-1:-1;;;;;23179:27:2;;;;;;;;;;;20573:2694;;;20442:2825;;;:::o;3426:273:0:-;1122:13:5;:11;:13::i;:::-;3505:14:0::1;3522:13;:11;:13::i;:::-;3505:30:::0;-1:-1:-1;366:4:0::1;3569:16;;::::0;::::1;3505:30:::0;3569:16:::1;:::i;:::-;3568:31;;3546:107;;;;-1:-1:-1::0;;;3546:107:0::1;;;;;;;:::i;:::-;3666:25;3676:5;3683:7;3666:25;;:9;:25::i;6094:106::-:0;1122:13:5;:11;:13::i;:::-;1309:6;;6144:48:0::1;::::0;-1:-1:-1;;;;;1309:6:5;;;;6170:21:0::1;6144:48:::0;::::1;;;::::0;::::1;::::0;;;6170:21;1309:6:5;6144:48:0;::::1;;;;;;;;;;;;;::::0;::::1;;;;23363:193:2::0;23509:39;23526:4;23532:2;23536:7;23509:39;;;;;;;;;;;;:16;:39::i;4106:321:0:-;1122:13:5;:11;:13::i;:::-;4242:19:0::1;::::0;;;::::1;;;::::0;4213:25:::1;::::0;4231:7;;4213:15;;::::1;;;:25;:::i;:::-;:48;;;;4191:136;;;::::0;-1:-1:-1;;;4191:136:0;;17133:2:8;4191:136:0::1;::::0;::::1;17115:21:8::0;17172:2;17152:18;;;17145:30;17211:34;17191:18;;;17184:62;-1:-1:-1;;;17262:18:8;;;17255:36;17308:19;;4191:136:0::1;16931:402:8::0;4191:136:0::1;4340:25;4350:5;4357:7;4340:25;;:9;:25::i;:::-;4394:15;::::0;:25:::1;::::0;4412:7;;4394:15;;::::1;;;:25;:::i;:::-;4376:15;;:43;;;;;;;;;;;;;;;;;;4106:321:::0;;:::o;5035:105::-;1122:13:5;:11;:13::i;:::-;5109:23:0;;::::1;::::0;:12:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;:::-;;5035:105:::0;:::o;11705:152:2:-;11777:7;11820:27;11839:7;11820:18;:27::i;7247:233::-;7319:7;-1:-1:-1;;;;;7343:19:2;;7339:60;;7371:28;;-1:-1:-1;;;7371:28:2;;;;;;;;;;;7339:60;-1:-1:-1;;;;;;7417:25:2;;;;;:18;:25;;;;;;1406:13;7417:55;;7247:233::o;1884:103:5:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;5148:117:0:-;1122:13:5;:11;:13::i;:::-;5230:10:0::1;:27:::0;5148:117::o;5740:104::-;1122:13:5;:11;:13::i;:::-;5811:17:0::1;:25:::0;5740:104::o;10488::2:-;10544:13;10577:7;10570:14;;;;;:::i;17361:234::-;736:10:1;17456:39:2;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;17456:49:2;;;;;;;;;;;;:60;;-1:-1:-1;;17456:60:2;;;;;;;;;;17532:55;;11610:41:8;;;17456:49:2;;736:10:1;17532:55:2;;11583:18:8;17532:55:2;;;;;;;17361:234;;:::o;24154:407::-;24329:31;24342:4;24348:2;24352:7;24329:12;:31::i;:::-;-1:-1:-1;;;;;24375:14:2;;;:19;24371:183;;24414:56;24445:4;24451:2;24455:7;24464:5;24414:30;:56::i;:::-;24409:145;;24498:40;;-1:-1:-1;;;24498:40:2;;;;;;;;;;;24409:145;24154:407;;;;:::o;5273:131:0:-;5335:4;1122:13:5;:11;:13::i;:::-;-1:-1:-1;5352:8:0::1;:20:::0;;-1:-1:-1;;5352:20:0::1;::::0;::::1;;;::::0;;-1:-1:-1;1146:1:5::1;5273:131:0::0;;;:::o;6208:236::-;6319:13;6394:12;6408:26;6425:8;6408:16;:26::i;:::-;6377:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6350:86;;6208:236;;;:::o;3707:391::-;1122:13:5;:11;:13::i;:::-;3826:14:0::1;3843:13;:11;:13::i;:::-;3826:30:::0;-1:-1:-1;366:4:0::1;3892:15;3901:6:::0;3826:30;3892:15:::1;:::i;:::-;3891:30;;3869:106;;;;-1:-1:-1::0;;;3869:106:0::1;;;;;;;:::i;:::-;3993:9;3988:103;4012:6;:13;4008:1;:17;3988:103;;;4047:32;4057:6;4064:1;4057:9;;;;;;;;:::i;:::-;;;;;;;4068:7;4076:1;4068:10;;;;;;;;:::i;:::-;;;;;;;4047:32;;:9;:32::i;:::-;4027:3:::0;::::1;::::0;::::1;:::i;:::-;;;;3988:103;;;;3815:283;3707:391:::0;;;:::o;260:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5624:108::-;1122:13:5;:11;:13::i;:::-;5697:19:0::1;:27:::0;5624:108::o;2238:1180::-;736:10:1;4734:9:0;4718:25;4710:62;;;;-1:-1:-1;;;4710:62:0;;12984:2:8;4710:62:0;;;12966:21:8;13023:2;13003:18;;;12996:30;-1:-1:-1;;;13042:18:8;;;13035:54;13106:18;;4710:62:0;12782:348:8;4710:62:0;2296:21:6::1;:19;:21::i;:::-;2414:8:0::2;::::0;::::2;;2413:9;2405:46;;;::::0;-1:-1:-1;;;2405:46:0;;12631:2:8;2405:46:0::2;::::0;::::2;12613:21:8::0;12670:2;12650:18;;;12643:30;-1:-1:-1;;;12689:18:8;;;12682:54;12753:18;;2405:46:0::2;12429:348:8::0;2405:46:0::2;2503:15;;2484;:34;;2462:125;;;::::0;-1:-1:-1;;;2462:125:0;;17540:2:8;2462:125:0::2;::::0;::::2;17522:21:8::0;17579:2;17559:18;;;17552:30;17618:34;17598:18;;;17591:62;-1:-1:-1;;;17669:18:8;;;17662:39;17718:19;;2462:125:0::2;17338:405:8::0;2462:125:0::2;2638:13;;2620:15;:31;2598:112;;;::::0;-1:-1:-1;;;2598:112:0;;15642:2:8;2598:112:0::2;::::0;::::2;15624:21:8::0;15681:2;15661:18;;;15654:30;15720:33;15700:18;;;15693:61;15771:18;;2598:112:0::2;15440:355:8::0;2598:112:0::2;2729:27;2743:12;;2729:13;:27::i;:::-;2721:92;;;::::0;-1:-1:-1;;;2721:92:0;;12270:2:8;2721:92:0::2;::::0;::::2;12252:21:8::0;;;12289:18;;;12282:30;12348:34;12328:18;;;12321:62;12400:18;;2721:92:0::2;12068:356:8::0;2721:92:0::2;2893:15;::::0;736:10:1;2847:26:0::2;::::0;;;:12:::2;:26;::::0;;;;;2893:15:::2;;::::0;;::::2;::::0;::::2;::::0;2847:41:::2;::::0;2876:12;;2847:26:::2;:41;:::i;:::-;2846:62;;;;2824:167;;;::::0;-1:-1:-1;;;2824:167:0;;13744:2:8;2824:167:0::2;::::0;::::2;13726:21:8::0;13783:2;13763:18;;;13756:30;13822:34;13802:18;;;13795:62;13893:25;13873:18;;;13866:53;13936:19;;2824:167:0::2;13542:419:8::0;2824:167:0::2;3002:14;3019:13;:11;:13::i;:::-;3002:30:::0;-1:-1:-1;366:4:0::2;3066:21;;::::0;::::2;3002:30:::0;3066:21:::2;:::i;:::-;3065:36;;3043:112;;;;-1:-1:-1::0;;;3043:112:0::2;;;;;;;:::i;:::-;3202:22;;::::0;::::2;570:11;3202:22;:::i;:::-;3188:9;:37;;3166:113;;;::::0;-1:-1:-1;;;3166:113:0;;14525:2:8;3166:113:0::2;::::0;::::2;14507:21:8::0;14564:2;14544:18;;;14537:30;14603:28;14583:18;;;14576:56;14649:18;;3166:113:0::2;14323:350:8::0;3166:113:0::2;3292:37;736:10:1::0;3302:12:0::2;656:98:1::0;3292:37:0::2;736:10:1::0;3369:26:0::2;::::0;;;:12:::2;:26;::::0;;;;;:41:::2;::::0;3398:12;;3369:26:::2;;:41;:::i;:::-;736:10:1::0;3340:26:0::2;::::0;;;:12:::2;:26;::::0;;;;:70;;-1:-1:-1;;3340:70:0::2;;::::0;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;2860:7:6;:22;-1:-1:-1;;4441:230:0:o;2142:201:5:-;1122:13;:11;:13::i;:::-;-1:-1:-1;;;;;2231:22:5;::::1;2223:73;;;::::0;-1:-1:-1;;;2223:73:5;;13337:2:8;2223:73:5::1;::::0;::::1;13319:21:8::0;13376:2;13356:18;;;13349:30;13415:34;13395:18;;;13388:62;-1:-1:-1;;;13466:18:8;;;13459:36;13512:19;;2223:73:5::1;13135:402:8::0;2223:73:5::1;2307:28;2326:8;2307:18;:28::i;1401:132::-:0;1309:6;;-1:-1:-1;;;;;1309:6:5;736:10:1;1465:23:5;1457:68;;;;-1:-1:-1;;;1457:68:5;;16772:2:8;1457:68:5;;;16754:21:8;;;16791:18;;;16784:30;16850:34;16830:18;;;16823:62;16902:18;;1457:68:5;16570:356:8;18174:282:2;18239:4;18295:7;6544:1:0;18276:26:2;;:66;;;;;18329:13;;18319:7;:23;18276:66;:153;;;;-1:-1:-1;;18380:26:2;;;;:17;:26;;;;;;-1:-1:-1;;;18380:44:2;:49;;18174:282::o;2376:293:6:-;1778:1;2510:7;;:19;;2502:63;;;;-1:-1:-1;;;2502:63:6;;17950:2:8;2502:63:6;;;17932:21:8;17989:2;17969:18;;;17962:30;18028:33;18008:18;;;18001:61;18079:18;;2502:63:6;17748:355:8;2502:63:6;1778:1;2643:7;:18;2376:293::o;34314:112:2:-;34391:27;34401:2;34405:8;34391:27;;;;;;;;;;;;:9;:27::i;12860:1275::-;12927:7;12962;;6544:1:0;13011:23:2;13007:1061;;13064:13;;13057:4;:20;13053:1015;;;13102:14;13119:23;;;:17;:23;;;;;;-1:-1:-1;;;13208:24:2;;13204:845;;13873:113;13880:11;13873:113;;-1:-1:-1;;;13951:6:2;13933:25;;;;:17;:25;;;;;;13873:113;;;14019:6;12860:1275;-1:-1:-1;;;12860:1275:2:o;13204:845::-;13079:989;13053:1015;14096:31;;-1:-1:-1;;;14096:31:2;;;;;;;;;;;2503:191:5;2596:6;;;-1:-1:-1;;;;;2613:17:5;;;-1:-1:-1;;;;;;2613:17:5;;;;;;;2646:40;;2596:6;;;2613:17;2596:6;;2646:40;;2577:16;;2646:40;2566:128;2503:191;:::o;26645:716:2:-;26829:88;;-1:-1:-1;;;26829:88:2;;26808:4;;-1:-1:-1;;;;;26829:45:2;;;;;:88;;736:10:1;;26896:4:2;;26902:7;;26911:5;;26829:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26829:88:2;;;;;;;;-1:-1:-1;;26829:88:2;;;;;;;;;;;;:::i;:::-;;;26825:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27112:13:2;;27108:235;;27158:40;;-1:-1:-1;;;27158:40:2;;;;;;;;;;;27108:235;27301:6;27295:13;27286:6;27282:2;27278:15;27271:38;26825:529;-1:-1:-1;;;;;;26988:64:2;-1:-1:-1;;;26988:64:2;;-1:-1:-1;26825:529:2;26645:716;;;;;;:::o;342:723:7:-;398:13;619:10;615:53;;-1:-1:-1;;646:10:7;;;;;;;;;;;;-1:-1:-1;;;646:10:7;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:7;;-1:-1:-1;798:2:7;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:7;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:7;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;932:56:7;;;;;;;;-1:-1:-1;1003:11:7;1012:2;1003:11;;:::i;:::-;;;872:154;;4800:227:0;4920:30;;-1:-1:-1;;736:10:1;9505:2:8;9501:15;9497:53;4920:30:0;;;9485:66:8;4878:4:0;;;;9567:12:8;;4920:30:0;;;;;;;;;;;;4910:41;;;;;;4895:56;;4969:50;4988:12;;4969:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5002:10:0;;;-1:-1:-1;5014:4:0;;-1:-1:-1;4969:18:0;:50::i;33541:689:2:-;33672:19;33678:2;33682:8;33672:5;:19::i;:::-;-1:-1:-1;;;;;33733:14:2;;;:19;33729:483;;33773:11;33787:13;33835:14;;;33868:233;33899:62;33938:1;33942:2;33946:7;;;;;;33955:5;33899:30;:62::i;:::-;33894:167;;33997:40;;-1:-1:-1;;;33997:40:2;;;;;;;;;;;33894:167;34096:3;34088:5;:11;33868:233;;34183:3;34166:13;;:20;34162:34;;34188:8;;;1179:190:4;1304:4;1357;1328:25;1341:5;1348:4;1328:12;:25::i;:::-;:33;;1179:190;-1:-1:-1;;;;1179:190:4:o;27823:2966:2:-;27896:20;27919:13;27947;27943:44;;27969:18;;-1:-1:-1;;;27969:18:2;;;;;;;;;;;27943:44;-1:-1:-1;;;;;28475:22:2;;;;;;:18;:22;;;;1544:2;28475:22;;;:71;;28513:32;28501:45;;28475:71;;;28789:31;;;:17;:31;;;;;-1:-1:-1;15525:15:2;;15499:24;15495:46;15094:11;15069:23;15065:41;15062:52;15052:63;;28789:173;;29024:23;;;;28789:31;;28475:22;;29789:25;28475:22;;29642:335;30303:1;30289:12;30285:20;30243:346;30344:3;30335:7;30332:16;30243:346;;30562:7;30552:8;30549:1;30522:25;30519:1;30516;30511:59;30397:1;30384:15;30243:346;;;-1:-1:-1;30622:13:2;30618:45;;30644:19;;-1:-1:-1;;;30644:19:2;;;;;;;;;;;30618:45;30680:13;:19;-1:-1:-1;4547:117:0::1;4441:230:::0;;:::o;2046:296:4:-;2129:7;2172:4;2129:7;2187:118;2211:5;:12;2207:1;:16;2187:118;;;2260:33;2270:12;2284:5;2290:1;2284:8;;;;;;;;:::i;:::-;;;;;;;2260:9;:33::i;:::-;2245:48;-1:-1:-1;2225:3:4;;;;:::i;:::-;;;;2187:118;;;-1:-1:-1;2322:12:4;2046:296;-1:-1:-1;;;2046:296:4:o;9086:149::-;9149:7;9180:1;9176;:5;:51;;9311:13;9405:15;;;9441:4;9434:15;;;9488:4;9472:21;;9176:51;;;-1:-1:-1;9311:13:4;9405:15;;;9441:4;9434:15;9488:4;9472:21;;;9086:149::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:8;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:8;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:8;;532:42;;522:70;;588:1;585;578:12;603:679;657:5;710:3;703:4;695:6;691:17;687:27;677:55;;728:1;725;718:12;677:55;764:6;751:20;790:4;814:60;830:43;870:2;830:43;:::i;:::-;814:60;:::i;:::-;896:3;920:2;915:3;908:15;948:2;943:3;939:12;932:19;;983:2;975:6;971:15;1035:3;1030:2;1024;1021:1;1017:10;1009:6;1005:23;1001:32;998:41;995:61;;;1052:1;1049;1042:12;995:61;1074:1;1084:169;1098:2;1095:1;1092:9;1084:169;;;1155:23;1174:3;1155:23;:::i;:::-;1143:36;;1199:12;;;;1231;;;;1116:1;1109:9;1084:169;;;-1:-1:-1;1271:5:8;;603:679;-1:-1:-1;;;;;;;603:679:8:o;1287:160::-;1352:20;;1408:13;;1401:21;1391:32;;1381:60;;1437:1;1434;1427:12;1452:156;1518:20;;1578:4;1567:16;;1557:27;;1547:55;;1598:1;1595;1588:12;1613:186;1672:6;1725:2;1713:9;1704:7;1700:23;1696:32;1693:52;;;1741:1;1738;1731:12;1693:52;1764:29;1783:9;1764:29;:::i;1804:260::-;1872:6;1880;1933:2;1921:9;1912:7;1908:23;1904:32;1901:52;;;1949:1;1946;1939:12;1901:52;1972:29;1991:9;1972:29;:::i;:::-;1962:39;;2020:38;2054:2;2043:9;2039:18;2020:38;:::i;:::-;2010:48;;1804:260;;;;;:::o;2069:328::-;2146:6;2154;2162;2215:2;2203:9;2194:7;2190:23;2186:32;2183:52;;;2231:1;2228;2221:12;2183:52;2254:29;2273:9;2254:29;:::i;:::-;2244:39;;2302:38;2336:2;2325:9;2321:18;2302:38;:::i;:::-;2292:48;;2387:2;2376:9;2372:18;2359:32;2349:42;;2069:328;;;;;:::o;2402:666::-;2497:6;2505;2513;2521;2574:3;2562:9;2553:7;2549:23;2545:33;2542:53;;;2591:1;2588;2581:12;2542:53;2614:29;2633:9;2614:29;:::i;:::-;2604:39;;2662:38;2696:2;2685:9;2681:18;2662:38;:::i;:::-;2652:48;;2747:2;2736:9;2732:18;2719:32;2709:42;;2802:2;2791:9;2787:18;2774:32;2829:18;2821:6;2818:30;2815:50;;;2861:1;2858;2851:12;2815:50;2884:22;;2937:4;2929:13;;2925:27;-1:-1:-1;2915:55:8;;2966:1;2963;2956:12;2915:55;2989:73;3054:7;3049:2;3036:16;3031:2;3027;3023:11;2989:73;:::i;:::-;2979:83;;;2402:666;;;;;;;:::o;3073:254::-;3138:6;3146;3199:2;3187:9;3178:7;3174:23;3170:32;3167:52;;;3215:1;3212;3205:12;3167:52;3238:29;3257:9;3238:29;:::i;:::-;3228:39;;3286:35;3317:2;3306:9;3302:18;3286:35;:::i;3332:254::-;3400:6;3408;3461:2;3449:9;3440:7;3436:23;3432:32;3429:52;;;3477:1;3474;3467:12;3429:52;3500:29;3519:9;3500:29;:::i;:::-;3490:39;3576:2;3561:18;;;;3548:32;;-1:-1:-1;;;3332:254:8:o;3591:256::-;3657:6;3665;3718:2;3706:9;3697:7;3693:23;3689:32;3686:52;;;3734:1;3731;3724:12;3686:52;3757:29;3776:9;3757:29;:::i;:::-;3747:39;;3805:36;3837:2;3826:9;3822:18;3805:36;:::i;3852:1149::-;3970:6;3978;4031:2;4019:9;4010:7;4006:23;4002:32;3999:52;;;4047:1;4044;4037:12;3999:52;4087:9;4074:23;4116:18;4157:2;4149:6;4146:14;4143:34;;;4173:1;4170;4163:12;4143:34;4196:61;4249:7;4240:6;4229:9;4225:22;4196:61;:::i;:::-;4186:71;;4276:2;4266:12;;4331:2;4320:9;4316:18;4303:32;4360:2;4350:8;4347:16;4344:36;;;4376:1;4373;4366:12;4344:36;4399:24;;;-1:-1:-1;4454:4:8;4446:13;;4442:27;-1:-1:-1;4432:55:8;;4483:1;4480;4473:12;4432:55;4519:2;4506:16;4542:60;4558:43;4598:2;4558:43;:::i;4542:60::-;4624:3;4648:2;4643:3;4636:15;4676:2;4671:3;4667:12;4660:19;;4707:2;4703;4699:11;4755:7;4750:2;4744;4741:1;4737:10;4733:2;4729:19;4725:28;4722:41;4719:61;;;4776:1;4773;4766:12;4719:61;4798:1;4789:10;;4808:163;4822:2;4819:1;4816:9;4808:163;;;4879:17;;4867:30;;4840:1;4833:9;;;;;4917:12;;;;4949;;4808:163;;;4812:3;4990:5;4980:15;;;;;;;3852:1149;;;;;:::o;5006:1219::-;5131:6;5139;5147;5200:2;5188:9;5179:7;5175:23;5171:32;5168:52;;;5216:1;5213;5206:12;5168:52;5256:9;5243:23;5285:18;5326:2;5318:6;5315:14;5312:34;;;5342:1;5339;5332:12;5312:34;5365:61;5418:7;5409:6;5398:9;5394:22;5365:61;:::i;:::-;5355:71;;5445:2;5435:12;;5500:2;5489:9;5485:18;5472:32;5529:2;5519:8;5516:16;5513:36;;;5545:1;5542;5535:12;5513:36;5568:24;;;-1:-1:-1;5623:4:8;5615:13;;5611:27;-1:-1:-1;5601:55:8;;5652:1;5649;5642:12;5601:55;5688:2;5675:16;5711:60;5727:43;5767:2;5727:43;:::i;5711:60::-;5793:3;5817:2;5812:3;5805:15;5845:2;5840:3;5836:12;5829:19;;5876:2;5872;5868:11;5924:7;5919:2;5913;5910:1;5906:10;5902:2;5898:19;5894:28;5891:41;5888:61;;;5945:1;5942;5935:12;5888:61;5967:1;5958:10;;5977:167;5991:2;5988:1;5985:9;5977:167;;;6048:21;6065:3;6048:21;:::i;:::-;6036:34;;6009:1;6002:9;;;;;6090:12;;;;6122;;5977:167;;;-1:-1:-1;5006:1219:8;;6163:5;;-1:-1:-1;;;;6215:2:8;6200:18;;;;6187:32;;-1:-1:-1;;;5006:1219:8:o;6230:691::-;6323:6;6331;6339;6392:2;6380:9;6371:7;6367:23;6363:32;6360:52;;;6408:1;6405;6398:12;6360:52;6448:9;6435:23;6477:18;6518:2;6510:6;6507:14;6504:34;;;6534:1;6531;6524:12;6504:34;6572:6;6561:9;6557:22;6547:32;;6617:7;6610:4;6606:2;6602:13;6598:27;6588:55;;6639:1;6636;6629:12;6588:55;6679:2;6666:16;6705:2;6697:6;6694:14;6691:34;;;6721:1;6718;6711:12;6691:34;6776:7;6769:4;6759:6;6756:1;6752:14;6748:2;6744:23;6740:34;6737:47;6734:67;;;6797:1;6794;6787:12;6734:67;6828:4;6820:13;;;;-1:-1:-1;6852:6:8;-1:-1:-1;6877:38:8;;6894:20;;;-1:-1:-1;6877:38:8;:::i;:::-;6867:48;;6230:691;;;;;:::o;6926:180::-;6982:6;7035:2;7023:9;7014:7;7010:23;7006:32;7003:52;;;7051:1;7048;7041:12;7003:52;7074:26;7090:9;7074:26;:::i;7111:180::-;7170:6;7223:2;7211:9;7202:7;7198:23;7194:32;7191:52;;;7239:1;7236;7229:12;7191:52;-1:-1:-1;7262:23:8;;7111:180;-1:-1:-1;7111:180:8:o;7296:245::-;7354:6;7407:2;7395:9;7386:7;7382:23;7378:32;7375:52;;;7423:1;7420;7413:12;7375:52;7462:9;7449:23;7481:30;7505:5;7481:30;:::i;7546:249::-;7615:6;7668:2;7656:9;7647:7;7643:23;7639:32;7636:52;;;7684:1;7681;7674:12;7636:52;7716:9;7710:16;7735:30;7759:5;7735:30;:::i;7800:450::-;7869:6;7922:2;7910:9;7901:7;7897:23;7893:32;7890:52;;;7938:1;7935;7928:12;7890:52;7978:9;7965:23;8011:18;8003:6;8000:30;7997:50;;;8043:1;8040;8033:12;7997:50;8066:22;;8119:4;8111:13;;8107:27;-1:-1:-1;8097:55:8;;8148:1;8145;8138:12;8097:55;8171:73;8236:7;8231:2;8218:16;8213:2;8209;8205:11;8171:73;:::i;8255:272::-;8313:6;8366:2;8354:9;8345:7;8341:23;8337:32;8334:52;;;8382:1;8379;8372:12;8334:52;8421:9;8408:23;8471:6;8464:5;8460:18;8453:5;8450:29;8440:57;;8493:1;8490;8483:12;8717:182;8774:6;8827:2;8815:9;8806:7;8802:23;8798:32;8795:52;;;8843:1;8840;8833:12;8795:52;8866:27;8883:9;8866:27;:::i;8904:257::-;8945:3;8983:5;8977:12;9010:6;9005:3;8998:19;9026:63;9082:6;9075:4;9070:3;9066:14;9059:4;9052:5;9048:16;9026:63;:::i;:::-;9143:2;9122:15;-1:-1:-1;;9118:29:8;9109:39;;;;9150:4;9105:50;;8904:257;-1:-1:-1;;8904:257:8:o;9166:185::-;9208:3;9246:5;9240:12;9261:52;9306:6;9301:3;9294:4;9287:5;9283:16;9261:52;:::i;:::-;9329:16;;;;;9166:185;-1:-1:-1;;9166:185:8:o;9590:1174::-;9766:3;9795:1;9828:6;9822:13;9858:3;9880:1;9908:9;9904:2;9900:18;9890:28;;9968:2;9957:9;9953:18;9990;9980:61;;10034:4;10026:6;10022:17;10012:27;;9980:61;10060:2;10108;10100:6;10097:14;10077:18;10074:38;10071:165;;;-1:-1:-1;;;10135:33:8;;10191:4;10188:1;10181:15;10221:4;10142:3;10209:17;10071:165;10252:18;10279:104;;;;10397:1;10392:320;;;;10245:467;;10279:104;-1:-1:-1;;10312:24:8;;10300:37;;10357:16;;;;-1:-1:-1;10279:104:8;;10392:320;19213:1;19206:14;;;19250:4;19237:18;;10487:1;10501:165;10515:6;10512:1;10509:13;10501:165;;;10593:14;;10580:11;;;10573:35;10636:16;;;;10530:10;;10501:165;;;10505:3;;10695:6;10690:3;10686:16;10679:23;;10245:467;;;;;;;10728:30;10754:3;10746:6;10728:30;:::i;:::-;10721:37;9590:1174;-1:-1:-1;;;;;9590:1174:8:o;10977:488::-;-1:-1:-1;;;;;11246:15:8;;;11228:34;;11298:15;;11293:2;11278:18;;11271:43;11345:2;11330:18;;11323:34;;;11393:3;11388:2;11373:18;;11366:31;;;11171:4;;11414:45;;11439:19;;11431:6;11414:45;:::i;:::-;11406:53;10977:488;-1:-1:-1;;;;;;10977:488:8:o;11844:219::-;11993:2;11982:9;11975:21;11956:4;12013:44;12053:2;12042:9;12038:18;12030:6;12013:44;:::i;15085:350::-;15287:2;15269:21;;;15326:2;15306:18;;;15299:30;15365:28;15360:2;15345:18;;15338:56;15426:2;15411:18;;15085:350::o;18672:275::-;18743:2;18737:9;18808:2;18789:13;;-1:-1:-1;;18785:27:8;18773:40;;18843:18;18828:34;;18864:22;;;18825:62;18822:88;;;18890:18;;:::i;:::-;18926:2;18919:22;18672:275;;-1:-1:-1;18672:275:8:o;18952:183::-;19012:4;19045:18;19037:6;19034:30;19031:56;;;19067:18;;:::i;:::-;-1:-1:-1;19112:1:8;19108:14;19124:4;19104:25;;18952:183::o;19266:128::-;19306:3;19337:1;19333:6;19330:1;19327:13;19324:39;;;19343:18;;:::i;:::-;-1:-1:-1;19379:9:8;;19266:128::o;19399:204::-;19437:3;19473:4;19470:1;19466:12;19505:4;19502:1;19498:12;19540:3;19534:4;19530:14;19525:3;19522:23;19519:49;;;19548:18;;:::i;:::-;19584:13;;19399:204;-1:-1:-1;;;19399:204:8:o;19608:120::-;19648:1;19674;19664:35;;19679:18;;:::i;:::-;-1:-1:-1;19713:9:8;;19608:120::o;19733:168::-;19773:7;19839:1;19835;19831:6;19827:14;19824:1;19821:21;19816:1;19809:9;19802:17;19798:45;19795:71;;;19846:18;;:::i;:::-;-1:-1:-1;19886:9:8;;19733:168::o;19906:125::-;19946:4;19974:1;19971;19968:8;19965:34;;;19979:18;;:::i;:::-;-1:-1:-1;20016:9:8;;19906:125::o;20036:258::-;20108:1;20118:113;20132:6;20129:1;20126:13;20118:113;;;20208:11;;;20202:18;20189:11;;;20182:39;20154:2;20147:10;20118:113;;;20249:6;20246:1;20243:13;20240:48;;;-1:-1:-1;;20284:1:8;20266:16;;20259:27;20036:258::o;20299:380::-;20378:1;20374:12;;;;20421;;;20442:61;;20496:4;20488:6;20484:17;20474:27;;20442:61;20549:2;20541:6;20538:14;20518:18;20515:38;20512:161;;;20595:10;20590:3;20586:20;20583:1;20576:31;20630:4;20627:1;20620:15;20658:4;20655:1;20648:15;20512:161;;20299:380;;;:::o;20684:135::-;20723:3;-1:-1:-1;;20744:17:8;;20741:43;;;20764:18;;:::i;:::-;-1:-1:-1;20811:1:8;20800:13;;20684:135::o;20824:112::-;20856:1;20882;20872:35;;20887:18;;:::i;:::-;-1:-1:-1;20921:9:8;;20824:112::o;20941:127::-;21002:10;20997:3;20993:20;20990:1;20983:31;21033:4;21030:1;21023:15;21057:4;21054:1;21047:15;21073:127;21134:10;21129:3;21125:20;21122:1;21115:31;21165:4;21162:1;21155:15;21189:4;21186:1;21179:15;21205:127;21266:10;21261:3;21257:20;21254:1;21247:31;21297:4;21294:1;21287:15;21321:4;21318:1;21311:15;21337:127;21398:10;21393:3;21389:20;21386:1;21379:31;21429:4;21426:1;21419:15;21453:4;21450:1;21443:15;21469:131;-1:-1:-1;;;;;;21543:32:8;;21533:43;;21523:71;;21590:1;21587;21580:12
Swarm Source
ipfs://88b51b7fd40ae555ad2738268171655b64e9ff36976afeb4fd594b93ffab8480
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.