ERC-721
Overview
Max Total Supply
1,713 FUBAO
Holders
633
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Fubao
Compiler Version
v0.8.8+commit.dddeac2f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.8; import "erc721a/contracts/ERC721A.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; contract Fubao is ERC721A, Ownable, Pausable, ReentrancyGuard { // metadata string public baseURI; // collection info uint256 public constant collectionSize = 9960; uint256 public perAddressMaxMintAmount = 10; // for marketing etc. uint256 public reservedAmount; uint256 public reservedMintedAmount; mapping(uint256 => string) public mintChannelMap; // public mint config uint256 public publicAvailableAmount; uint256 public publicMintedAmount; uint256 public publicStartTime; uint256 public publicPrice; // white list mint config bytes32 public whiteListMerkleRoot; uint256 public whiteListMintedAmount; uint256 public whiteListStartTime; uint256 public whiteListEndTime; uint256 public whiteListPrice; // refund config mapping(uint256 => uint256) public refundPriceMap; mapping(uint256 => uint256) public refundEndTimeMap; uint256 public refundPeriod = 7 days; uint256 public refundLastEndTime; uint256 public refundedAmount; address public refundAddress; constructor( string memory baseURI_, uint256 reservedAmount_, uint256 publicAvailableAmount_, uint256 publicStartTime_, uint256 publicPrice_, bytes32 whiteListMerkleRoot_, uint256 whiteListStartTime_, uint256 whiteListEndTime_, uint256 whiteListPrice_ ) ERC721A("996fubao", "FUBAO") { require( reservedAmount_ <= collectionSize && publicAvailableAmount_ <= collectionSize - reservedAmount_ && whiteListStartTime_ <= whiteListEndTime_, "invalid" ); baseURI = baseURI_; reservedAmount = reservedAmount_; publicAvailableAmount = publicAvailableAmount_; publicStartTime = publicStartTime_; publicPrice = publicPrice_; whiteListMerkleRoot = whiteListMerkleRoot_; whiteListStartTime = whiteListStartTime_; whiteListEndTime = whiteListEndTime_; whiteListPrice = whiteListPrice_; refundAddress = msg.sender; } function setBaseURI(string calldata baseURI_) public onlyOwner { baseURI = baseURI_; } function setMintConfig( uint256 perAddressMaxMintAmount_, uint256 reservedAmount_, uint256 publicAvailableAmount_, uint256 publicStartTime_, uint256 publicPrice_, bytes32 whiteListMerkleRoot_, uint256 whiteListStartTime_, uint256 whiteListEndTime_, uint256 whiteListPrice_ ) public onlyOwner { require( reservedAmount_ <= reservedAmount && reservedAmount_ >= reservedMintedAmount && publicAvailableAmount_ >= publicAvailableAmount && publicAvailableAmount_ <= collectionSize - reservedAmount_ && whiteListStartTime_ <= whiteListEndTime_, "invalid" ); perAddressMaxMintAmount = perAddressMaxMintAmount_; reservedAmount = reservedAmount_; publicAvailableAmount = publicAvailableAmount_; publicStartTime = publicStartTime_; publicPrice = publicPrice_; whiteListMerkleRoot = whiteListMerkleRoot_; whiteListStartTime = whiteListStartTime_; whiteListEndTime = whiteListEndTime_; whiteListPrice = whiteListPrice_; } function setRefundConfig(uint256 refundPeriod_, address refundAddress_) public onlyOwner { refundPeriod = refundPeriod_; refundAddress = refundAddress_; } function mint( uint256 amount, uint256 whiteListTotalAmount, bytes32[] calldata whiteListMerkleProof, string calldata channel ) public payable callerIsUser nonReentrant { require( publicMintedAmount + amount <= publicAvailableAmount && _numberMinted(msg.sender) + amount <= perAddressMaxMintAmount, "not enough amount" ); require(bytes(channel).length <= 20, "channel too long"); uint256 whiteListRemainAmount = 0; if ( block.timestamp >= whiteListStartTime && block.timestamp <= whiteListEndTime ) { whiteListRemainAmount = getWhiteListRemainAmount( msg.sender, whiteListTotalAmount, whiteListMerkleProof ); } if (whiteListRemainAmount == 0) { require( block.timestamp >= publicStartTime, "public mint not started" ); _publicMint(amount, channel); _refundIfOver(amount * publicPrice); } else { if (amount <= whiteListRemainAmount) { _whiteListMint(amount, channel); _refundIfOver(amount * whiteListPrice); } else { uint256 publicAmount = amount - whiteListRemainAmount; uint256 publicTotalPrice = publicAmount * publicPrice; uint256 whiteListTotalPrice = whiteListRemainAmount * whiteListPrice; _publicMint(publicAmount, channel); _whiteListMint(whiteListRemainAmount, channel); _refundIfOver(publicTotalPrice + whiteListTotalPrice); } } emit Mint(msg.sender, amount, channel); } function getWhiteListRemainAmount( address user, uint256 totalAmount, bytes32[] calldata merkleProof ) public view returns (uint256) { if (totalAmount == 0) return 0; uint256 mintedAmount = _getAux(user); require( totalAmount >= mintedAmount && MerkleProof.verify( merkleProof, whiteListMerkleRoot, keccak256(abi.encodePacked(user, ":", totalAmount)) ), "verify fail" ); return totalAmount - mintedAmount; } function _publicMint(uint256 amount, string calldata channel) private { publicMintedAmount += amount; _setMintData(amount, publicPrice, channel); _safeMint(msg.sender, amount); emit PublicMint(msg.sender, amount, publicPrice, channel); } function _whiteListMint(uint256 amount, string calldata channel) private { publicMintedAmount += amount; whiteListMintedAmount += amount; _setAux(msg.sender, _getAux(msg.sender) + uint64(amount)); _setMintData(amount, whiteListPrice, channel); _safeMint(msg.sender, amount); emit WhiteListMint(msg.sender, amount, whiteListPrice, channel); } function _setMintData( uint256 amount, uint256 price, string calldata channel ) private { uint256 index = _currentIndex; uint256 endIndex = index + amount; uint256 endTime = block.timestamp + refundPeriod; do { refundPriceMap[index] = price; refundEndTimeMap[index] = endTime; mintChannelMap[index] = channel; index++; } while (index != endIndex); if (endTime > refundLastEndTime) { refundLastEndTime = endTime; } } function refund(uint256[] calldata tokenIds) public callerIsUser nonReentrant { uint256 refundValue; for (uint256 i = 0; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; require(msg.sender == ownerOf(tokenId), "not owner"); require( block.timestamp <= refundEndTimeMap[tokenId], "refund expired" ); transferFrom(msg.sender, refundAddress, tokenId); refundValue += refundPriceMap[tokenId]; } refundedAmount += tokenIds.length; payable(msg.sender).transfer(refundValue); emit Refund(msg.sender, refundValue, tokenIds); } function airdrop(address user, uint256 amount) public onlyOwner { require( reservedMintedAmount + amount <= reservedAmount, "not enough amount" ); reservedMintedAmount += amount; _safeMint(user, amount); } function airdropList( address[] calldata userList, uint256[] calldata amountList ) public onlyOwner { require(userList.length == amountList.length, "invalid"); for (uint256 i = 0; i < userList.length; i++) { airdrop(userList[i], amountList[i]); } } // probably nothing bool public burnable = false; function setBurnable(bool burnable_) public onlyOwner { burnable = burnable_; } function burn(uint256[] calldata tokenIds) public callerIsUser { require(burnable, "not burnable"); for (uint256 i = 0; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; require(msg.sender == ownerOf(tokenId), "not owner"); _burn(tokenId); } emit Burn(msg.sender, tokenIds); } // pausable function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 amount ) internal override { super._beforeTokenTransfers(from, to, startTokenId, amount); require(!paused(), "paused"); } // other modifier callerIsUser() { require(tx.origin == msg.sender, "not user"); _; } function totalMinted() public view returns (uint256) { return _totalMinted(); } function numberMinted(address user) public view returns (uint256) { return _numberMinted(user); } function numberBurned(address user) public view returns (uint256) { return _numberBurned(user); } function withdraw() public onlyOwner nonReentrant { require(block.timestamp >= refundLastEndTime, "refund not end"); (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "fail"); } function _refundIfOver(uint256 price) private { require(msg.value >= price, "not enough ETH"); if (msg.value > price) { payable(msg.sender).transfer(msg.value - price); } } function _baseURI() internal view override returns (string memory) { return baseURI; } function _startTokenId() internal pure override returns (uint256) { return 1; } event PublicMint( address user, uint256 amount, uint256 price, string channel ); event WhiteListMint( address user, uint256 amount, uint256 price, string channel ); event Mint(address user, uint256 amount, string channel); event Refund(address user, uint256 value, uint256[] tokenIds); event Burn(address user, uint256[] tokenIds); }
// SPDX-License-Identifier: MIT // Creator: Chiru Labs pragma solidity ^0.8.4; import '@openzeppelin/contracts/token/ERC721/IERC721.sol'; import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol'; import '@openzeppelin/contracts/utils/Address.sol'; import '@openzeppelin/contracts/utils/Context.sol'; import '@openzeppelin/contracts/utils/Strings.sol'; import '@openzeppelin/contracts/utils/introspection/ERC165.sol'; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _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 _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary 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 { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @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. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is 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 { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @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 {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// 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() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees 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. */ 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 Returns the rebuilt hash obtained by traversing a Merklee 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++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// 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 // 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"uint256","name":"reservedAmount_","type":"uint256"},{"internalType":"uint256","name":"publicAvailableAmount_","type":"uint256"},{"internalType":"uint256","name":"publicStartTime_","type":"uint256"},{"internalType":"uint256","name":"publicPrice_","type":"uint256"},{"internalType":"bytes32","name":"whiteListMerkleRoot_","type":"bytes32"},{"internalType":"uint256","name":"whiteListStartTime_","type":"uint256"},{"internalType":"uint256","name":"whiteListEndTime_","type":"uint256"},{"internalType":"uint256","name":"whiteListPrice_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"channel","type":"string"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"string","name":"channel","type":"string"}],"name":"PublicMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"string","name":"channel","type":"string"}],"name":"WhiteListMint","type":"event"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"userList","type":"address[]"},{"internalType":"uint256[]","name":"amountList","type":"uint256[]"}],"name":"airdropList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"user","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"getWhiteListRemainAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"whiteListTotalAmount","type":"uint256"},{"internalType":"bytes32[]","name":"whiteListMerkleProof","type":"bytes32[]"},{"internalType":"string","name":"channel","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintChannelMap","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"numberBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perAddressMaxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicAvailableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refundAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"refundEndTimeMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundLastEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"refundPriceMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedMintedAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"burnable_","type":"bool"}],"name":"setBurnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"perAddressMaxMintAmount_","type":"uint256"},{"internalType":"uint256","name":"reservedAmount_","type":"uint256"},{"internalType":"uint256","name":"publicAvailableAmount_","type":"uint256"},{"internalType":"uint256","name":"publicStartTime_","type":"uint256"},{"internalType":"uint256","name":"publicPrice_","type":"uint256"},{"internalType":"bytes32","name":"whiteListMerkleRoot_","type":"bytes32"},{"internalType":"uint256","name":"whiteListStartTime_","type":"uint256"},{"internalType":"uint256","name":"whiteListEndTime_","type":"uint256"},{"internalType":"uint256","name":"whiteListPrice_","type":"uint256"}],"name":"setMintConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"refundPeriod_","type":"uint256"},{"internalType":"address","name":"refundAddress_","type":"address"}],"name":"setRefundConfig","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":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600a600b5562093a80601a55601d805460ff60a01b191690553480156200002a57600080fd5b50604051620036f2380380620036f28339810160408190526200004d916200029e565b6040805180820182526008815267393936667562616f60c01b602080830191825283518085019094526005845264465542414f60d81b9084015281519192916200009a91600291620001e2565b508051620000b0906003906020840190620001e2565b5050600160005550620000c33362000190565b6008805460ff60a01b1916905560016009556126e88811801590620000f55750620000f1886126e8620003cb565b8711155b8015620001025750818311155b6200013d5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b604482015260640160405180910390fd5b88516200015290600a9060208c0190620001e2565b50600c97909755600f9590955560119390935560129190915560135560155560165560175550601d80546001600160a01b031916331790556200042e565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001f090620003f1565b90600052602060002090601f0160209004810192826200021457600085556200025f565b82601f106200022f57805160ff19168380011785556200025f565b828001600101855582156200025f579182015b828111156200025f57825182559160200191906001019062000242565b506200026d92915062000271565b5090565b5b808211156200026d576000815560010162000272565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060008060006101208a8c031215620002be57600080fd5b89516001600160401b0380821115620002d657600080fd5b818c0191508c601f830112620002eb57600080fd5b81518181111562000300576200030062000288565b604051601f8201601f19908116603f011681019083821181831017156200032b576200032b62000288565b81604052828152602093508f848487010111156200034857600080fd5b600091505b828210156200036c57848201840151818301850152908301906200034d565b828211156200037e5760008484830101525b809d50505050808c01519950505060408a0151965060608a0151955060808a0151945060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b600082821015620003ec57634e487b7160e01b600052601160045260246000fd5b500390565b600181811c908216806200040657607f821691505b602082108114156200042857634e487b7160e01b600052602260045260246000fd5b50919050565b6132b4806200043e6000396000f3fe60806040526004361061036b5760003560e01c80638da5cb5b116101c6578063bb41be57116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610995578063f92c45b7146109b5578063fa0770df146109cb578063fd3cdb74146109e157600080fd5b8063e985e9c5146108ff578063ef60327214610948578063f170666e1461097557600080fd5b8063c87b56dd116100d1578063c87b56dd14610893578063d08afb42146108b3578063dc33e681146108c9578063df90c98d146108e957600080fd5b8063bb41be571461083d578063bdf81ef514610853578063c0e548471461087357600080fd5b8063a945bf8011610164578063b259a3a41161013e578063b259a3a4146107b0578063b6c33da9146107dd578063b80f55c9146107fd578063b88d4fde1461081d57600080fd5b8063a945bf8014610764578063aa613df51461077a578063ad7c6ed11461079a57600080fd5b8063a22cb465116101a0578063a22cb465146106f5578063a2309ff814610715578063a3a154491461072e578063a6a3b5b41461074e57600080fd5b80638da5cb5b146106a157806395d89b41146106bf578063a07c7ce4146106d457600080fd5b806342842e0e116102a0578063685756851161023e578063715018a611610218578063715018a61461063757806380929e5b1461064c5780638456cb591461066c5780638ba4cc3c1461068157600080fd5b806368575685146105ec5780636c0360eb1461060257806370a082311461061757600080fd5b806355f804b31161027a57806355f804b3146105775780635c975abb146105975780635fd1bbc4146105b65780636352211e146105cc57600080fd5b806342842e0e1461052e57806345c0f5331461054e57806354141c751461056457600080fd5b806323b872dd1161030d57806338110563116102e757806338110563146104d85780633a08002e146104ee5780633ccfd60b146105045780633f4ba83a1461051957600080fd5b806323b872dd146104825780632478d639146104a257806334b6ab1a146104c257600080fd5b8063081812fc11610349578063081812fc146103eb578063095ea7b3146104235780630cb61f6c1461044557806318160ddd1461046557600080fd5b806301ffc9a714610370578063032438ed146103a557806306fdde03146103c9575b600080fd5b34801561037c57600080fd5b5061039061038b36600461298c565b6109f7565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103bb600b5481565b60405190815260200161039c565b3480156103d557600080fd5b506103de610a49565b60405161039c9190612a01565b3480156103f757600080fd5b5061040b610406366004612a14565b610adb565b6040516001600160a01b03909116815260200161039c565b34801561042f57600080fd5b5061044361043e366004612a49565b610b1f565b005b34801561045157600080fd5b50601d5461040b906001600160a01b031681565b34801561047157600080fd5b5060015460005403600019016103bb565b34801561048e57600080fd5b5061044361049d366004612a73565b610bad565b3480156104ae57600080fd5b506103bb6104bd366004612aaf565b610bb8565b3480156104ce57600080fd5b506103bb60135481565b3480156104e457600080fd5b506103bb60155481565b3480156104fa57600080fd5b506103bb601b5481565b34801561051057600080fd5b50610443610be6565b34801561052557600080fd5b50610443610d0d565b34801561053a57600080fd5b50610443610549366004612a73565b610d41565b34801561055a57600080fd5b506103bb6126e881565b610443610572366004612b56565b610d5c565b34801561058357600080fd5b50610443610592366004612bd8565b610fe1565b3480156105a357600080fd5b50600854600160a01b900460ff16610390565b3480156105c257600080fd5b506103bb60115481565b3480156105d857600080fd5b5061040b6105e7366004612a14565b611017565b3480156105f857600080fd5b506103bb60175481565b34801561060e57600080fd5b506103de611029565b34801561062357600080fd5b506103bb610632366004612aaf565b6110b7565b34801561064357600080fd5b50610443611105565b34801561065857600080fd5b50610443610667366004612c29565b611139565b34801561067857600080fd5b50610443611181565b34801561068d57600080fd5b5061044361069c366004612a49565b6111b3565b3480156106ad57600080fd5b506008546001600160a01b031661040b565b3480156106cb57600080fd5b506103de611256565b3480156106e057600080fd5b50601d5461039090600160a01b900460ff1681565b34801561070157600080fd5b50610443610710366004612c44565b611265565b34801561072157600080fd5b50600054600019016103bb565b34801561073a57600080fd5b50610443610749366004612c77565b6112fb565b34801561075a57600080fd5b506103bb601a5481565b34801561077057600080fd5b506103bb60125481565b34801561078657600080fd5b50610443610795366004612c9a565b61134c565b3480156107a657600080fd5b506103bb601c5481565b3480156107bc57600080fd5b506103bb6107cb366004612a14565b60196020526000908152604090205481565b3480156107e957600080fd5b506104436107f8366004612ccf565b611537565b34801561080957600080fd5b50610443610818366004612c9a565b611605565b34801561082957600080fd5b50610443610838366004612d44565b611745565b34801561084957600080fd5b506103bb600f5481565b34801561085f57600080fd5b506103de61086e366004612a14565b611796565b34801561087f57600080fd5b506103bb61088e366004612e1f565b6117af565b34801561089f57600080fd5b506103de6108ae366004612a14565b6118b6565b3480156108bf57600080fd5b506103bb600d5481565b3480156108d557600080fd5b506103bb6108e4366004612aaf565b61193b565b3480156108f557600080fd5b506103bb60165481565b34801561090b57600080fd5b5061039061091a366004612e78565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561095457600080fd5b506103bb610963366004612a14565b60186020526000908152604090205481565b34801561098157600080fd5b50610443610990366004612ea2565b611969565b3480156109a157600080fd5b506104436109b0366004612aaf565b611a38565b3480156109c157600080fd5b506103bb600c5481565b3480156109d757600080fd5b506103bb60105481565b3480156109ed57600080fd5b506103bb60145481565b60006001600160e01b031982166380ac58cd60e01b1480610a2857506001600160e01b03198216635b5e139f60e01b145b80610a4357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610a5890612f01565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8490612f01565b8015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000610ae682611ad3565b610b03576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b2a82611017565b9050806001600160a01b0316836001600160a01b03161415610b5f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b7f5750610b7d813361091a565b155b15610b9d576040516367d9dca160e11b815260040160405180910390fd5b610ba8838383611b0c565b505050565b610ba8838383611b68565b6001600160a01b038116600090815260056020526040812054600160801b90046001600160401b0316610a43565b6008546001600160a01b03163314610c195760405162461bcd60e51b8152600401610c1090612f3c565b60405180910390fd5b60026009541415610c3c5760405162461bcd60e51b8152600401610c1090612f71565b6002600955601b54421015610c845760405162461bcd60e51b815260206004820152600e60248201526d1c99599d5b99081b9bdd08195b9960921b6044820152606401610c10565b604051600090339047908381818185875af1925050503d8060008114610cc6576040519150601f19603f3d011682016040523d82523d6000602084013e610ccb565b606091505b5050905080610d055760405162461bcd60e51b8152600401610c109060208082526004908201526319985a5b60e21b604082015260600190565b506001600955565b6008546001600160a01b03163314610d375760405162461bcd60e51b8152600401610c1090612f3c565b610d3f611d4e565b565b610ba883838360405180602001604052806000815250611745565b323314610d7b5760405162461bcd60e51b8152600401610c1090612fa8565b60026009541415610d9e5760405162461bcd60e51b8152600401610c1090612f71565b6002600955600f54601054610db4908890612fe0565b11158015610def5750600b54336000908152600560205260409020548790600160401b90046001600160401b0316610dec9190612fe0565b11155b610e2f5760405162461bcd60e51b81526020600482015260116024820152701b9bdd08195b9bdd59da08185b5bdd5b9d607a1b6044820152606401610c10565b6014811115610e735760405162461bcd60e51b815260206004820152601060248201526f6368616e6e656c20746f6f206c6f6e6760801b6044820152606401610c10565b60006015544210158015610e8957506016544211155b15610e9d57610e9a338787876117af565b90505b80610f1a57601154421015610ef45760405162461bcd60e51b815260206004820152601760248201527f7075626c6963206d696e74206e6f7420737461727465640000000000000000006044820152606401610c10565b610eff878484611deb565b610f1560125488610f109190612ff8565b611e62565b610f96565b808711610f3d57610f2c878484611ee1565b610f1560175488610f109190612ff8565b6000610f498289613017565b9050600060125482610f5b9190612ff8565b9050600060175484610f6d9190612ff8565b9050610f7a838787611deb565b610f85848787611ee1565b610f92610f108284612fe0565b5050505b7f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a33888585604051610fcb9493929190613057565b60405180910390a1505060016009555050505050565b6008546001600160a01b0316331461100b5760405162461bcd60e51b8152600401610c1090612f3c565b610ba8600a83836128dd565b600061102282611fba565b5192915050565b600a805461103690612f01565b80601f016020809104026020016040519081016040528092919081815260200182805461106290612f01565b80156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b505050505081565b60006001600160a01b0382166110e0576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b0316331461112f5760405162461bcd60e51b8152600401610c1090612f3c565b610d3f60006120e1565b6008546001600160a01b031633146111635760405162461bcd60e51b8152600401610c1090612f3c565b601d8054911515600160a01b0260ff60a01b19909216919091179055565b6008546001600160a01b031633146111ab5760405162461bcd60e51b8152600401610c1090612f3c565b610d3f612133565b6008546001600160a01b031633146111dd5760405162461bcd60e51b8152600401610c1090612f3c565b600c5481600d546111ee9190612fe0565b11156112305760405162461bcd60e51b81526020600482015260116024820152701b9bdd08195b9bdd59da08185b5bdd5b9d607a1b6044820152606401610c10565b80600d60008282546112429190612fe0565b90915550611252905082826121bb565b5050565b606060038054610a5890612f01565b6001600160a01b03821633141561128f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146113255760405162461bcd60e51b8152600401610c1090612f3c565b601a91909155601d80546001600160a01b0319166001600160a01b03909216919091179055565b32331461136b5760405162461bcd60e51b8152600401610c1090612fa8565b6002600954141561138e5760405162461bcd60e51b8152600401610c1090612f71565b60026009556000805b828110156114a75760008484838181106113b3576113b3613089565b9050602002013590506113c581611017565b6001600160a01b0316336001600160a01b0316146114115760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610c10565b6000818152601960205260409020544211156114605760405162461bcd60e51b815260206004820152600e60248201526d1c99599d5b9908195e1c1a5c995960921b6044820152606401610c10565b601d546114789033906001600160a01b031683610bad565b6000818152601860205260409020546114919084612fe0565b925050808061149f9061309f565b915050611397565b5082829050601c60008282546114bd9190612fe0565b9091555050604051339082156108fc029083906000818181858888f193505050501580156114ef573d6000803e3d6000fd5b507ff031ad8ae0fd4a05c3856c5c7f8bf71372937276828a5cbc1a32d78eb2320ecc3382858560405161152594939291906130f0565b60405180910390a15050600160095550565b6008546001600160a01b031633146115615760405162461bcd60e51b8152600401610c1090612f3c565b600c5488111580156115755750600d548810155b80156115835750600f548710155b801561159a5750611596886126e8613017565b8711155b80156115a65750818311155b6115dc5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b6044820152606401610c10565b600b98909855600c96909655600f94909455601192909255601255601355601555601655601755565b3233146116245760405162461bcd60e51b8152600401610c1090612fa8565b601d54600160a01b900460ff1661166c5760405162461bcd60e51b815260206004820152600c60248201526b6e6f74206275726e61626c6560a01b6044820152606401610c10565b60005b8181101561170557600083838381811061168b5761168b613089565b90506020020135905061169d81611017565b6001600160a01b0316336001600160a01b0316146116e95760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610c10565b6116f2816121d5565b50806116fd8161309f565b91505061166f565b507f4c3f61bbac5dc8dc1f47677a57a23e312af5e0b7ce11ce20b40bb1ec82f8882233838360405161173993929190613118565b60405180910390a15050565b611750848484611b68565b6001600160a01b0383163b151580156117725750611770848484846121e0565b155b15611790576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600e602052600090815260409020805461103690612f01565b6000836117be575060006118ae565b60006117c9866122d4565b6001600160401b031690508085101580156118665750611866848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506013546040516bffffffffffffffffffffffff1960608d901b166020820152601d60f91b6034820152603581018b90529092506055019050604051602081830303815290604052805190602001206122ff565b6118a05760405162461bcd60e51b815260206004820152600b60248201526a1d995c9a599e4819985a5b60aa1b6044820152606401610c10565b6118aa8186613017565b9150505b949350505050565b60606118c182611ad3565b6118de57604051630a14c4b560e41b815260040160405180910390fd5b60006118e8612315565b90508051600014156119095760405180602001604052806000815250611934565b8061191384612324565b604051602001611924929190613146565b6040516020818303038152906040525b9392505050565b6001600160a01b038116600090815260056020526040812054600160401b90046001600160401b0316610a43565b6008546001600160a01b031633146119935760405162461bcd60e51b8152600401610c1090612f3c565b8281146119cc5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b6044820152606401610c10565b60005b83811015611a3157611a1f8585838181106119ec576119ec613089565b9050602002016020810190611a019190612aaf565b848484818110611a1357611a13613089565b905060200201356111b3565b80611a298161309f565b9150506119cf565b5050505050565b6008546001600160a01b03163314611a625760405162461bcd60e51b8152600401610c1090612f3c565b6001600160a01b038116611ac75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c10565b611ad0816120e1565b50565b600081600111158015611ae7575060005482105b8015610a43575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b7382611fba565b9050836001600160a01b031681600001516001600160a01b031614611baa5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611bc85750611bc8853361091a565b80611be3575033611bd884610adb565b6001600160a01b0316145b905080611c0357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611c2a57604051633a954ecd60e21b815260040160405180910390fd5b611c378585856001612421565b611c4360008487611b0c565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611d17576000548214611d1757805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061325f83398151915260405160405180910390a4611a31565b600854600160a01b900460ff16611d9e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c10565b6008805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b8260106000828254611dfd9190612fe0565b92505081905550611e12836012548484612464565b611e1c33846121bb565b7f7f9c8931cfbc299ecaa11e741eec91343b38cacaead98eb6c607394cbf30652f33846012548585604051611e55959493929190613175565b60405180910390a1505050565b80341015611ea35760405162461bcd60e51b815260206004820152600e60248201526d0dcdee840cadcdeeaced0408aa8960931b6044820152606401610c10565b80341115611ad057336108fc611eb98334613017565b6040518115909202916000818181858888f19350505050158015611252573d6000803e3d6000fd5b8260106000828254611ef39190612fe0565b925050819055508260146000828254611f0c9190612fe0565b90915550611f6990503384611f20826122d4565b611f2a91906131ae565b6001600160a01b03909116600090815260056020526040902080546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b611f77836017548484612464565b611f8133846121bb565b7f3aedaf0943c081b563cedc91a17e2e77eed3cb6b83574b8a933d23bee44744ab33846017548585604051611e55959493929190613175565b60408051606081018252600080825260208201819052918101919091528180600111158015611fea575060005481105b156120c857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120c65780516001600160a01b03161561205d579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156120c1579392505050565b61205d565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600854600160a01b900460ff16156121805760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c10565b6008805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611dce3390565b6112528282604051806020016040528060008152506124e7565b611ad08160006124f4565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906122159033908990889088906004016131d0565b602060405180830381600087803b15801561222f57600080fd5b505af192505050801561225f575060408051601f3d908101601f1916820190925261225c91810190613203565b60015b6122ba573d80801561228d576040519150601f19603f3d011682016040523d82523d6000602084013e612292565b606091505b5080516122b2576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118ae565b6001600160a01b0316600090815260056020526040902054600160c01b90046001600160401b031690565b60008261230c85846126b5565b14949350505050565b6060600a8054610a5890612f01565b6060816123485750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612372578061235c8161309f565b915061236b9050600a83613236565b915061234c565b6000816001600160401b0381111561238c5761238c612d2e565b6040519080825280601f01601f1916602001820160405280156123b6576020820181803683370190505b5090505b84156118ae576123cb600183613017565b91506123d8600a8661324a565b6123e3906030612fe0565b60f81b8183815181106123f8576123f8613089565b60200101906001600160f81b031916908160001a90535061241a600a86613236565b94506123ba565b600854600160a01b900460ff16156117905760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606401610c10565b60008054906124738683612fe0565b90506000601a54426124859190612fe0565b90505b600083815260186020908152604080832089905560198252808320849055600e90915290206124b89086866128dd565b50826124c38161309f565b9350508183141561248857601b548111156124de57601b8190555b50505050505050565b610ba88383836001612729565b60006124ff83611fba565b80519091508215612565576000336001600160a01b03831614806125285750612528823361091a565b8061254357503361253886610adb565b6001600160a01b0316145b90508061256357604051632ce44b5f60e11b815260040160405180910390fd5b505b612573816000866001612421565b61257f60008583611b0c565b6001600160a01b0380821660008181526005602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526004909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661267d57600054821461267d57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b0384169060008051602061325f833981519152908390a4505060018054810190555050565b600081815b84518110156127215760008582815181106126d7576126d7613089565b602002602001015190508083116126fd576000838152602082905260409020925061270e565b600081815260208490526040902092505b50806127198161309f565b9150506126ba565b509392505050565b6000546001600160a01b03851661275257604051622e076360e81b815260040160405180910390fd5b836127705760405163b562e8dd60e01b815260040160405180910390fd5b61277d6000868387612421565b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561282957506001600160a01b0387163b15155b156128a0575b60405182906001600160a01b0389169060009060008051602061325f833981519152908290a461286860008884806001019550886121e0565b612885576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561282f57826000541461289b57600080fd5b6128d4565b5b6040516001830192906001600160a01b0389169060009060008051602061325f833981519152908290a4808214156128a1575b50600055611a31565b8280546128e990612f01565b90600052602060002090601f01602090048101928261290b5760008555612951565b82601f106129245782800160ff19823516178555612951565b82800160010185558215612951579182015b82811115612951578235825591602001919060010190612936565b5061295d929150612961565b5090565b5b8082111561295d5760008155600101612962565b6001600160e01b031981168114611ad057600080fd5b60006020828403121561299e57600080fd5b813561193481612976565b60005b838110156129c45781810151838201526020016129ac565b838111156117905750506000910152565b600081518084526129ed8160208601602086016129a9565b601f01601f19169290920160200192915050565b60208152600061193460208301846129d5565b600060208284031215612a2657600080fd5b5035919050565b80356001600160a01b0381168114612a4457600080fd5b919050565b60008060408385031215612a5c57600080fd5b612a6583612a2d565b946020939093013593505050565b600080600060608486031215612a8857600080fd5b612a9184612a2d565b9250612a9f60208501612a2d565b9150604084013590509250925092565b600060208284031215612ac157600080fd5b61193482612a2d565b60008083601f840112612adc57600080fd5b5081356001600160401b03811115612af357600080fd5b6020830191508360208260051b8501011115612b0e57600080fd5b9250929050565b60008083601f840112612b2757600080fd5b5081356001600160401b03811115612b3e57600080fd5b602083019150836020828501011115612b0e57600080fd5b60008060008060008060808789031215612b6f57600080fd5b863595506020870135945060408701356001600160401b0380821115612b9457600080fd5b612ba08a838b01612aca565b90965094506060890135915080821115612bb957600080fd5b50612bc689828a01612b15565b979a9699509497509295939492505050565b60008060208385031215612beb57600080fd5b82356001600160401b03811115612c0157600080fd5b612c0d85828601612b15565b90969095509350505050565b80358015158114612a4457600080fd5b600060208284031215612c3b57600080fd5b61193482612c19565b60008060408385031215612c5757600080fd5b612c6083612a2d565b9150612c6e60208401612c19565b90509250929050565b60008060408385031215612c8a57600080fd5b82359150612c6e60208401612a2d565b60008060208385031215612cad57600080fd5b82356001600160401b03811115612cc357600080fd5b612c0d85828601612aca565b60008060008060008060008060006101208a8c031215612cee57600080fd5b505087359960208901359950604089013598606081013598506080810135975060a0810135965060c0810135955060e08101359450610100013592509050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612d5a57600080fd5b612d6385612a2d565b9350612d7160208601612a2d565b92506040850135915060608501356001600160401b0380821115612d9457600080fd5b818701915087601f830112612da857600080fd5b813581811115612dba57612dba612d2e565b604051601f8201601f19908116603f01168101908382118183101715612de257612de2612d2e565b816040528281528a6020848701011115612dfb57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060008060608587031215612e3557600080fd5b612e3e85612a2d565b93506020850135925060408501356001600160401b03811115612e6057600080fd5b612e6c87828801612aca565b95989497509550505050565b60008060408385031215612e8b57600080fd5b612e9483612a2d565b9150612c6e60208401612a2d565b60008060008060408587031215612eb857600080fd5b84356001600160401b0380821115612ecf57600080fd5b612edb88838901612aca565b90965094506020870135915080821115612ef457600080fd5b50612e6c87828801612aca565b600181811c90821680612f1557607f821691505b60208210811415612f3657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600890820152673737ba103ab9b2b960c11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612ff357612ff3612fca565b500190565b600081600019048311821515161561301257613012612fca565b500290565b60008282101561302957613029612fca565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038516815283602082015260606040820152600061307f60608301848661302e565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156130b3576130b3612fca565b5060010190565b81835260006001600160fb1b038311156130d357600080fd5b8260051b8083602087013760009401602001938452509192915050565b60018060a01b038516815283602082015260606040820152600061307f6060830184866130ba565b6001600160a01b038416815260406020820181905260009061313d90830184866130ba565b95945050505050565b600083516131588184602088016129a9565b83519083019061316c8183602088016129a9565b01949350505050565b60018060a01b03861681528460208201528360408201526080606082015260006131a360808301848661302e565b979650505050505050565b60006001600160401b0380831681851680830382111561316c5761316c612fca565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061307f908301846129d5565b60006020828403121561321557600080fd5b815161193481612976565b634e487b7160e01b600052601260045260246000fd5b60008261324557613245613220565b500490565b60008261325957613259613220565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d1fca989df07787a16719063e6bb0f44d8bb7abcddf69791312b0f01006f931e64736f6c63430008080033000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e4000000000000000000000000000000000000000000000000000000006268b1b00000000000000000000000000000000000000000000000000023629135f6800024c852a0c31676ab8b57ca77e4bb7f6387adaa52c68dcaf9de3287b518cdb9b10000000000000000000000000000000000000000000000000000000062621a3000000000000000000000000000000000000000000000000000000000626825100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e68747470733a2f2f393936667562616f2e696f2f6d6574612e6a736f6e230000
Deployed Bytecode
0x60806040526004361061036b5760003560e01c80638da5cb5b116101c6578063bb41be57116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610995578063f92c45b7146109b5578063fa0770df146109cb578063fd3cdb74146109e157600080fd5b8063e985e9c5146108ff578063ef60327214610948578063f170666e1461097557600080fd5b8063c87b56dd116100d1578063c87b56dd14610893578063d08afb42146108b3578063dc33e681146108c9578063df90c98d146108e957600080fd5b8063bb41be571461083d578063bdf81ef514610853578063c0e548471461087357600080fd5b8063a945bf8011610164578063b259a3a41161013e578063b259a3a4146107b0578063b6c33da9146107dd578063b80f55c9146107fd578063b88d4fde1461081d57600080fd5b8063a945bf8014610764578063aa613df51461077a578063ad7c6ed11461079a57600080fd5b8063a22cb465116101a0578063a22cb465146106f5578063a2309ff814610715578063a3a154491461072e578063a6a3b5b41461074e57600080fd5b80638da5cb5b146106a157806395d89b41146106bf578063a07c7ce4146106d457600080fd5b806342842e0e116102a0578063685756851161023e578063715018a611610218578063715018a61461063757806380929e5b1461064c5780638456cb591461066c5780638ba4cc3c1461068157600080fd5b806368575685146105ec5780636c0360eb1461060257806370a082311461061757600080fd5b806355f804b31161027a57806355f804b3146105775780635c975abb146105975780635fd1bbc4146105b65780636352211e146105cc57600080fd5b806342842e0e1461052e57806345c0f5331461054e57806354141c751461056457600080fd5b806323b872dd1161030d57806338110563116102e757806338110563146104d85780633a08002e146104ee5780633ccfd60b146105045780633f4ba83a1461051957600080fd5b806323b872dd146104825780632478d639146104a257806334b6ab1a146104c257600080fd5b8063081812fc11610349578063081812fc146103eb578063095ea7b3146104235780630cb61f6c1461044557806318160ddd1461046557600080fd5b806301ffc9a714610370578063032438ed146103a557806306fdde03146103c9575b600080fd5b34801561037c57600080fd5b5061039061038b36600461298c565b6109f7565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103bb600b5481565b60405190815260200161039c565b3480156103d557600080fd5b506103de610a49565b60405161039c9190612a01565b3480156103f757600080fd5b5061040b610406366004612a14565b610adb565b6040516001600160a01b03909116815260200161039c565b34801561042f57600080fd5b5061044361043e366004612a49565b610b1f565b005b34801561045157600080fd5b50601d5461040b906001600160a01b031681565b34801561047157600080fd5b5060015460005403600019016103bb565b34801561048e57600080fd5b5061044361049d366004612a73565b610bad565b3480156104ae57600080fd5b506103bb6104bd366004612aaf565b610bb8565b3480156104ce57600080fd5b506103bb60135481565b3480156104e457600080fd5b506103bb60155481565b3480156104fa57600080fd5b506103bb601b5481565b34801561051057600080fd5b50610443610be6565b34801561052557600080fd5b50610443610d0d565b34801561053a57600080fd5b50610443610549366004612a73565b610d41565b34801561055a57600080fd5b506103bb6126e881565b610443610572366004612b56565b610d5c565b34801561058357600080fd5b50610443610592366004612bd8565b610fe1565b3480156105a357600080fd5b50600854600160a01b900460ff16610390565b3480156105c257600080fd5b506103bb60115481565b3480156105d857600080fd5b5061040b6105e7366004612a14565b611017565b3480156105f857600080fd5b506103bb60175481565b34801561060e57600080fd5b506103de611029565b34801561062357600080fd5b506103bb610632366004612aaf565b6110b7565b34801561064357600080fd5b50610443611105565b34801561065857600080fd5b50610443610667366004612c29565b611139565b34801561067857600080fd5b50610443611181565b34801561068d57600080fd5b5061044361069c366004612a49565b6111b3565b3480156106ad57600080fd5b506008546001600160a01b031661040b565b3480156106cb57600080fd5b506103de611256565b3480156106e057600080fd5b50601d5461039090600160a01b900460ff1681565b34801561070157600080fd5b50610443610710366004612c44565b611265565b34801561072157600080fd5b50600054600019016103bb565b34801561073a57600080fd5b50610443610749366004612c77565b6112fb565b34801561075a57600080fd5b506103bb601a5481565b34801561077057600080fd5b506103bb60125481565b34801561078657600080fd5b50610443610795366004612c9a565b61134c565b3480156107a657600080fd5b506103bb601c5481565b3480156107bc57600080fd5b506103bb6107cb366004612a14565b60196020526000908152604090205481565b3480156107e957600080fd5b506104436107f8366004612ccf565b611537565b34801561080957600080fd5b50610443610818366004612c9a565b611605565b34801561082957600080fd5b50610443610838366004612d44565b611745565b34801561084957600080fd5b506103bb600f5481565b34801561085f57600080fd5b506103de61086e366004612a14565b611796565b34801561087f57600080fd5b506103bb61088e366004612e1f565b6117af565b34801561089f57600080fd5b506103de6108ae366004612a14565b6118b6565b3480156108bf57600080fd5b506103bb600d5481565b3480156108d557600080fd5b506103bb6108e4366004612aaf565b61193b565b3480156108f557600080fd5b506103bb60165481565b34801561090b57600080fd5b5061039061091a366004612e78565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561095457600080fd5b506103bb610963366004612a14565b60186020526000908152604090205481565b34801561098157600080fd5b50610443610990366004612ea2565b611969565b3480156109a157600080fd5b506104436109b0366004612aaf565b611a38565b3480156109c157600080fd5b506103bb600c5481565b3480156109d757600080fd5b506103bb60105481565b3480156109ed57600080fd5b506103bb60145481565b60006001600160e01b031982166380ac58cd60e01b1480610a2857506001600160e01b03198216635b5e139f60e01b145b80610a4357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610a5890612f01565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8490612f01565b8015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000610ae682611ad3565b610b03576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b2a82611017565b9050806001600160a01b0316836001600160a01b03161415610b5f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b7f5750610b7d813361091a565b155b15610b9d576040516367d9dca160e11b815260040160405180910390fd5b610ba8838383611b0c565b505050565b610ba8838383611b68565b6001600160a01b038116600090815260056020526040812054600160801b90046001600160401b0316610a43565b6008546001600160a01b03163314610c195760405162461bcd60e51b8152600401610c1090612f3c565b60405180910390fd5b60026009541415610c3c5760405162461bcd60e51b8152600401610c1090612f71565b6002600955601b54421015610c845760405162461bcd60e51b815260206004820152600e60248201526d1c99599d5b99081b9bdd08195b9960921b6044820152606401610c10565b604051600090339047908381818185875af1925050503d8060008114610cc6576040519150601f19603f3d011682016040523d82523d6000602084013e610ccb565b606091505b5050905080610d055760405162461bcd60e51b8152600401610c109060208082526004908201526319985a5b60e21b604082015260600190565b506001600955565b6008546001600160a01b03163314610d375760405162461bcd60e51b8152600401610c1090612f3c565b610d3f611d4e565b565b610ba883838360405180602001604052806000815250611745565b323314610d7b5760405162461bcd60e51b8152600401610c1090612fa8565b60026009541415610d9e5760405162461bcd60e51b8152600401610c1090612f71565b6002600955600f54601054610db4908890612fe0565b11158015610def5750600b54336000908152600560205260409020548790600160401b90046001600160401b0316610dec9190612fe0565b11155b610e2f5760405162461bcd60e51b81526020600482015260116024820152701b9bdd08195b9bdd59da08185b5bdd5b9d607a1b6044820152606401610c10565b6014811115610e735760405162461bcd60e51b815260206004820152601060248201526f6368616e6e656c20746f6f206c6f6e6760801b6044820152606401610c10565b60006015544210158015610e8957506016544211155b15610e9d57610e9a338787876117af565b90505b80610f1a57601154421015610ef45760405162461bcd60e51b815260206004820152601760248201527f7075626c6963206d696e74206e6f7420737461727465640000000000000000006044820152606401610c10565b610eff878484611deb565b610f1560125488610f109190612ff8565b611e62565b610f96565b808711610f3d57610f2c878484611ee1565b610f1560175488610f109190612ff8565b6000610f498289613017565b9050600060125482610f5b9190612ff8565b9050600060175484610f6d9190612ff8565b9050610f7a838787611deb565b610f85848787611ee1565b610f92610f108284612fe0565b5050505b7f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a33888585604051610fcb9493929190613057565b60405180910390a1505060016009555050505050565b6008546001600160a01b0316331461100b5760405162461bcd60e51b8152600401610c1090612f3c565b610ba8600a83836128dd565b600061102282611fba565b5192915050565b600a805461103690612f01565b80601f016020809104026020016040519081016040528092919081815260200182805461106290612f01565b80156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b505050505081565b60006001600160a01b0382166110e0576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b0316331461112f5760405162461bcd60e51b8152600401610c1090612f3c565b610d3f60006120e1565b6008546001600160a01b031633146111635760405162461bcd60e51b8152600401610c1090612f3c565b601d8054911515600160a01b0260ff60a01b19909216919091179055565b6008546001600160a01b031633146111ab5760405162461bcd60e51b8152600401610c1090612f3c565b610d3f612133565b6008546001600160a01b031633146111dd5760405162461bcd60e51b8152600401610c1090612f3c565b600c5481600d546111ee9190612fe0565b11156112305760405162461bcd60e51b81526020600482015260116024820152701b9bdd08195b9bdd59da08185b5bdd5b9d607a1b6044820152606401610c10565b80600d60008282546112429190612fe0565b90915550611252905082826121bb565b5050565b606060038054610a5890612f01565b6001600160a01b03821633141561128f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146113255760405162461bcd60e51b8152600401610c1090612f3c565b601a91909155601d80546001600160a01b0319166001600160a01b03909216919091179055565b32331461136b5760405162461bcd60e51b8152600401610c1090612fa8565b6002600954141561138e5760405162461bcd60e51b8152600401610c1090612f71565b60026009556000805b828110156114a75760008484838181106113b3576113b3613089565b9050602002013590506113c581611017565b6001600160a01b0316336001600160a01b0316146114115760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610c10565b6000818152601960205260409020544211156114605760405162461bcd60e51b815260206004820152600e60248201526d1c99599d5b9908195e1c1a5c995960921b6044820152606401610c10565b601d546114789033906001600160a01b031683610bad565b6000818152601860205260409020546114919084612fe0565b925050808061149f9061309f565b915050611397565b5082829050601c60008282546114bd9190612fe0565b9091555050604051339082156108fc029083906000818181858888f193505050501580156114ef573d6000803e3d6000fd5b507ff031ad8ae0fd4a05c3856c5c7f8bf71372937276828a5cbc1a32d78eb2320ecc3382858560405161152594939291906130f0565b60405180910390a15050600160095550565b6008546001600160a01b031633146115615760405162461bcd60e51b8152600401610c1090612f3c565b600c5488111580156115755750600d548810155b80156115835750600f548710155b801561159a5750611596886126e8613017565b8711155b80156115a65750818311155b6115dc5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b6044820152606401610c10565b600b98909855600c96909655600f94909455601192909255601255601355601555601655601755565b3233146116245760405162461bcd60e51b8152600401610c1090612fa8565b601d54600160a01b900460ff1661166c5760405162461bcd60e51b815260206004820152600c60248201526b6e6f74206275726e61626c6560a01b6044820152606401610c10565b60005b8181101561170557600083838381811061168b5761168b613089565b90506020020135905061169d81611017565b6001600160a01b0316336001600160a01b0316146116e95760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610c10565b6116f2816121d5565b50806116fd8161309f565b91505061166f565b507f4c3f61bbac5dc8dc1f47677a57a23e312af5e0b7ce11ce20b40bb1ec82f8882233838360405161173993929190613118565b60405180910390a15050565b611750848484611b68565b6001600160a01b0383163b151580156117725750611770848484846121e0565b155b15611790576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600e602052600090815260409020805461103690612f01565b6000836117be575060006118ae565b60006117c9866122d4565b6001600160401b031690508085101580156118665750611866848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506013546040516bffffffffffffffffffffffff1960608d901b166020820152601d60f91b6034820152603581018b90529092506055019050604051602081830303815290604052805190602001206122ff565b6118a05760405162461bcd60e51b815260206004820152600b60248201526a1d995c9a599e4819985a5b60aa1b6044820152606401610c10565b6118aa8186613017565b9150505b949350505050565b60606118c182611ad3565b6118de57604051630a14c4b560e41b815260040160405180910390fd5b60006118e8612315565b90508051600014156119095760405180602001604052806000815250611934565b8061191384612324565b604051602001611924929190613146565b6040516020818303038152906040525b9392505050565b6001600160a01b038116600090815260056020526040812054600160401b90046001600160401b0316610a43565b6008546001600160a01b031633146119935760405162461bcd60e51b8152600401610c1090612f3c565b8281146119cc5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b6044820152606401610c10565b60005b83811015611a3157611a1f8585838181106119ec576119ec613089565b9050602002016020810190611a019190612aaf565b848484818110611a1357611a13613089565b905060200201356111b3565b80611a298161309f565b9150506119cf565b5050505050565b6008546001600160a01b03163314611a625760405162461bcd60e51b8152600401610c1090612f3c565b6001600160a01b038116611ac75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c10565b611ad0816120e1565b50565b600081600111158015611ae7575060005482105b8015610a43575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b7382611fba565b9050836001600160a01b031681600001516001600160a01b031614611baa5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611bc85750611bc8853361091a565b80611be3575033611bd884610adb565b6001600160a01b0316145b905080611c0357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611c2a57604051633a954ecd60e21b815260040160405180910390fd5b611c378585856001612421565b611c4360008487611b0c565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611d17576000548214611d1757805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061325f83398151915260405160405180910390a4611a31565b600854600160a01b900460ff16611d9e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c10565b6008805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b8260106000828254611dfd9190612fe0565b92505081905550611e12836012548484612464565b611e1c33846121bb565b7f7f9c8931cfbc299ecaa11e741eec91343b38cacaead98eb6c607394cbf30652f33846012548585604051611e55959493929190613175565b60405180910390a1505050565b80341015611ea35760405162461bcd60e51b815260206004820152600e60248201526d0dcdee840cadcdeeaced0408aa8960931b6044820152606401610c10565b80341115611ad057336108fc611eb98334613017565b6040518115909202916000818181858888f19350505050158015611252573d6000803e3d6000fd5b8260106000828254611ef39190612fe0565b925050819055508260146000828254611f0c9190612fe0565b90915550611f6990503384611f20826122d4565b611f2a91906131ae565b6001600160a01b03909116600090815260056020526040902080546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b611f77836017548484612464565b611f8133846121bb565b7f3aedaf0943c081b563cedc91a17e2e77eed3cb6b83574b8a933d23bee44744ab33846017548585604051611e55959493929190613175565b60408051606081018252600080825260208201819052918101919091528180600111158015611fea575060005481105b156120c857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120c65780516001600160a01b03161561205d579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156120c1579392505050565b61205d565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600854600160a01b900460ff16156121805760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c10565b6008805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611dce3390565b6112528282604051806020016040528060008152506124e7565b611ad08160006124f4565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906122159033908990889088906004016131d0565b602060405180830381600087803b15801561222f57600080fd5b505af192505050801561225f575060408051601f3d908101601f1916820190925261225c91810190613203565b60015b6122ba573d80801561228d576040519150601f19603f3d011682016040523d82523d6000602084013e612292565b606091505b5080516122b2576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118ae565b6001600160a01b0316600090815260056020526040902054600160c01b90046001600160401b031690565b60008261230c85846126b5565b14949350505050565b6060600a8054610a5890612f01565b6060816123485750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612372578061235c8161309f565b915061236b9050600a83613236565b915061234c565b6000816001600160401b0381111561238c5761238c612d2e565b6040519080825280601f01601f1916602001820160405280156123b6576020820181803683370190505b5090505b84156118ae576123cb600183613017565b91506123d8600a8661324a565b6123e3906030612fe0565b60f81b8183815181106123f8576123f8613089565b60200101906001600160f81b031916908160001a90535061241a600a86613236565b94506123ba565b600854600160a01b900460ff16156117905760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606401610c10565b60008054906124738683612fe0565b90506000601a54426124859190612fe0565b90505b600083815260186020908152604080832089905560198252808320849055600e90915290206124b89086866128dd565b50826124c38161309f565b9350508183141561248857601b548111156124de57601b8190555b50505050505050565b610ba88383836001612729565b60006124ff83611fba565b80519091508215612565576000336001600160a01b03831614806125285750612528823361091a565b8061254357503361253886610adb565b6001600160a01b0316145b90508061256357604051632ce44b5f60e11b815260040160405180910390fd5b505b612573816000866001612421565b61257f60008583611b0c565b6001600160a01b0380821660008181526005602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526004909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661267d57600054821461267d57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b0384169060008051602061325f833981519152908390a4505060018054810190555050565b600081815b84518110156127215760008582815181106126d7576126d7613089565b602002602001015190508083116126fd576000838152602082905260409020925061270e565b600081815260208490526040902092505b50806127198161309f565b9150506126ba565b509392505050565b6000546001600160a01b03851661275257604051622e076360e81b815260040160405180910390fd5b836127705760405163b562e8dd60e01b815260040160405180910390fd5b61277d6000868387612421565b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561282957506001600160a01b0387163b15155b156128a0575b60405182906001600160a01b0389169060009060008051602061325f833981519152908290a461286860008884806001019550886121e0565b612885576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561282f57826000541461289b57600080fd5b6128d4565b5b6040516001830192906001600160a01b0389169060009060008051602061325f833981519152908290a4808214156128a1575b50600055611a31565b8280546128e990612f01565b90600052602060002090601f01602090048101928261290b5760008555612951565b82601f106129245782800160ff19823516178555612951565b82800160010185558215612951579182015b82811115612951578235825591602001919060010190612936565b5061295d929150612961565b5090565b5b8082111561295d5760008155600101612962565b6001600160e01b031981168114611ad057600080fd5b60006020828403121561299e57600080fd5b813561193481612976565b60005b838110156129c45781810151838201526020016129ac565b838111156117905750506000910152565b600081518084526129ed8160208601602086016129a9565b601f01601f19169290920160200192915050565b60208152600061193460208301846129d5565b600060208284031215612a2657600080fd5b5035919050565b80356001600160a01b0381168114612a4457600080fd5b919050565b60008060408385031215612a5c57600080fd5b612a6583612a2d565b946020939093013593505050565b600080600060608486031215612a8857600080fd5b612a9184612a2d565b9250612a9f60208501612a2d565b9150604084013590509250925092565b600060208284031215612ac157600080fd5b61193482612a2d565b60008083601f840112612adc57600080fd5b5081356001600160401b03811115612af357600080fd5b6020830191508360208260051b8501011115612b0e57600080fd5b9250929050565b60008083601f840112612b2757600080fd5b5081356001600160401b03811115612b3e57600080fd5b602083019150836020828501011115612b0e57600080fd5b60008060008060008060808789031215612b6f57600080fd5b863595506020870135945060408701356001600160401b0380821115612b9457600080fd5b612ba08a838b01612aca565b90965094506060890135915080821115612bb957600080fd5b50612bc689828a01612b15565b979a9699509497509295939492505050565b60008060208385031215612beb57600080fd5b82356001600160401b03811115612c0157600080fd5b612c0d85828601612b15565b90969095509350505050565b80358015158114612a4457600080fd5b600060208284031215612c3b57600080fd5b61193482612c19565b60008060408385031215612c5757600080fd5b612c6083612a2d565b9150612c6e60208401612c19565b90509250929050565b60008060408385031215612c8a57600080fd5b82359150612c6e60208401612a2d565b60008060208385031215612cad57600080fd5b82356001600160401b03811115612cc357600080fd5b612c0d85828601612aca565b60008060008060008060008060006101208a8c031215612cee57600080fd5b505087359960208901359950604089013598606081013598506080810135975060a0810135965060c0810135955060e08101359450610100013592509050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612d5a57600080fd5b612d6385612a2d565b9350612d7160208601612a2d565b92506040850135915060608501356001600160401b0380821115612d9457600080fd5b818701915087601f830112612da857600080fd5b813581811115612dba57612dba612d2e565b604051601f8201601f19908116603f01168101908382118183101715612de257612de2612d2e565b816040528281528a6020848701011115612dfb57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060008060608587031215612e3557600080fd5b612e3e85612a2d565b93506020850135925060408501356001600160401b03811115612e6057600080fd5b612e6c87828801612aca565b95989497509550505050565b60008060408385031215612e8b57600080fd5b612e9483612a2d565b9150612c6e60208401612a2d565b60008060008060408587031215612eb857600080fd5b84356001600160401b0380821115612ecf57600080fd5b612edb88838901612aca565b90965094506020870135915080821115612ef457600080fd5b50612e6c87828801612aca565b600181811c90821680612f1557607f821691505b60208210811415612f3657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600890820152673737ba103ab9b2b960c11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612ff357612ff3612fca565b500190565b600081600019048311821515161561301257613012612fca565b500290565b60008282101561302957613029612fca565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038516815283602082015260606040820152600061307f60608301848661302e565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156130b3576130b3612fca565b5060010190565b81835260006001600160fb1b038311156130d357600080fd5b8260051b8083602087013760009401602001938452509192915050565b60018060a01b038516815283602082015260606040820152600061307f6060830184866130ba565b6001600160a01b038416815260406020820181905260009061313d90830184866130ba565b95945050505050565b600083516131588184602088016129a9565b83519083019061316c8183602088016129a9565b01949350505050565b60018060a01b03861681528460208201528360408201526080606082015260006131a360808301848661302e565b979650505050505050565b60006001600160401b0380831681851680830382111561316c5761316c612fca565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061307f908301846129d5565b60006020828403121561321557600080fd5b815161193481612976565b634e487b7160e01b600052601260045260246000fd5b60008261324557613245613220565b500490565b60008261325957613259613220565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d1fca989df07787a16719063e6bb0f44d8bb7abcddf69791312b0f01006f931e64736f6c63430008080033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e4000000000000000000000000000000000000000000000000000000006268b1b00000000000000000000000000000000000000000000000000023629135f6800024c852a0c31676ab8b57ca77e4bb7f6387adaa52c68dcaf9de3287b518cdb9b10000000000000000000000000000000000000000000000000000000062621a3000000000000000000000000000000000000000000000000000000000626825100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e68747470733a2f2f393936667562616f2e696f2f6d6574612e6a736f6e230000
-----Decoded View---------------
Arg [0] : baseURI_ (string): https://996fubao.io/meta.json#
Arg [1] : reservedAmount_ (uint256): 996
Arg [2] : publicAvailableAmount_ (uint256): 996
Arg [3] : publicStartTime_ (uint256): 1651028400
Arg [4] : publicPrice_ (uint256): 9960000000000000
Arg [5] : whiteListMerkleRoot_ (bytes32): 0x24c852a0c31676ab8b57ca77e4bb7f6387adaa52c68dcaf9de3287b518cdb9b1
Arg [6] : whiteListStartTime_ (uint256): 1650596400
Arg [7] : whiteListEndTime_ (uint256): 1650992400
Arg [8] : whiteListPrice_ (uint256): 0
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e4
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003e4
Arg [3] : 000000000000000000000000000000000000000000000000000000006268b1b0
Arg [4] : 0000000000000000000000000000000000000000000000000023629135f68000
Arg [5] : 24c852a0c31676ab8b57ca77e4bb7f6387adaa52c68dcaf9de3287b518cdb9b1
Arg [6] : 0000000000000000000000000000000000000000000000000000000062621a30
Arg [7] : 0000000000000000000000000000000000000000000000000000000062682510
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [10] : 68747470733a2f2f393936667562616f2e696f2f6d6574612e6a736f6e230000
Deployed Bytecode Sourcemap
340:11027:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4551:300:13;;;;;;;;;;-1:-1:-1;4551:300:13;;;;;:::i;:::-;;:::i;:::-;;;565:14:14;;558:22;540:41;;528:2;513:18;4551:300:13;;;;;;;;526:43:12;;;;;;;;;;;;;;;;;;;738:25:14;;;726:2;711:18;526:43:12;592:177:14;7579:98:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9035:200::-;;;;;;;;;;-1:-1:-1;9035:200:13;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1874:32:14;;;1856:51;;1844:2;1829:18;9035:200:13;1710:203:14;8612:362:13;;;;;;;;;;-1:-1:-1;8612:362:13;;;;;:::i;:::-;;:::i;:::-;;1381:28:12;;;;;;;;;;-1:-1:-1;1381:28:12;;;;-1:-1:-1;;;;;1381:28:12;;;3822:297:13;;;;;;;;;;-1:-1:-1;10932:1:12;4072:12:13;3866:7;4056:13;:28;-1:-1:-1;;4056:46:13;3822:297;;9874:164;;;;;;;;;;-1:-1:-1;9874:164:13;;;;;:::i;:::-;;:::i;10164:109:12:-;;;;;;;;;;-1:-1:-1;10164:109:12;;;;;:::i;:::-;;:::i;939:34::-;;;;;;;;;;;;;;;;1021:33;;;;;;;;;;;;;;;;1308:32;;;;;;;;;;;;;;;;10279:242;;;;;;;;;;;;;:::i;9496:63::-;;;;;;;;;;;;;:::i;10104:179:13:-;;;;;;;;;;-1:-1:-1;10104:179:13;;;;;:::i;:::-;;:::i;475:45:12:-;;;;;;;;;;;;516:4;475:45;;3929:1808;;;;;;:::i;:::-;;:::i;2455:98::-;;;;;;;;;;-1:-1:-1;2455:98:12;;;;;:::i;:::-;;:::i;1098:84:1:-;;;;;;;;;;-1:-1:-1;1168:7:1;;-1:-1:-1;;;1168:7:1;;;;1098:84;;840:30:12;;;;;;;;;;;;;;;;7394:123:13;;;;;;;;;;-1:-1:-1;7394:123:13;;;;;:::i;:::-;;:::i;1097:29:12:-;;;;;;;;;;;;;;;;424:21;;;;;;;;;;;;;:::i;4910:203:13:-;;;;;;;;;;-1:-1:-1;4910:203:13;;;;;:::i;:::-;;:::i;1668:101:0:-;;;;;;;;;;;;;:::i;8954:91:12:-;;;;;;;;;;-1:-1:-1;8954:91:12;;;;;:::i;:::-;;:::i;9431:59::-;;;;;;;;;;;;;:::i;8309:265::-;;;;;;;;;;-1:-1:-1;8309:265:12;;;;;:::i;:::-;;:::i;1036:85:0:-;;;;;;;;;;-1:-1:-1;1108:6:0;;-1:-1:-1;;;;;1108:6:0;1036:85;;7741:102:13;;;;;;;;;;;;;:::i;8919:28:12:-;;;;;;;;;;-1:-1:-1;8919:28:12;;;;-1:-1:-1;;;8919:28:12;;;;;;9302:282:13;;;;;;;;;;-1:-1:-1;9302:282:13;;;;;:::i;:::-;;:::i;9952:91:12:-;;;;;;;;;;-1:-1:-1;9996:7:12;4436:13:13;-1:-1:-1;;4436:31:13;9952:91:12;;3729:194;;;;;;;;;;-1:-1:-1;3729:194:12;;;;;:::i;:::-;;:::i;1266:36::-;;;;;;;;;;;;;;;;876:26;;;;;;;;;;;;;;;;7591:712;;;;;;;;;;-1:-1:-1;7591:712:12;;;;;:::i;:::-;;:::i;1346:29::-;;;;;;;;;;;;;;;;1209:51;;;;;;;;;;-1:-1:-1;1209:51:12;;;;;:::i;:::-;;;;;;;;;;;;;;2559:1164;;;;;;;;;;-1:-1:-1;2559:1164:12;;;;;:::i;:::-;;:::i;9051:357::-;;;;;;;;;;-1:-1:-1;9051:357:12;;;;;:::i;:::-;;:::i;10349:359:13:-;;;;;;;;;;-1:-1:-1;10349:359:13;;;;;:::i;:::-;;:::i;759:36:12:-;;;;;;;;;;;;;;;;678:48;;;;;;;;;;-1:-1:-1;678:48:12;;;;;:::i;:::-;;:::i;5743:595::-;;;;;;;;;;-1:-1:-1;5743:595:12;;;;;:::i;:::-;;:::i;7909:313:13:-;;;;;;;;;;-1:-1:-1;7909:313:13;;;;;:::i;:::-;;:::i;637:35:12:-;;;;;;;;;;;;;;;;10049:109;;;;;;;;;;-1:-1:-1;10049:109:12;;;;;:::i;:::-;;:::i;1060:31::-;;;;;;;;;;;;;;;;9650:162:13;;;;;;;;;;-1:-1:-1;9650:162:13;;;;;:::i;:::-;-1:-1:-1;;;;;9770:25:13;;;9747:4;9770:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9650:162;1154:49:12;;;;;;;;;;-1:-1:-1;1154:49:12;;;;;:::i;:::-;;;;;;;;;;;;;;8580:308;;;;;;;;;;-1:-1:-1;8580:308:12;;;;;:::i;:::-;;:::i;1918:198:0:-;;;;;;;;;;-1:-1:-1;1918:198:0;;;;;:::i;:::-;;:::i;602:29:12:-;;;;;;;;;;;;;;;;801:33;;;;;;;;;;;;;;;;979:36;;;;;;;;;;;;;;;;4551:300:13;4653:4;-1:-1:-1;;;;;;4688:40:13;;-1:-1:-1;;;4688:40:13;;:104;;-1:-1:-1;;;;;;;4744:48:13;;-1:-1:-1;;;4744:48:13;4688:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:10;;;4808:36:13;4669:175;4551:300;-1:-1:-1;;4551:300:13:o;7579:98::-;7633:13;7665:5;7658:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7579:98;:::o;9035:200::-;9103:7;9127:16;9135:7;9127;:16::i;:::-;9122:64;;9152:34;;-1:-1:-1;;;9152:34:13;;;;;;;;;;;9122:64;-1:-1:-1;9204:24:13;;;;:15;:24;;;;;;-1:-1:-1;;;;;9204:24:13;;9035:200::o;8612:362::-;8684:13;8700:24;8716:7;8700:15;:24::i;:::-;8684:40;;8744:5;-1:-1:-1;;;;;8738:11:13;:2;-1:-1:-1;;;;;8738:11:13;;8734:48;;;8758:24;;-1:-1:-1;;;8758:24:13;;;;;;;;;;;8734:48;719:10:7;-1:-1:-1;;;;;8797:21:13;;;;;;:63;;-1:-1:-1;8823:37:13;8840:5;719:10:7;9650:162:13;:::i;8823:37::-;8822:38;8797:63;8793:136;;;8883:35;;-1:-1:-1;;;8883:35:13;;;;;;;;;;;8793:136;8939:28;8948:2;8952:7;8961:5;8939:8;:28::i;:::-;8674:300;8612:362;;:::o;9874:164::-;10003:28;10013:4;10019:2;10023:7;10003:9;:28::i;10164:109:12:-;-1:-1:-1;;;;;5513:19:13;;10221:7:12;5513:19:13;;;:12;:19;;;;;:32;-1:-1:-1;;;5513:32:13;;-1:-1:-1;;;;;5513:32:13;10247:19:12;5418:135:13;10279:242:12;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;;;;;;;;;1744:1:2::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;10366:17:12::2;::::0;10347:15:::2;:36;;10339:63;;;::::0;-1:-1:-1;;;10339:63:12;;11346:2:14;10339:63:12::2;::::0;::::2;11328:21:14::0;11385:2;11365:18;;;11358:30;-1:-1:-1;;;11404:18:14;;;11397:44;11458:18;;10339:63:12::2;11144:338:14::0;10339:63:12::2;10431:49;::::0;10413:12:::2;::::0;10431:10:::2;::::0;10454:21:::2;::::0;10413:12;10431:49;10413:12;10431:49;10454:21;10431:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10412:68;;;10498:7;10490:24;;;;-1:-1:-1::0;;;10490:24:12::2;;;;;;11899:2:14::0;11881:21;;;11938:1;11918:18;;;11911:29;-1:-1:-1;;;11971:2:14;11956:18;;11949:34;12015:2;12000:18;;11697:327;10490:24:12::2;-1:-1:-1::0;1701:1:2::1;2628:7;:22:::0;10279:242:12:o;9496:63::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;9542:10:12::1;:8;:10::i;:::-;9496:63::o:0;10104:179:13:-;10237:39;10254:4;10260:2;10264:7;10237:39;;;;;;;;;;;;:16;:39::i;3929:1808:12:-;9892:9;9905:10;9892:23;9884:44;;;;-1:-1:-1;;;9884:44:12;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;4196:21:12::2;::::0;4165:18:::2;::::0;:27:::2;::::0;4186:6;;4165:27:::2;:::i;:::-;:52;;:133;;;;-1:-1:-1::0;4275:23:12::2;::::0;4251:10:::2;5251:7:13::0;5285:19;;;:12;:19;;;;;:32;4265:6:12;;-1:-1:-1;;;5285:32:13;;-1:-1:-1;;;;;5285:32:13;4237:34:12::2;;;;:::i;:::-;:61;;4165:133;4144:197;;;::::0;-1:-1:-1;;;4144:197:12;;12832:2:14;4144:197:12::2;::::0;::::2;12814:21:14::0;12871:2;12851:18;;;12844:30;-1:-1:-1;;;12890:18:14;;;12883:47;12947:18;;4144:197:12::2;12630:341:14::0;4144:197:12::2;4384:2;4359:27:::0;::::2;;4351:56;;;::::0;-1:-1:-1;;;4351:56:12;;13178:2:14;4351:56:12::2;::::0;::::2;13160:21:14::0;13217:2;13197:18;;;13190:30;-1:-1:-1;;;13236:18:14;;;13229:46;13292:18;;4351:56:12::2;12976:340:14::0;4351:56:12::2;4417:29;4496:18;;4477:15;:37;;:88;;;;;4549:16;;4530:15;:35;;4477:88;4460:307;;;4614:142;4656:10;4684:20;4722;;4614:24;:142::i;:::-;4590:166;;4460:307;4780:26:::0;4776:907:::2;;4866:15;;4847;:34;;4822:116;;;::::0;-1:-1:-1;;;4822:116:12;;13523:2:14;4822:116:12::2;::::0;::::2;13505:21:14::0;13562:2;13542:18;;;13535:30;13601:25;13581:18;;;13574:53;13644:18;;4822:116:12::2;13321:347:14::0;4822:116:12::2;4952:28;4964:6;4972:7;;4952:11;:28::i;:::-;4994:35;5017:11;;5008:6;:20;;;;:::i;:::-;4994:13;:35::i;:::-;4776:907;;;5074:21;5064:6;:31;5060:613;;5115:31;5130:6;5138:7;;5115:14;:31::i;:::-;5164:38;5187:14;;5178:6;:23;;;;:::i;5060:613::-;5241:20;5264:30;5273:21:::0;5264:6;:30:::2;:::i;:::-;5241:53;;5312:24;5354:11;;5339:12;:26;;;;:::i;:::-;5312:53;;5383:27;5457:14;;5413:21;:58;;;;:::i;:::-;5383:88;;5489:34;5501:12;5515:7;;5489:11;:34::i;:::-;5541:46;5556:21;5579:7;;5541:14;:46::i;:::-;5605:53;5619:38;5638:19:::0;5619:16;:38:::2;:::i;5605:53::-;5223:450;;;5060:613;5697:33;5702:10;5714:6;5722:7;;5697:33;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1701:1:2::1;2628:7;:22:::0;-1:-1:-1;;;;;3929:1808:12:o;2455:98::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;2528:18:12::1;:7;2538:8:::0;;2528:18:::1;:::i;7394:123:13:-:0;7458:7;7484:21;7497:7;7484:12;:21::i;:::-;:26;;7394:123;-1:-1:-1;;7394:123:13:o;424:21:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4910:203:13:-;4974:7;-1:-1:-1;;;;;4997:19:13;;4993:60;;5025:28;;-1:-1:-1;;;5025:28:13;;;;;;;;;;;4993:60;-1:-1:-1;;;;;;5078:19:13;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;5078:27:13;;4910:203::o;1668:101:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;8954:91:12:-:0;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;9018:8:12::1;:20:::0;;;::::1;;-1:-1:-1::0;;;9018:20:12::1;-1:-1:-1::0;;;;9018:20:12;;::::1;::::0;;;::::1;::::0;;8954:91::o;9431:59::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;9475:8:12::1;:6;:8::i;8309:265::-:0;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;8437:14:12::1;;8427:6;8404:20;;:29;;;;:::i;:::-;:47;;8383:111;;;::::0;-1:-1:-1;;;8383:111:12;;12832:2:14;8383:111:12::1;::::0;::::1;12814:21:14::0;12871:2;12851:18;;;12844:30;-1:-1:-1;;;12890:18:14;;;12883:47;12947:18;;8383:111:12::1;12630:341:14::0;8383:111:12::1;8528:6;8504:20;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;8544:23:12::1;::::0;-1:-1:-1;8554:4:12;8560:6;8544:9:::1;:23::i;:::-;8309:265:::0;;:::o;7741:102:13:-;7797:13;7829:7;7822:14;;;;;:::i;9302:282::-;-1:-1:-1;;;;;9400:24:13;;719:10:7;9400:24:13;9396:54;;;9433:17;;-1:-1:-1;;;9433:17:13;;;;;;;;;;;9396:54;719:10:7;9461:32:13;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9461:42:13;;;;;;;;;;;;:53;;-1:-1:-1;;9461:53:13;;;;;;;;;;9529:48;;540:41:14;;;9461:42:13;;719:10:7;9529:48:13;;513:18:14;9529:48:13;;;;;;;9302:282;;:::o;3729:194:12:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3848:12:12::1;:28:::0;;;;3886:13:::1;:30:::0;;-1:-1:-1;;;;;;3886:30:12::1;-1:-1:-1::0;;;;;3886:30:12;;::::1;::::0;;;::::1;::::0;;3729:194::o;7591:712::-;9892:9;9905:10;9892:23;9884:44;;;;-1:-1:-1;;;9884:44:12;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;7707:19:12::2;::::0;7736:411:::2;7756:19:::0;;::::2;7736:411;;;7796:15;7814:8;;7823:1;7814:11;;;;;;;:::i;:::-;;;;;;;7796:29;;7861:16;7869:7;7861;:16::i;:::-;-1:-1:-1::0;;;;;7847:30:12::2;:10;-1:-1:-1::0;;;;;7847:30:12::2;;7839:52;;;::::0;-1:-1:-1;;;7839:52:12;;15002:2:14;7839:52:12::2;::::0;::::2;14984:21:14::0;15041:1;15021:18;;;15014:29;-1:-1:-1;;;15059:18:14;;;15052:39;15108:18;;7839:52:12::2;14800:332:14::0;7839:52:12::2;7949:25;::::0;;;:16:::2;:25;::::0;;;;;7930:15:::2;:44;;7905:117;;;::::0;-1:-1:-1;;;7905:117:12;;15339:2:14;7905:117:12::2;::::0;::::2;15321:21:14::0;15378:2;15358:18;;;15351:30;-1:-1:-1;;;15397:18:14;;;15390:44;15451:18;;7905:117:12::2;15137:338:14::0;7905:117:12::2;8061:13;::::0;8036:48:::2;::::0;8049:10:::2;::::0;-1:-1:-1;;;;;8061:13:12::2;8076:7:::0;8036:12:::2;:48::i;:::-;8113:23;::::0;;;:14:::2;:23;::::0;;;;;8098:38:::2;::::0;;::::2;:::i;:::-;;;7782:365;7777:3;;;;;:::i;:::-;;;;7736:411;;;;8174:8;;:15;;8156:14;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;8199:41:12::2;::::0;8207:10:::2;::::0;8199:41;::::2;;;::::0;8228:11;;8199:41:::2;::::0;;;8228:11;8207:10;8199:41;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;8255;8262:10;8274:11;8287:8;;8255:41;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1701:1:2::1;2628:7;:22:::0;-1:-1:-1;7591:712:12:o;2559:1164::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;2977:14:12::1;;2958:15;:33;;:92;;;;;3030:20;;3011:15;:39;;2958:92;:159;;;;;3096:21;;3070:22;:47;;2958:159;:237;;;;-1:-1:-1::0;3163:32:12::1;3180:15:::0;516:4:::1;3163:32;:::i;:::-;3137:22;:58;;2958:237;:297;;;;;3238:17;3215:19;:40;;2958:297;2937:351;;;::::0;-1:-1:-1;;;2937:351:12;;16642:2:14;2937:351:12::1;::::0;::::1;16624:21:14::0;16681:1;16661:18;;;16654:29;-1:-1:-1;;;16699:18:14;;;16692:37;16746:18;;2937:351:12::1;16440:330:14::0;2937:351:12::1;3298:23;:50:::0;;;;3358:14:::1;:32:::0;;;;3400:21:::1;:46:::0;;;;3456:15:::1;:34:::0;;;;3500:11:::1;:26:::0;3536:19:::1;:42:::0;3588:18:::1;:40:::0;3638:16:::1;:36:::0;3684:14:::1;:32:::0;2559:1164::o;9051:357::-;9892:9;9905:10;9892:23;9884:44;;;;-1:-1:-1;;;9884:44:12;;;;;;;:::i;:::-;9132:8:::1;::::0;-1:-1:-1;;;9132:8:12;::::1;;;9124:33;;;::::0;-1:-1:-1;;;9124:33:12;;16977:2:14;9124:33:12::1;::::0;::::1;16959:21:14::0;17016:2;16996:18;;;16989:30;-1:-1:-1;;;17035:18:14;;;17028:42;17087:18;;9124:33:12::1;16775:336:14::0;9124:33:12::1;9172:9;9167:194;9187:19:::0;;::::1;9167:194;;;9227:15;9245:8;;9254:1;9245:11;;;;;;;:::i;:::-;;;;;;;9227:29;;9292:16;9300:7;9292;:16::i;:::-;-1:-1:-1::0;;;;;9278:30:12::1;:10;-1:-1:-1::0;;;;;9278:30:12::1;;9270:52;;;::::0;-1:-1:-1;;;9270:52:12;;15002:2:14;9270:52:12::1;::::0;::::1;14984:21:14::0;15041:1;15021:18;;;15014:29;-1:-1:-1;;;15059:18:14;;;15052:39;15108:18;;9270:52:12::1;14800:332:14::0;9270:52:12::1;9336:14;9342:7;9336:5;:14::i;:::-;-1:-1:-1::0;9208:3:12;::::1;::::0;::::1;:::i;:::-;;;;9167:194;;;;9375:26;9380:10;9392:8;;9375:26;;;;;;;;:::i;:::-;;;;;;;;9051:357:::0;;:::o;10349:359:13:-;10510:28;10520:4;10526:2;10530:7;10510:9;:28::i;:::-;-1:-1:-1;;;;;10552:13:13;;1465:19:6;:23;;10552:76:13;;;;;10572:56;10603:4;10609:2;10613:7;10622:5;10572:30;:56::i;:::-;10571:57;10552:76;10548:154;;;10651:40;;-1:-1:-1;;;10651:40:13;;;;;;;;;;;10548:154;10349:359;;;;:::o;678:48:12:-;;;;;;;;;;;;;;;;:::i;5743:595::-;5895:7;5918:16;5914:30;;-1:-1:-1;5943:1:12;5936:8;;5914:30;5954:20;5977:13;5985:4;5977:7;:13::i;:::-;-1:-1:-1;;;;;5954:36:12;;;6036:12;6021:11;:27;;:230;;;;;6068:183;6108:11;;6068:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6141:19:12;;6192:40;;-1:-1:-1;;17784:2:14;17780:15;;;17776:53;6192:40:12;;;17764:66:14;-1:-1:-1;;;17846:12:14;;;17839:25;17880:12;;;17873:28;;;6141:19:12;;-1:-1:-1;17917:12:14;;;-1:-1:-1;6192:40:12;;;;;;;;;;;;6182:51;;;;;;6068:18;:183::i;:::-;6000:288;;;;-1:-1:-1;;;6000:288:12;;18142:2:14;6000:288:12;;;18124:21:14;18181:2;18161:18;;;18154:30;-1:-1:-1;;;18200:18:14;;;18193:41;18251:18;;6000:288:12;17940:335:14;6000:288:12;6305:26;6319:12;6305:11;:26;:::i;:::-;6298:33;;;5743:595;;;;;;;:::o;7909:313:13:-;7982:13;8012:16;8020:7;8012;:16::i;:::-;8007:59;;8037:29;;-1:-1:-1;;;8037:29:13;;;;;;;;;;;8007:59;8077:21;8101:10;:8;:10::i;:::-;8077:34;;8134:7;8128:21;8153:1;8128:26;;:87;;;;;;;;;;;;;;;;;8181:7;8190:18;:7;:16;:18::i;:::-;8164:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8128:87;8121:94;7909:313;-1:-1:-1;;;7909:313:13:o;10049:109:12:-;-1:-1:-1;;;;;5285:19:13;;10106:7:12;5285:19:13;;;:12;:19;;;;;:32;-1:-1:-1;;;5285:32:13;;-1:-1:-1;;;;;5285:32:13;10132:19:12;5190:135:13;8580:308:12;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;8718:36:12;;::::1;8710:56;;;::::0;-1:-1:-1;;;8710:56:12;;16642:2:14;8710:56:12::1;::::0;::::1;16624:21:14::0;16681:1;16661:18;;;16654:29;-1:-1:-1;;;16699:18:14;;;16692:37;16746:18;;8710:56:12::1;16440:330:14::0;8710:56:12::1;8781:9;8776:106;8796:19:::0;;::::1;8776:106;;;8836:35;8844:8;;8853:1;8844:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8857:10;;8868:1;8857:13;;;;;;;:::i;:::-;;;;;;;8836:7;:35::i;:::-;8817:3:::0;::::1;::::0;::::1;:::i;:::-;;;;8776:106;;;;8580:308:::0;;;;:::o;1918:198:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:0;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:0;;18957:2:14;1998:73:0::1;::::0;::::1;18939:21:14::0;18996:2;18976:18;;;18969:30;19035:34;19015:18;;;19008:62;-1:-1:-1;;;19086:18:14;;;19079:36;19132:19;;1998:73:0::1;18755:402:14::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;10954:172:13:-;11011:4;11053:7;10932:1:12;11034:26:13;;:53;;;;;11074:13;;11064:7;:23;11034:53;:85;;;;-1:-1:-1;;11092:20:13;;;;:11;:20;;;;;:27;-1:-1:-1;;;11092:27:13;;;;11091:28;;10954:172::o;18894:189::-;19004:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;19004:29:13;-1:-1:-1;;;;;19004:29:13;;;;;;;;;19048:28;;19004:24;;19048:28;;;;;;;18894:189;;;:::o;13964:2082::-;14074:35;14112:21;14125:7;14112:12;:21::i;:::-;14074:59;;14170:4;-1:-1:-1;;;;;14148:26:13;:13;:18;;;-1:-1:-1;;;;;14148:26:13;;14144:67;;14183:28;;-1:-1:-1;;;14183:28:13;;;;;;;;;;;14144:67;14222:22;719:10:7;-1:-1:-1;;;;;14248:20:13;;;;:72;;-1:-1:-1;14284:36:13;14301:4;719:10:7;9650:162:13;:::i;14284:36::-;14248:124;;;-1:-1:-1;719:10:7;14336:20:13;14348:7;14336:11;:20::i;:::-;-1:-1:-1;;;;;14336:36:13;;14248:124;14222:151;;14389:17;14384:66;;14415:35;;-1:-1:-1;;;14415:35:13;;;;;;;;;;;14384:66;-1:-1:-1;;;;;14464:16:13;;14460:52;;14489:23;;-1:-1:-1;;;14489:23:13;;;;;;;;;;;14460:52;14523:43;14545:4;14551:2;14555:7;14564:1;14523:21;:43::i;:::-;14628:35;14645:1;14649:7;14658:4;14628:8;:35::i;:::-;-1:-1:-1;;;;;14953:18:13;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;14953:31:13;;;-1:-1:-1;;;;;14953:31:13;;;-1:-1:-1;;14953:31:13;;;;;;;14998:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;14998:29:13;;;;;;;;;;;15076:20;;;:11;:20;;;;;;15110:18;;-1:-1:-1;;;;;;15142:49:13;;;;-1:-1:-1;;;15175:15:13;15142:49;;;;;;;;;;15461:11;;15520:24;;;;;15562:13;;15076:20;;15520:24;;15562:13;15558:377;;15769:13;;15754:11;:28;15750:171;;15806:20;;15874:28;;;;-1:-1:-1;;;;;15848:54:13;-1:-1:-1;;;15848:54:13;-1:-1:-1;;;;;;15848:54:13;;;-1:-1:-1;;;;;15806:20:13;;15848:54;;;;15750:171;14929:1016;;;15979:7;15975:2;-1:-1:-1;;;;;15960:27:13;15969:4;-1:-1:-1;;;;;15960:27:13;-1:-1:-1;;;;;;;;;;;15960:27:13;;;;;;;;;15997:42;10349:359;2110:117:1;1168:7;;-1:-1:-1;;;1168:7:1;;;;1669:41;;;;-1:-1:-1;;;1669:41:1;;19364:2:14;1669:41:1;;;19346:21:14;19403:2;19383:18;;;19376:30;-1:-1:-1;;;19422:18:14;;;19415:50;19482:18;;1669:41:1;19162:344:14;1669:41:1;2168:7:::1;:15:::0;;-1:-1:-1;;;;2168:15:1::1;::::0;;2198:22:::1;719:10:7::0;2207:12:1::1;2198:22;::::0;-1:-1:-1;;;;;1874:32:14;;;1856:51;;1844:2;1829:18;2198:22:1::1;;;;;;;2110:117::o:0;6344:273:12:-;6446:6;6424:18;;:28;;;;;;;:::i;:::-;;;;;;;;6462:42;6475:6;6483:11;;6496:7;;6462:12;:42::i;:::-;6514:29;6524:10;6536:6;6514:9;:29::i;:::-;6558:52;6569:10;6581:6;6589:11;;6602:7;;6558:52;;;;;;;;;;:::i;:::-;;;;;;;;6344:273;;;:::o;10527:212::-;10604:5;10591:9;:18;;10583:45;;;;-1:-1:-1;;;10583:45:12;;20206:2:14;10583:45:12;;;20188:21:14;20245:2;20225:18;;;20218:30;-1:-1:-1;;;20264:18:14;;;20257:44;20318:18;;10583:45:12;20004:338:14;10583:45:12;10654:5;10642:9;:17;10638:95;;;10683:10;10675:47;10704:17;10716:5;10704:9;:17;:::i;:::-;10675:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6623:393;6728:6;6706:18;;:28;;;;;;;:::i;:::-;;;;;;;;6769:6;6744:21;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;6785:57:12;;-1:-1:-1;6793:10:12;6834:6;6805:19;6793:10;6805:7;:19::i;:::-;:36;;;;:::i;:::-;-1:-1:-1;;;;;6021:19:13;;;;;;;:12;:19;;;;;:29;;-1:-1:-1;;;;;6021:29:13;;;-1:-1:-1;;;6021:29:13;-1:-1:-1;;;;;6021:29:13;;;;;;;;;5958:99;6785:57:12;6852:45;6865:6;6873:14;;6889:7;;6852:12;:45::i;:::-;6907:29;6917:10;6929:6;6907:9;:29::i;:::-;6951:58;6965:10;6977:6;6985:14;;7001:7;;6951:58;;;;;;;;;;:::i;6253:1084:13:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6363:7:13;;10932:1:12;6409:23:13;;:47;;;;;6443:13;;6436:4;:20;6409:47;6405:868;;;6476:31;6510:17;;;:11;:17;;;;;;;;;6476:51;;;;;;;;;-1:-1:-1;;;;;6476:51:13;;;;-1:-1:-1;;;6476:51:13;;-1:-1:-1;;;;;6476:51:13;;;;;;;;-1:-1:-1;;;6476:51:13;;;;;;;;;;;;;;6545:714;;6594:14;;-1:-1:-1;;;;;6594:28:13;;6590:99;;6657:9;6253:1084;-1:-1:-1;;;6253:1084:13:o;6590:99::-;-1:-1:-1;;;7025:6:13;7069:17;;;;:11;:17;;;;;;;;;7057:29;;;;;;;;;-1:-1:-1;;;;;7057:29:13;;;;;-1:-1:-1;;;7057:29:13;;-1:-1:-1;;;;;7057:29:13;;;;;;;;-1:-1:-1;;;7057:29:13;;;;;;;;;;;;;7116:28;7112:107;;7183:9;6253:1084;-1:-1:-1;;;6253:1084:13:o;7112:107::-;6986:255;;;6458:815;6405:868;7299:31;;-1:-1:-1;;;7299:31:13;;;;;;;;;;;2270:187:0;2362:6;;;-1:-1:-1;;;;;2378:17:0;;;-1:-1:-1;;;;;;2378:17:0;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2333:124;2270:187;:::o;1863:115:1:-;1168:7;;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;20790:2:14;1403:38:1;;;20772:21:14;20829:2;20809:18;;;20802:30;-1:-1:-1;;;20848:18:14;;;20841:46;20904:18;;1403:38:1;20588:340:14;1403:38:1;1922:7:::1;:14:::0;;-1:-1:-1;;;;1922:14:1::1;-1:-1:-1::0;;;1922:14:1::1;::::0;;1951:20:::1;1958:12;719:10:7::0;;640:96;11132:102:13;11200:27;11210:2;11214:8;11200:27;;;;;;;;;;;;:9;:27::i;16124:87::-;16183:21;16189:7;16198:5;16183;:21::i;19564:650::-;19742:72;;-1:-1:-1;;;19742:72:13;;19722:4;;-1:-1:-1;;;;;19742:36:13;;;;;:72;;719:10:7;;19793:4:13;;19799:7;;19808:5;;19742:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19742:72:13;;;;;;;;-1:-1:-1;;19742:72:13;;;;;;;;;;;;:::i;:::-;;;19738:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19973:13:13;;19969:229;;20018:40;;-1:-1:-1;;;20018:40:13;;;;;;;;;;;19969:229;20158:6;20152:13;20143:6;20139:2;20135:15;20128:38;19738:470;-1:-1:-1;;;;;;19860:55:13;-1:-1:-1;;;19860:55:13;;-1:-1:-1;19853:62:13;;5666:110;-1:-1:-1;;;;;5746:19:13;5721:6;5746:19;;;:12;:19;;;;;:23;-1:-1:-1;;;5746:23:13;;-1:-1:-1;;;;;5746:23:13;;5666:110::o;862:184:9:-;983:4;1035;1006:25;1019:5;1026:4;1006:12;:25::i;:::-;:33;;862:184;-1:-1:-1;;;;862:184:9:o;10745:98:12:-;10797:13;10829:7;10822:14;;;;;:::i;328:703:8:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:8;;;;;;;;;;;;-1:-1:-1;;;627:10:8;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:8;;-1:-1:-1;773:2:8;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;-1:-1:-1;;;;;817:17:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:8;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:8;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:8;;;;;;;;-1:-1:-1;972:11:8;981:2;972:11;;:::i;:::-;;;844:150;;9565:265:12;1168:7:1;;-1:-1:-1;;;1168:7:1;;;;9803:9:12;9795:28;;;;-1:-1:-1;;;9795:28:12;;22257:2:14;9795:28:12;;;22239:21:14;22296:1;22276:18;;;22269:29;-1:-1:-1;;;22314:18:14;;;22307:36;22360:18;;9795:28:12;22055:329:14;7022:563:12;7148:13;7164;;;7206:14;7214:6;7164:13;7206:14;:::i;:::-;7187:33;;7230:15;7266:12;;7248:15;:30;;;;:::i;:::-;7230:48;;7288:197;7305:21;;;;:14;:21;;;;;;;;:29;;;7348:16;:23;;;;;:33;;;7395:14;:21;;;;;:31;;7419:7;;7395:31;:::i;:::-;-1:-1:-1;7440:7:12;;;;:::i;:::-;;;;7475:8;7466:5;:17;;7288:197;;7508:17;;7498:7;:27;7494:85;;;7541:17;:27;;;7494:85;7138:447;;;7022:563;;;;:::o;11585:157:13:-;11703:32;11709:2;11713:8;11723:5;11730:4;11703:5;:32::i;16428:2355::-;16507:35;16545:21;16558:7;16545:12;:21::i;:::-;16592:18;;16507:59;;-1:-1:-1;16621:284:13;;;;16654:22;719:10:7;-1:-1:-1;;;;;16680:20:13;;;;:76;;-1:-1:-1;16720:36:13;16737:4;719:10:7;9650:162:13;:::i;16720:36::-;16680:132;;;-1:-1:-1;719:10:7;16776:20:13;16788:7;16776:11;:20::i;:::-;-1:-1:-1;;;;;16776:36:13;;16680:132;16654:159;;16833:17;16828:66;;16859:35;;-1:-1:-1;;;16859:35:13;;;;;;;;;;;16828:66;16640:265;16621:284;16915:51;16937:4;16951:1;16955:7;16964:1;16915:21;:51::i;:::-;17028:35;17045:1;17049:7;17058:4;17028:8;:35::i;:::-;-1:-1:-1;;;;;17387:18:13;;;17353:31;17387:18;;;:12;:18;;;;;;;;17419:24;;-1:-1:-1;;;;;;;;;;17419:24:13;;;;;;;;;-1:-1:-1;;17419:24:13;;;;17457:29;;;;;17442:1;17457:29;;;;;;;;-1:-1:-1;;17457:29:13;;;;;;;;;;17616:20;;;:11;:20;;;;;;17650;;-1:-1:-1;;;;17717:15:13;17684:49;;;-1:-1:-1;;;17684:49:13;-1:-1:-1;;;;;;17684:49:13;;;;;;;;;;17747:22;-1:-1:-1;;;17747:22:13;;;18035:11;;;18094:24;;;;;18136:13;;17387:18;;18094:24;;18136:13;18132:377;;18343:13;;18328:11;:28;18324:171;;18380:20;;18448:28;;;;-1:-1:-1;;;;;18422:54:13;-1:-1:-1;;;18422:54:13;-1:-1:-1;;;;;;18422:54:13;;;-1:-1:-1;;;;;18380:20:13;;18422:54;;;;18324:171;-1:-1:-1;;18534:35:13;;18561:7;;-1:-1:-1;18557:1:13;;-1:-1:-1;;;;;;18534:35:13;;;-1:-1:-1;;;;;;;;;;;18534:35:13;18557:1;;18534:35;-1:-1:-1;;18752:12:13;:14;;;;;;-1:-1:-1;;16428:2355:13:o;1398:662:9:-;1481:7;1523:4;1481:7;1537:488;1561:5;:12;1557:1;:16;1537:488;;;1594:20;1617:5;1623:1;1617:8;;;;;;;;:::i;:::-;;;;;;;1594:31;;1659:12;1643;:28;1639:376;;2134:13;2182:15;;;2217:4;2210:15;;;2263:4;2247:21;;1769:57;;1639:376;;;2134:13;2182:15;;;2217:4;2210:15;;;2263:4;2247:21;;1943:57;;1639:376;-1:-1:-1;1575:3:9;;;;:::i;:::-;;;;1537:488;;;-1:-1:-1;2041:12:9;1398:662;-1:-1:-1;;;1398:662:9:o;11989:1733:13:-;12122:20;12145:13;-1:-1:-1;;;;;12172:16:13;;12168:48;;12197:19;;-1:-1:-1;;;12197:19:13;;;;;;;;;;;12168:48;12230:13;12226:44;;12252:18;;-1:-1:-1;;;12252:18:13;;;;;;;;;;;12226:44;12281:61;12311:1;12315:2;12319:12;12333:8;12281:21;:61::i;:::-;-1:-1:-1;;;;;12613:16:13;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;12671:49:13;;-1:-1:-1;;;;;12613:44:13;;;;;;;12671:49;;;-1:-1:-1;;;;;12613:44:13;;;;;;12671:49;;;;;;;;;;;;;;;;12735:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;12784:66:13;;;;-1:-1:-1;;;12834:15:13;12784:66;;;;;;;;;;12735:25;12928:23;;;12970:4;:23;;;;-1:-1:-1;;;;;;12978:13:13;;1465:19:6;:23;;12978:15:13;12966:628;;;13013:309;13043:38;;13068:12;;-1:-1:-1;;;;;13043:38:13;;;13060:1;;-1:-1:-1;;;;;;;;;;;13043:38:13;13060:1;;13043:38;13108:69;13147:1;13151:2;13155:14;;;;;;13171:5;13108:30;:69::i;:::-;13103:172;;13212:40;;-1:-1:-1;;;13212:40:13;;;;;;;;;;;13103:172;13317:3;13301:12;:19;;13013:309;;13401:12;13384:13;;:29;13380:43;;13415:8;;;13380:43;12966:628;;;13462:118;13492:40;;13517:14;;;;;-1:-1:-1;;;;;13492:40:13;;;13509:1;;-1:-1:-1;;;;;;;;;;;13492:40:13;13509:1;;13492:40;13575:3;13559:12;:19;;13462:118;;12966:628;-1:-1:-1;13607:13:13;:28;13655:60;10349:359;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:14;-1:-1:-1;;;;;;88:32:14;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:14;1004:16;;997:27;774:258::o;1037:::-;1079:3;1117:5;1111:12;1144:6;1139:3;1132:19;1160:63;1216:6;1209:4;1204:3;1200:14;1193:4;1186:5;1182:16;1160:63;:::i;:::-;1277:2;1256:15;-1:-1:-1;;1252:29:14;1243:39;;;;1284:4;1239:50;;1037:258;-1:-1:-1;;1037:258:14:o;1300:220::-;1449:2;1438:9;1431:21;1412:4;1469:45;1510:2;1499:9;1495:18;1487:6;1469:45;:::i;1525:180::-;1584:6;1637:2;1625:9;1616:7;1612:23;1608:32;1605:52;;;1653:1;1650;1643:12;1605:52;-1:-1:-1;1676:23:14;;1525:180;-1:-1:-1;1525:180:14:o;1918:173::-;1986:20;;-1:-1:-1;;;;;2035:31:14;;2025:42;;2015:70;;2081:1;2078;2071:12;2015:70;1918:173;;;:::o;2096:254::-;2164:6;2172;2225:2;2213:9;2204:7;2200:23;2196:32;2193:52;;;2241:1;2238;2231:12;2193:52;2264:29;2283:9;2264:29;:::i;:::-;2254:39;2340:2;2325:18;;;;2312:32;;-1:-1:-1;;;2096:254:14:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:186::-;2747:6;2800:2;2788:9;2779:7;2775:23;2771:32;2768:52;;;2816:1;2813;2806:12;2768:52;2839:29;2858:9;2839:29;:::i;3061:367::-;3124:8;3134:6;3188:3;3181:4;3173:6;3169:17;3165:27;3155:55;;3206:1;3203;3196:12;3155:55;-1:-1:-1;3229:20:14;;-1:-1:-1;;;;;3261:30:14;;3258:50;;;3304:1;3301;3294:12;3258:50;3341:4;3333:6;3329:17;3317:29;;3401:3;3394:4;3384:6;3381:1;3377:14;3369:6;3365:27;3361:38;3358:47;3355:67;;;3418:1;3415;3408:12;3355:67;3061:367;;;;;:::o;3433:348::-;3485:8;3495:6;3549:3;3542:4;3534:6;3530:17;3526:27;3516:55;;3567:1;3564;3557:12;3516:55;-1:-1:-1;3590:20:14;;-1:-1:-1;;;;;3622:30:14;;3619:50;;;3665:1;3662;3655:12;3619:50;3702:4;3694:6;3690:17;3678:29;;3754:3;3747:4;3738:6;3730;3726:19;3722:30;3719:39;3716:59;;;3771:1;3768;3761:12;3786:884;3911:6;3919;3927;3935;3943;3951;4004:3;3992:9;3983:7;3979:23;3975:33;3972:53;;;4021:1;4018;4011:12;3972:53;4057:9;4044:23;4034:33;;4114:2;4103:9;4099:18;4086:32;4076:42;;4169:2;4158:9;4154:18;4141:32;-1:-1:-1;;;;;4233:2:14;4225:6;4222:14;4219:34;;;4249:1;4246;4239:12;4219:34;4288:70;4350:7;4341:6;4330:9;4326:22;4288:70;:::i;:::-;4377:8;;-1:-1:-1;4262:96:14;-1:-1:-1;4465:2:14;4450:18;;4437:32;;-1:-1:-1;4481:16:14;;;4478:36;;;4510:1;4507;4500:12;4478:36;;4549:61;4602:7;4591:8;4580:9;4576:24;4549:61;:::i;:::-;3786:884;;;;-1:-1:-1;3786:884:14;;-1:-1:-1;3786:884:14;;4629:8;;3786:884;-1:-1:-1;;;3786:884:14:o;4675:411::-;4746:6;4754;4807:2;4795:9;4786:7;4782:23;4778:32;4775:52;;;4823:1;4820;4813:12;4775:52;4863:9;4850:23;-1:-1:-1;;;;;4888:6:14;4885:30;4882:50;;;4928:1;4925;4918:12;4882:50;4967:59;5018:7;5009:6;4998:9;4994:22;4967:59;:::i;:::-;5045:8;;4941:85;;-1:-1:-1;4675:411:14;-1:-1:-1;;;;4675:411:14:o;5091:160::-;5156:20;;5212:13;;5205:21;5195:32;;5185:60;;5241:1;5238;5231:12;5256:180;5312:6;5365:2;5353:9;5344:7;5340:23;5336:32;5333:52;;;5381:1;5378;5371:12;5333:52;5404:26;5420:9;5404:26;:::i;5441:254::-;5506:6;5514;5567:2;5555:9;5546:7;5542:23;5538:32;5535:52;;;5583:1;5580;5573:12;5535:52;5606:29;5625:9;5606:29;:::i;:::-;5596:39;;5654:35;5685:2;5674:9;5670:18;5654:35;:::i;:::-;5644:45;;5441:254;;;;;:::o;5700:::-;5768:6;5776;5829:2;5817:9;5808:7;5804:23;5800:32;5797:52;;;5845:1;5842;5835:12;5797:52;5881:9;5868:23;5858:33;;5910:38;5944:2;5933:9;5929:18;5910:38;:::i;5959:437::-;6045:6;6053;6106:2;6094:9;6085:7;6081:23;6077:32;6074:52;;;6122:1;6119;6112:12;6074:52;6162:9;6149:23;-1:-1:-1;;;;;6187:6:14;6184:30;6181:50;;;6227:1;6224;6217:12;6181:50;6266:70;6328:7;6319:6;6308:9;6304:22;6266:70;:::i;6401:730::-;6532:6;6540;6548;6556;6564;6572;6580;6588;6596;6649:3;6637:9;6628:7;6624:23;6620:33;6617:53;;;6666:1;6663;6656:12;6617:53;-1:-1:-1;;6689:23:14;;;6759:2;6744:18;;6731:32;;-1:-1:-1;6810:2:14;6795:18;;6782:32;;6861:2;6846:18;;6833:32;;-1:-1:-1;6912:3:14;6897:19;;6884:33;;-1:-1:-1;6964:3:14;6949:19;;6936:33;;-1:-1:-1;7016:3:14;7001:19;;6988:33;;-1:-1:-1;7068:3:14;7053:19;;7040:33;;-1:-1:-1;7120:3:14;7105:19;7092:33;;-1:-1:-1;6401:730:14;-1:-1:-1;6401:730:14:o;7136:127::-;7197:10;7192:3;7188:20;7185:1;7178:31;7228:4;7225:1;7218:15;7252:4;7249:1;7242:15;7268:1138;7363:6;7371;7379;7387;7440:3;7428:9;7419:7;7415:23;7411:33;7408:53;;;7457:1;7454;7447:12;7408:53;7480:29;7499:9;7480:29;:::i;:::-;7470:39;;7528:38;7562:2;7551:9;7547:18;7528:38;:::i;:::-;7518:48;;7613:2;7602:9;7598:18;7585:32;7575:42;;7668:2;7657:9;7653:18;7640:32;-1:-1:-1;;;;;7732:2:14;7724:6;7721:14;7718:34;;;7748:1;7745;7738:12;7718:34;7786:6;7775:9;7771:22;7761:32;;7831:7;7824:4;7820:2;7816:13;7812:27;7802:55;;7853:1;7850;7843:12;7802:55;7889:2;7876:16;7911:2;7907;7904:10;7901:36;;;7917:18;;:::i;:::-;7992:2;7986:9;7960:2;8046:13;;-1:-1:-1;;8042:22:14;;;8066:2;8038:31;8034:40;8022:53;;;8090:18;;;8110:22;;;8087:46;8084:72;;;8136:18;;:::i;:::-;8176:10;8172:2;8165:22;8211:2;8203:6;8196:18;8251:7;8246:2;8241;8237;8233:11;8229:20;8226:33;8223:53;;;8272:1;8269;8262:12;8223:53;8328:2;8323;8319;8315:11;8310:2;8302:6;8298:15;8285:46;8373:1;8368:2;8363;8355:6;8351:15;8347:24;8340:35;8394:6;8384:16;;;;;;;7268:1138;;;;;;;:::o;8411:579::-;8515:6;8523;8531;8539;8592:2;8580:9;8571:7;8567:23;8563:32;8560:52;;;8608:1;8605;8598:12;8560:52;8631:29;8650:9;8631:29;:::i;:::-;8621:39;;8707:2;8696:9;8692:18;8679:32;8669:42;;8762:2;8751:9;8747:18;8734:32;-1:-1:-1;;;;;8781:6:14;8778:30;8775:50;;;8821:1;8818;8811:12;8775:50;8860:70;8922:7;8913:6;8902:9;8898:22;8860:70;:::i;:::-;8411:579;;;;-1:-1:-1;8949:8:14;-1:-1:-1;;;;8411:579:14:o;8995:260::-;9063:6;9071;9124:2;9112:9;9103:7;9099:23;9095:32;9092:52;;;9140:1;9137;9130:12;9092:52;9163:29;9182:9;9163:29;:::i;:::-;9153:39;;9211:38;9245:2;9234:9;9230:18;9211:38;:::i;9260:773::-;9382:6;9390;9398;9406;9459:2;9447:9;9438:7;9434:23;9430:32;9427:52;;;9475:1;9472;9465:12;9427:52;9515:9;9502:23;-1:-1:-1;;;;;9585:2:14;9577:6;9574:14;9571:34;;;9601:1;9598;9591:12;9571:34;9640:70;9702:7;9693:6;9682:9;9678:22;9640:70;:::i;:::-;9729:8;;-1:-1:-1;9614:96:14;-1:-1:-1;9817:2:14;9802:18;;9789:32;;-1:-1:-1;9833:16:14;;;9830:36;;;9862:1;9859;9852:12;9830:36;;9901:72;9965:7;9954:8;9943:9;9939:24;9901:72;:::i;10038:380::-;10117:1;10113:12;;;;10160;;;10181:61;;10235:4;10227:6;10223:17;10213:27;;10181:61;10288:2;10280:6;10277:14;10257:18;10254:38;10251:161;;;10334:10;10329:3;10325:20;10322:1;10315:31;10369:4;10366:1;10359:15;10397:4;10394:1;10387:15;10251:161;;10038:380;;;:::o;10423:356::-;10625:2;10607:21;;;10644:18;;;10637:30;10703:34;10698:2;10683:18;;10676:62;10770:2;10755:18;;10423:356::o;10784:355::-;10986:2;10968:21;;;11025:2;11005:18;;;10998:30;11064:33;11059:2;11044:18;;11037:61;11130:2;11115:18;;10784:355::o;12029:331::-;12231:2;12213:21;;;12270:1;12250:18;;;12243:29;-1:-1:-1;;;12303:2:14;12288:18;;12281:38;12351:2;12336:18;;12029:331::o;12365:127::-;12426:10;12421:3;12417:20;12414:1;12407:31;12457:4;12454:1;12447:15;12481:4;12478:1;12471:15;12497:128;12537:3;12568:1;12564:6;12561:1;12558:13;12555:39;;;12574:18;;:::i;:::-;-1:-1:-1;12610:9:14;;12497:128::o;13673:168::-;13713:7;13779:1;13775;13771:6;13767:14;13764:1;13761:21;13756:1;13749:9;13742:17;13738:45;13735:71;;;13786:18;;:::i;:::-;-1:-1:-1;13826:9:14;;13673:168::o;13846:125::-;13886:4;13914:1;13911;13908:8;13905:34;;;13919:18;;:::i;:::-;-1:-1:-1;13956:9:14;;13846:125::o;13976:267::-;14065:6;14060:3;14053:19;14117:6;14110:5;14103:4;14098:3;14094:14;14081:43;-1:-1:-1;14169:1:14;14144:16;;;14162:4;14140:27;;;14133:38;;;;14225:2;14204:15;;;-1:-1:-1;;14200:29:14;14191:39;;;14187:50;;13976:267::o;14248:415::-;14492:1;14488;14483:3;14479:11;14475:19;14467:6;14463:32;14452:9;14445:51;14532:6;14527:2;14516:9;14512:18;14505:34;14575:2;14570;14559:9;14555:18;14548:30;14426:4;14595:62;14653:2;14642:9;14638:18;14630:6;14622;14595:62;:::i;:::-;14587:70;14248:415;-1:-1:-1;;;;;;14248:415:14:o;14668:127::-;14729:10;14724:3;14720:20;14717:1;14710:31;14760:4;14757:1;14750:15;14784:4;14781:1;14774:15;15480:135;15519:3;-1:-1:-1;;15540:17:14;;15537:43;;;15560:18;;:::i;:::-;-1:-1:-1;15607:1:14;15596:13;;15480:135::o;15620:354::-;15708:19;;;15690:3;-1:-1:-1;;;;;15739:31:14;;15736:51;;;15783:1;15780;15773:12;15736:51;15819:6;15816:1;15812:14;15871:8;15864:5;15857:4;15852:3;15848:14;15835:45;15948:1;15903:18;;15923:4;15899:29;15937:13;;;-1:-1:-1;15899:29:14;;15620:354;-1:-1:-1;;15620:354:14:o;15979:456::-;16253:1;16249;16244:3;16240:11;16236:19;16228:6;16224:32;16213:9;16206:51;16293:6;16288:2;16277:9;16273:18;16266:34;16336:2;16331;16320:9;16316:18;16309:30;16187:4;16356:73;16425:2;16414:9;16410:18;16402:6;16394;16356:73;:::i;17116:385::-;-1:-1:-1;;;;;17333:32:14;;17315:51;;17402:2;17397;17382:18;;17375:30;;;-1:-1:-1;;17422:73:14;;17476:18;;17468:6;17460;17422:73;:::i;:::-;17414:81;17116:385;-1:-1:-1;;;;;17116:385:14:o;18280:470::-;18459:3;18497:6;18491:13;18513:53;18559:6;18554:3;18547:4;18539:6;18535:17;18513:53;:::i;:::-;18629:13;;18588:16;;;;18651:57;18629:13;18588:16;18685:4;18673:17;;18651:57;:::i;:::-;18724:20;;18280:470;-1:-1:-1;;;;18280:470:14:o;19511:488::-;19783:1;19779;19774:3;19770:11;19766:19;19758:6;19754:32;19743:9;19736:51;19823:6;19818:2;19807:9;19803:18;19796:34;19866:6;19861:2;19850:9;19846:18;19839:34;19909:3;19904:2;19893:9;19889:18;19882:31;19717:4;19930:63;19988:3;19977:9;19973:19;19965:6;19957;19930:63;:::i;:::-;19922:71;19511:488;-1:-1:-1;;;;;;;19511:488:14:o;20347:236::-;20386:3;-1:-1:-1;;;;;20459:2:14;20456:1;20452:10;20489:2;20486:1;20482:10;20520:3;20516:2;20512:12;20507:3;20504:21;20501:47;;;20528:18;;:::i;20933:489::-;-1:-1:-1;;;;;21202:15:14;;;21184:34;;21254:15;;21249:2;21234:18;;21227:43;21301:2;21286:18;;21279:34;;;21349:3;21344:2;21329:18;;21322:31;;;21127:4;;21370:46;;21396:19;;21388:6;21370:46;:::i;21427:249::-;21496:6;21549:2;21537:9;21528:7;21524:23;21520:32;21517:52;;;21565:1;21562;21555:12;21517:52;21597:9;21591:16;21616:30;21640:5;21616:30;:::i;21681:127::-;21742:10;21737:3;21733:20;21730:1;21723:31;21773:4;21770:1;21763:15;21797:4;21794:1;21787:15;21813:120;21853:1;21879;21869:35;;21884:18;;:::i;:::-;-1:-1:-1;21918:9:14;;21813:120::o;21938:112::-;21970:1;21996;21986:35;;22001:18;;:::i;:::-;-1:-1:-1;22035:9:14;;21938:112::o
Swarm Source
ipfs://d1fca989df07787a16719063e6bb0f44d8bb7abcddf69791312b0f01006f931e
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.