ERC-721
Overview
Max Total Supply
4,898 M2M
Holders
98
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 M2MLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Mission2MarsNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-31 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Mission2Mars.sol //SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.4; contract Mission2MarsNFT is Ownable, ERC721A { using Strings for uint256; // The next token ID to be minted. string _baseTokenURI; uint256 public _price = 0.1 ether; // _paused is used to pause the contract in case of an emergency bool public _paused; uint256 public maxSupply = 10000; constructor(string memory baseURI) ERC721A("Mission 2 Mars NFT", "M2M") { _baseTokenURI = baseURI; } //Returns starting tokenId function _startTokenId() internal view virtual override returns (uint256) { return 1; } /** * @dev setPaused makes the contract paused or unpaused */ function setPaused(bool val) external onlyOwner { _paused = val; } /** * @dev change cost */ function setCost(uint256 _cost) external onlyOwner { _price = _cost; } /** * @dev _baseURI overides the Openzeppelin's ERC721 implementation which by default * returned an empty string for the baseURI */ function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory _uri) external onlyOwner { _baseTokenURI = _uri; } /** * @dev mint allows an user to mint max of 5 NFT. */ function mint(uint256 quantity) external payable { uint256 supply = totalSupply(); require(!_paused, "Contract currently paused"); require(supply + quantity <= maxSupply, "Exceed maximum supply"); require(msg.value == _price * quantity, "Ether sent is not correct"); require(quantity <= 5, "Exceed max mintable amount"); _mint(msg.sender, quantity); } function reserveNFTs(uint256 _amount) external onlyOwner { require(totalSupply() + _amount <= maxSupply, "Max supply reached"); _mint(msg.sender, _amount); } /** * @dev Get token URI * @param tokenId ID of the token to retrieve */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "URI query for nonexistent token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, Strings.toString(tokenId), ".json" ) ) : ""; } function withdraw() public onlyOwner { // address _owner = nftowner; uint256 amount = address(this).balance; (bool sent, ) = payable(owner()).call{value: amount}(""); require(sent, "Failed to send Ether"); } function withdrawERC20(address _erc20Address) public onlyOwner { IERC20 token = IERC20(_erc20Address); uint256 balance = token.balanceOf(address(this)); // Send the specified amount of the ERC20 token to the contract owner token.transfer(msg.sender, balance); } //aidrop users with NFTs function airdrop(address[] memory _users, uint256[] memory _amounts) external onlyOwner { for (uint256 i = 0; i < _users.length; i++) { _mint(_users[i], _amounts[i]); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"reserveNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20Address","type":"address"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405267016345785d8a0000600a55612710600c553480156200002357600080fd5b506040516200369638038062003696833981810160405281019062000049919062000342565b6040518060400160405280601281526020017f4d697373696f6e2032204d617273204e465400000000000000000000000000008152506040518060400160405280600381526020017f4d324d0000000000000000000000000000000000000000000000000000000000815250620000d5620000c96200013f60201b60201c565b6200014760201b60201c565b8160039080519060200190620000ed92919062000214565b5080600490805190602001906200010692919062000214565b50620001176200020b60201b60201c565b600181905550505080600990805190602001906200013792919062000214565b505062000517565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b828054620002229062000428565b90600052602060002090601f01602090048101928262000246576000855562000292565b82601f106200026157805160ff191683800117855562000292565b8280016001018555821562000292579182015b828111156200029157825182559160200191906001019062000274565b5b509050620002a19190620002a5565b5090565b5b80821115620002c0576000816000905550600101620002a6565b5090565b6000620002db620002d584620003bc565b62000393565b905082815260208101848484011115620002fa57620002f9620004f7565b5b62000307848285620003f2565b509392505050565b600082601f830112620003275762000326620004f2565b5b815162000339848260208601620002c4565b91505092915050565b6000602082840312156200035b576200035a62000501565b5b600082015167ffffffffffffffff8111156200037c576200037b620004fc565b5b6200038a848285016200030f565b91505092915050565b60006200039f620003b2565b9050620003ad82826200045e565b919050565b6000604051905090565b600067ffffffffffffffff821115620003da57620003d9620004c3565b5b620003e58262000506565b9050602081019050919050565b60005b8381101562000412578082015181840152602081019050620003f5565b8381111562000422576000848401525b50505050565b600060028204905060018216806200044157607f821691505b6020821081141562000458576200045762000494565b5b50919050565b620004698262000506565b810181811067ffffffffffffffff821117156200048b576200048a620004c3565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61316f80620005276000396000f3fe6080604052600436106101b75760003560e01c806367243482116100ec578063b88d4fde1161008a578063d5abeb0111610064578063d5abeb011461059f578063e985e9c5146105ca578063f2fde38b14610607578063f4f3b20014610630576101b7565b8063b88d4fde1461051d578063bc7df09114610539578063c87b56dd14610562576101b7565b80638da5cb5b116100c65780638da5cb5b1461048257806395d89b41146104ad578063a0712d68146104d8578063a22cb465146104f4576101b7565b8063672434821461040557806370a082311461042e578063715018a61461046b576101b7565b8063235b6ea11161015957806342842e0e1161013357806342842e0e1461035a57806344a0d68a1461037657806355f804b31461039f5780636352211e146103c8576101b7565b8063235b6ea1146102fc57806323b872dd146103275780633ccfd60b14610343576101b7565b8063095ea7b311610195578063095ea7b31461026157806316c38b3c1461027d57806316c61ccc146102a657806318160ddd146102d1576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de919061252c565b610659565b6040516101f0919061294e565b60405180910390f35b34801561020557600080fd5b5061020e6106eb565b60405161021b9190612969565b60405180910390f35b34801561023057600080fd5b5061024b600480360381019061024691906125cf565b61077d565b60405161025891906128be565b60405180910390f35b61027b6004803603810190610276919061241a565b6107fc565b005b34801561028957600080fd5b506102a4600480360381019061029f91906124d2565b610940565b005b3480156102b257600080fd5b506102bb610965565b6040516102c8919061294e565b60405180910390f35b3480156102dd57600080fd5b506102e6610978565b6040516102f39190612aab565b60405180910390f35b34801561030857600080fd5b5061031161098f565b60405161031e9190612aab565b60405180910390f35b610341600480360381019061033c9190612304565b610995565b005b34801561034f57600080fd5b50610358610cba565b005b610374600480360381019061036f9190612304565b610d7e565b005b34801561038257600080fd5b5061039d600480360381019061039891906125cf565b610d9e565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190612586565b610db0565b005b3480156103d457600080fd5b506103ef60048036038101906103ea91906125cf565b610dd2565b6040516103fc91906128be565b60405180910390f35b34801561041157600080fd5b5061042c6004803603810190610427919061245a565b610de4565b005b34801561043a57600080fd5b5061045560048036038101906104509190612297565b610e4e565b6040516104629190612aab565b60405180910390f35b34801561047757600080fd5b50610480610f07565b005b34801561048e57600080fd5b50610497610f1b565b6040516104a491906128be565b60405180910390f35b3480156104b957600080fd5b506104c2610f44565b6040516104cf9190612969565b60405180910390f35b6104f260048036038101906104ed91906125cf565b610fd6565b005b34801561050057600080fd5b5061051b600480360381019061051691906123da565b611123565b005b61053760048036038101906105329190612357565b61122e565b005b34801561054557600080fd5b50610560600480360381019061055b91906125cf565b6112a1565b005b34801561056e57600080fd5b50610589600480360381019061058491906125cf565b61130d565b6040516105969190612969565b60405180910390f35b3480156105ab57600080fd5b506105b46113b4565b6040516105c19190612aab565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec91906122c4565b6113ba565b6040516105fe919061294e565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190612297565b61144e565b005b34801561063c57600080fd5b5061065760048036038101906106529190612297565b6114d2565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106e45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546106fa90612d59565b80601f016020809104026020016040519081016040528092919081815260200182805461072690612d59565b80156107735780601f1061074857610100808354040283529160200191610773565b820191906000526020600020905b81548152906001019060200180831161075657829003601f168201915b5050505050905090565b6000610788826115ff565b6107be576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080782610dd2565b90508073ffffffffffffffffffffffffffffffffffffffff1661082861165e565b73ffffffffffffffffffffffffffffffffffffffff161461088b576108548161084f61165e565b6113ba565b61088a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610948611666565b80600b60006101000a81548160ff02191690831515021790555050565b600b60009054906101000a900460ff1681565b60006109826116e4565b6002546001540303905090565b600a5481565b60006109a0826116ed565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a07576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a13846117bb565b91509150610a298187610a2461165e565b6117e2565b610a7557610a3e86610a3961165e565b6113ba565b610a74576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610adc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ae98686866001611826565b8015610af457600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bc285610b9e88888761182c565b7c020000000000000000000000000000000000000000000000000000000017611854565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c4a576000600185019050600060056000838152602001908152602001600020541415610c48576001548114610c47578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cb2868686600161187f565b505050505050565b610cc2611666565b60004790506000610cd1610f1b565b73ffffffffffffffffffffffffffffffffffffffff1682604051610cf4906128a9565b60006040518083038185875af1925050503d8060008114610d31576040519150601f19603f3d011682016040523d82523d6000602084013e610d36565b606091505b5050905080610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d71906129cb565b60405180910390fd5b5050565b610d998383836040518060200160405280600081525061122e565b505050565b610da6611666565b80600a8190555050565b610db8611666565b8060099080519060200190610dce929190611f45565b5050565b6000610ddd826116ed565b9050919050565b610dec611666565b60005b8251811015610e4957610e36838281518110610e0e57610e0d612e92565b5b6020026020010151838381518110610e2957610e28612e92565b5b6020026020010151611885565b8080610e4190612dbc565b915050610def565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eb6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610f0f611666565b610f196000611a43565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610f5390612d59565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7f90612d59565b8015610fcc5780601f10610fa157610100808354040283529160200191610fcc565b820191906000526020600020905b815481529060010190602001808311610faf57829003601f168201915b5050505050905090565b6000610fe0610978565b9050600b60009054906101000a900460ff1615611032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102990612a2b565b60405180910390fd5b600c5482826110419190612bf3565b1115611082576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611079906129eb565b60405180910390fd5b81600a546110909190612c49565b34146110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c890612a4b565b60405180910390fd5b6005821115611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90612a8b565b60405180910390fd5b61111f3383611885565b5050565b806008600061113061165e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111dd61165e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611222919061294e565b60405180910390a35050565b611239848484610995565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461129b5761126484848484611b07565b61129a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6112a9611666565b600c54816112b5610978565b6112bf9190612bf3565b1115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790612a6b565b60405180910390fd5b61130a3382611885565b50565b6060611318826115ff565b611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e9061298b565b60405180910390fd5b6000611361611c67565b9050600081511161138157604051806020016040528060008152506113ac565b8061138b84611cf9565b60405160200161139c92919061287a565b6040516020818303038152906040525b915050919050565b600c5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611456611666565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd906129ab565b60405180910390fd5b6114cf81611a43565b50565b6114da611666565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161151a91906128be565b60206040518083038186803b15801561153257600080fd5b505afa158015611546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156a91906125fc565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016115a7929190612925565b602060405180830381600087803b1580156115c157600080fd5b505af11580156115d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f991906124ff565b50505050565b60008161160a6116e4565b11158015611619575060015482105b8015611657575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b61166e611dd1565b73ffffffffffffffffffffffffffffffffffffffff1661168c610f1b565b73ffffffffffffffffffffffffffffffffffffffff16146116e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d990612a0b565b60405180910390fd5b565b60006001905090565b600080829050806116fc6116e4565b11611784576001548110156117835760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611781575b600081141561177757600560008360019003935083815260200190815260200160002054905061174c565b80925050506117b6565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611843868684611dd9565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600154905060008214156118c7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118d46000848385611826565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061194b8361193c600086600061182c565b61194585611de2565b17611854565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146119ec57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506119b1565b506000821415611a28576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050611a3e600084838561187f565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b2d61165e565b8786866040518563ffffffff1660e01b8152600401611b4f94939291906128d9565b602060405180830381600087803b158015611b6957600080fd5b505af1925050508015611b9a57506040513d601f19601f82011682018060405250810190611b979190612559565b60015b611c14573d8060008114611bca576040519150601f19603f3d011682016040523d82523d6000602084013e611bcf565b606091505b50600081511415611c0c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611c7690612d59565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca290612d59565b8015611cef5780601f10611cc457610100808354040283529160200191611cef565b820191906000526020600020905b815481529060010190602001808311611cd257829003601f168201915b5050505050905090565b606060006001611d0884611df2565b01905060008167ffffffffffffffff811115611d2757611d26612ec1565b5b6040519080825280601f01601f191660200182016040528015611d595781602001600182028036833780820191505090505b509050600082602001820190505b600115611dc6578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611db057611daf612e34565b5b0494506000851415611dc157611dc6565b611d67565b819350505050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611e50577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611e4657611e45612e34565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611e8d576d04ee2d6d415b85acef81000000008381611e8357611e82612e34565b5b0492506020810190505b662386f26fc100008310611ebc57662386f26fc100008381611eb257611eb1612e34565b5b0492506010810190505b6305f5e1008310611ee5576305f5e1008381611edb57611eda612e34565b5b0492506008810190505b6127108310611f0a576127108381611f0057611eff612e34565b5b0492506004810190505b60648310611f2d5760648381611f2357611f22612e34565b5b0492506002810190505b600a8310611f3c576001810190505b80915050919050565b828054611f5190612d59565b90600052602060002090601f016020900481019282611f735760008555611fba565b82601f10611f8c57805160ff1916838001178555611fba565b82800160010185558215611fba579182015b82811115611fb9578251825591602001919060010190611f9e565b5b509050611fc79190611fcb565b5090565b5b80821115611fe4576000816000905550600101611fcc565b5090565b6000611ffb611ff684612aeb565b612ac6565b9050808382526020820190508285602086028201111561201e5761201d612ef5565b5b60005b8581101561204e5781612034888261214c565b845260208401935060208301925050600181019050612021565b5050509392505050565b600061206b61206684612b17565b612ac6565b9050808382526020820190508285602086028201111561208e5761208d612ef5565b5b60005b858110156120be57816120a4888261226d565b845260208401935060208301925050600181019050612091565b5050509392505050565b60006120db6120d684612b43565b612ac6565b9050828152602081018484840111156120f7576120f6612efa565b5b612102848285612d17565b509392505050565b600061211d61211884612b74565b612ac6565b90508281526020810184848401111561213957612138612efa565b5b612144848285612d17565b509392505050565b60008135905061215b816130dd565b92915050565b600082601f83011261217657612175612ef0565b5b8135612186848260208601611fe8565b91505092915050565b600082601f8301126121a4576121a3612ef0565b5b81356121b4848260208601612058565b91505092915050565b6000813590506121cc816130f4565b92915050565b6000815190506121e1816130f4565b92915050565b6000813590506121f68161310b565b92915050565b60008151905061220b8161310b565b92915050565b600082601f83011261222657612225612ef0565b5b81356122368482602086016120c8565b91505092915050565b600082601f83011261225457612253612ef0565b5b813561226484826020860161210a565b91505092915050565b60008135905061227c81613122565b92915050565b60008151905061229181613122565b92915050565b6000602082840312156122ad576122ac612f04565b5b60006122bb8482850161214c565b91505092915050565b600080604083850312156122db576122da612f04565b5b60006122e98582860161214c565b92505060206122fa8582860161214c565b9150509250929050565b60008060006060848603121561231d5761231c612f04565b5b600061232b8682870161214c565b935050602061233c8682870161214c565b925050604061234d8682870161226d565b9150509250925092565b6000806000806080858703121561237157612370612f04565b5b600061237f8782880161214c565b94505060206123908782880161214c565b93505060406123a18782880161226d565b925050606085013567ffffffffffffffff8111156123c2576123c1612eff565b5b6123ce87828801612211565b91505092959194509250565b600080604083850312156123f1576123f0612f04565b5b60006123ff8582860161214c565b9250506020612410858286016121bd565b9150509250929050565b6000806040838503121561243157612430612f04565b5b600061243f8582860161214c565b92505060206124508582860161226d565b9150509250929050565b6000806040838503121561247157612470612f04565b5b600083013567ffffffffffffffff81111561248f5761248e612eff565b5b61249b85828601612161565b925050602083013567ffffffffffffffff8111156124bc576124bb612eff565b5b6124c88582860161218f565b9150509250929050565b6000602082840312156124e8576124e7612f04565b5b60006124f6848285016121bd565b91505092915050565b60006020828403121561251557612514612f04565b5b6000612523848285016121d2565b91505092915050565b60006020828403121561254257612541612f04565b5b6000612550848285016121e7565b91505092915050565b60006020828403121561256f5761256e612f04565b5b600061257d848285016121fc565b91505092915050565b60006020828403121561259c5761259b612f04565b5b600082013567ffffffffffffffff8111156125ba576125b9612eff565b5b6125c68482850161223f565b91505092915050565b6000602082840312156125e5576125e4612f04565b5b60006125f38482850161226d565b91505092915050565b60006020828403121561261257612611612f04565b5b600061262084828501612282565b91505092915050565b61263281612ca3565b82525050565b61264181612cb5565b82525050565b600061265282612ba5565b61265c8185612bbb565b935061266c818560208601612d26565b61267581612f09565b840191505092915050565b600061268b82612bb0565b6126958185612bd7565b93506126a5818560208601612d26565b6126ae81612f09565b840191505092915050565b60006126c482612bb0565b6126ce8185612be8565b93506126de818560208601612d26565b80840191505092915050565b60006126f7601f83612bd7565b915061270282612f1a565b602082019050919050565b600061271a602683612bd7565b915061272582612f43565b604082019050919050565b600061273d601483612bd7565b915061274882612f92565b602082019050919050565b6000612760601583612bd7565b915061276b82612fbb565b602082019050919050565b6000612783600583612be8565b915061278e82612fe4565b600582019050919050565b60006127a6602083612bd7565b91506127b18261300d565b602082019050919050565b60006127c9601983612bd7565b91506127d482613036565b602082019050919050565b60006127ec601983612bd7565b91506127f78261305f565b602082019050919050565b600061280f600083612bcc565b915061281a82613088565b600082019050919050565b6000612832601283612bd7565b915061283d8261308b565b602082019050919050565b6000612855601a83612bd7565b9150612860826130b4565b602082019050919050565b61287481612d0d565b82525050565b600061288682856126b9565b915061289282846126b9565b915061289d82612776565b91508190509392505050565b60006128b482612802565b9150819050919050565b60006020820190506128d36000830184612629565b92915050565b60006080820190506128ee6000830187612629565b6128fb6020830186612629565b612908604083018561286b565b818103606083015261291a8184612647565b905095945050505050565b600060408201905061293a6000830185612629565b612947602083018461286b565b9392505050565b60006020820190506129636000830184612638565b92915050565b600060208201905081810360008301526129838184612680565b905092915050565b600060208201905081810360008301526129a4816126ea565b9050919050565b600060208201905081810360008301526129c48161270d565b9050919050565b600060208201905081810360008301526129e481612730565b9050919050565b60006020820190508181036000830152612a0481612753565b9050919050565b60006020820190508181036000830152612a2481612799565b9050919050565b60006020820190508181036000830152612a44816127bc565b9050919050565b60006020820190508181036000830152612a64816127df565b9050919050565b60006020820190508181036000830152612a8481612825565b9050919050565b60006020820190508181036000830152612aa481612848565b9050919050565b6000602082019050612ac0600083018461286b565b92915050565b6000612ad0612ae1565b9050612adc8282612d8b565b919050565b6000604051905090565b600067ffffffffffffffff821115612b0657612b05612ec1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612b3257612b31612ec1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612b5e57612b5d612ec1565b5b612b6782612f09565b9050602081019050919050565b600067ffffffffffffffff821115612b8f57612b8e612ec1565b5b612b9882612f09565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612bfe82612d0d565b9150612c0983612d0d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c3e57612c3d612e05565b5b828201905092915050565b6000612c5482612d0d565b9150612c5f83612d0d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c9857612c97612e05565b5b828202905092915050565b6000612cae82612ced565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612d44578082015181840152602081019050612d29565b83811115612d53576000848401525b50505050565b60006002820490506001821680612d7157607f821691505b60208210811415612d8557612d84612e63565b5b50919050565b612d9482612f09565b810181811067ffffffffffffffff82111715612db357612db2612ec1565b5b80604052505050565b6000612dc782612d0d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612dfa57612df9612e05565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f457863656564206d6178696d756d20737570706c790000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e74726163742063757272656e746c792070617573656400000000000000600082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b50565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f457863656564206d6178206d696e7461626c6520616d6f756e74000000000000600082015250565b6130e681612ca3565b81146130f157600080fd5b50565b6130fd81612cb5565b811461310857600080fd5b50565b61311481612cc1565b811461311f57600080fd5b50565b61312b81612d0d565b811461313657600080fd5b5056fea264697066735822122071852213b87e05d543fde7324b4379dbfc4cc131d717d8e12c1a106673d23c1964736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101b75760003560e01c806367243482116100ec578063b88d4fde1161008a578063d5abeb0111610064578063d5abeb011461059f578063e985e9c5146105ca578063f2fde38b14610607578063f4f3b20014610630576101b7565b8063b88d4fde1461051d578063bc7df09114610539578063c87b56dd14610562576101b7565b80638da5cb5b116100c65780638da5cb5b1461048257806395d89b41146104ad578063a0712d68146104d8578063a22cb465146104f4576101b7565b8063672434821461040557806370a082311461042e578063715018a61461046b576101b7565b8063235b6ea11161015957806342842e0e1161013357806342842e0e1461035a57806344a0d68a1461037657806355f804b31461039f5780636352211e146103c8576101b7565b8063235b6ea1146102fc57806323b872dd146103275780633ccfd60b14610343576101b7565b8063095ea7b311610195578063095ea7b31461026157806316c38b3c1461027d57806316c61ccc146102a657806318160ddd146102d1576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de919061252c565b610659565b6040516101f0919061294e565b60405180910390f35b34801561020557600080fd5b5061020e6106eb565b60405161021b9190612969565b60405180910390f35b34801561023057600080fd5b5061024b600480360381019061024691906125cf565b61077d565b60405161025891906128be565b60405180910390f35b61027b6004803603810190610276919061241a565b6107fc565b005b34801561028957600080fd5b506102a4600480360381019061029f91906124d2565b610940565b005b3480156102b257600080fd5b506102bb610965565b6040516102c8919061294e565b60405180910390f35b3480156102dd57600080fd5b506102e6610978565b6040516102f39190612aab565b60405180910390f35b34801561030857600080fd5b5061031161098f565b60405161031e9190612aab565b60405180910390f35b610341600480360381019061033c9190612304565b610995565b005b34801561034f57600080fd5b50610358610cba565b005b610374600480360381019061036f9190612304565b610d7e565b005b34801561038257600080fd5b5061039d600480360381019061039891906125cf565b610d9e565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190612586565b610db0565b005b3480156103d457600080fd5b506103ef60048036038101906103ea91906125cf565b610dd2565b6040516103fc91906128be565b60405180910390f35b34801561041157600080fd5b5061042c6004803603810190610427919061245a565b610de4565b005b34801561043a57600080fd5b5061045560048036038101906104509190612297565b610e4e565b6040516104629190612aab565b60405180910390f35b34801561047757600080fd5b50610480610f07565b005b34801561048e57600080fd5b50610497610f1b565b6040516104a491906128be565b60405180910390f35b3480156104b957600080fd5b506104c2610f44565b6040516104cf9190612969565b60405180910390f35b6104f260048036038101906104ed91906125cf565b610fd6565b005b34801561050057600080fd5b5061051b600480360381019061051691906123da565b611123565b005b61053760048036038101906105329190612357565b61122e565b005b34801561054557600080fd5b50610560600480360381019061055b91906125cf565b6112a1565b005b34801561056e57600080fd5b50610589600480360381019061058491906125cf565b61130d565b6040516105969190612969565b60405180910390f35b3480156105ab57600080fd5b506105b46113b4565b6040516105c19190612aab565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec91906122c4565b6113ba565b6040516105fe919061294e565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190612297565b61144e565b005b34801561063c57600080fd5b5061065760048036038101906106529190612297565b6114d2565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106e45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546106fa90612d59565b80601f016020809104026020016040519081016040528092919081815260200182805461072690612d59565b80156107735780601f1061074857610100808354040283529160200191610773565b820191906000526020600020905b81548152906001019060200180831161075657829003601f168201915b5050505050905090565b6000610788826115ff565b6107be576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080782610dd2565b90508073ffffffffffffffffffffffffffffffffffffffff1661082861165e565b73ffffffffffffffffffffffffffffffffffffffff161461088b576108548161084f61165e565b6113ba565b61088a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610948611666565b80600b60006101000a81548160ff02191690831515021790555050565b600b60009054906101000a900460ff1681565b60006109826116e4565b6002546001540303905090565b600a5481565b60006109a0826116ed565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a07576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a13846117bb565b91509150610a298187610a2461165e565b6117e2565b610a7557610a3e86610a3961165e565b6113ba565b610a74576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610adc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ae98686866001611826565b8015610af457600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bc285610b9e88888761182c565b7c020000000000000000000000000000000000000000000000000000000017611854565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c4a576000600185019050600060056000838152602001908152602001600020541415610c48576001548114610c47578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cb2868686600161187f565b505050505050565b610cc2611666565b60004790506000610cd1610f1b565b73ffffffffffffffffffffffffffffffffffffffff1682604051610cf4906128a9565b60006040518083038185875af1925050503d8060008114610d31576040519150601f19603f3d011682016040523d82523d6000602084013e610d36565b606091505b5050905080610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d71906129cb565b60405180910390fd5b5050565b610d998383836040518060200160405280600081525061122e565b505050565b610da6611666565b80600a8190555050565b610db8611666565b8060099080519060200190610dce929190611f45565b5050565b6000610ddd826116ed565b9050919050565b610dec611666565b60005b8251811015610e4957610e36838281518110610e0e57610e0d612e92565b5b6020026020010151838381518110610e2957610e28612e92565b5b6020026020010151611885565b8080610e4190612dbc565b915050610def565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eb6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610f0f611666565b610f196000611a43565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610f5390612d59565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7f90612d59565b8015610fcc5780601f10610fa157610100808354040283529160200191610fcc565b820191906000526020600020905b815481529060010190602001808311610faf57829003601f168201915b5050505050905090565b6000610fe0610978565b9050600b60009054906101000a900460ff1615611032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102990612a2b565b60405180910390fd5b600c5482826110419190612bf3565b1115611082576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611079906129eb565b60405180910390fd5b81600a546110909190612c49565b34146110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c890612a4b565b60405180910390fd5b6005821115611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90612a8b565b60405180910390fd5b61111f3383611885565b5050565b806008600061113061165e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111dd61165e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611222919061294e565b60405180910390a35050565b611239848484610995565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461129b5761126484848484611b07565b61129a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6112a9611666565b600c54816112b5610978565b6112bf9190612bf3565b1115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790612a6b565b60405180910390fd5b61130a3382611885565b50565b6060611318826115ff565b611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e9061298b565b60405180910390fd5b6000611361611c67565b9050600081511161138157604051806020016040528060008152506113ac565b8061138b84611cf9565b60405160200161139c92919061287a565b6040516020818303038152906040525b915050919050565b600c5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611456611666565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd906129ab565b60405180910390fd5b6114cf81611a43565b50565b6114da611666565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161151a91906128be565b60206040518083038186803b15801561153257600080fd5b505afa158015611546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156a91906125fc565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016115a7929190612925565b602060405180830381600087803b1580156115c157600080fd5b505af11580156115d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f991906124ff565b50505050565b60008161160a6116e4565b11158015611619575060015482105b8015611657575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b61166e611dd1565b73ffffffffffffffffffffffffffffffffffffffff1661168c610f1b565b73ffffffffffffffffffffffffffffffffffffffff16146116e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d990612a0b565b60405180910390fd5b565b60006001905090565b600080829050806116fc6116e4565b11611784576001548110156117835760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611781575b600081141561177757600560008360019003935083815260200190815260200160002054905061174c565b80925050506117b6565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611843868684611dd9565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600154905060008214156118c7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118d46000848385611826565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061194b8361193c600086600061182c565b61194585611de2565b17611854565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146119ec57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506119b1565b506000821415611a28576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050611a3e600084838561187f565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b2d61165e565b8786866040518563ffffffff1660e01b8152600401611b4f94939291906128d9565b602060405180830381600087803b158015611b6957600080fd5b505af1925050508015611b9a57506040513d601f19601f82011682018060405250810190611b979190612559565b60015b611c14573d8060008114611bca576040519150601f19603f3d011682016040523d82523d6000602084013e611bcf565b606091505b50600081511415611c0c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611c7690612d59565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca290612d59565b8015611cef5780601f10611cc457610100808354040283529160200191611cef565b820191906000526020600020905b815481529060010190602001808311611cd257829003601f168201915b5050505050905090565b606060006001611d0884611df2565b01905060008167ffffffffffffffff811115611d2757611d26612ec1565b5b6040519080825280601f01601f191660200182016040528015611d595781602001600182028036833780820191505090505b509050600082602001820190505b600115611dc6578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611db057611daf612e34565b5b0494506000851415611dc157611dc6565b611d67565b819350505050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611e50577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611e4657611e45612e34565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611e8d576d04ee2d6d415b85acef81000000008381611e8357611e82612e34565b5b0492506020810190505b662386f26fc100008310611ebc57662386f26fc100008381611eb257611eb1612e34565b5b0492506010810190505b6305f5e1008310611ee5576305f5e1008381611edb57611eda612e34565b5b0492506008810190505b6127108310611f0a576127108381611f0057611eff612e34565b5b0492506004810190505b60648310611f2d5760648381611f2357611f22612e34565b5b0492506002810190505b600a8310611f3c576001810190505b80915050919050565b828054611f5190612d59565b90600052602060002090601f016020900481019282611f735760008555611fba565b82601f10611f8c57805160ff1916838001178555611fba565b82800160010185558215611fba579182015b82811115611fb9578251825591602001919060010190611f9e565b5b509050611fc79190611fcb565b5090565b5b80821115611fe4576000816000905550600101611fcc565b5090565b6000611ffb611ff684612aeb565b612ac6565b9050808382526020820190508285602086028201111561201e5761201d612ef5565b5b60005b8581101561204e5781612034888261214c565b845260208401935060208301925050600181019050612021565b5050509392505050565b600061206b61206684612b17565b612ac6565b9050808382526020820190508285602086028201111561208e5761208d612ef5565b5b60005b858110156120be57816120a4888261226d565b845260208401935060208301925050600181019050612091565b5050509392505050565b60006120db6120d684612b43565b612ac6565b9050828152602081018484840111156120f7576120f6612efa565b5b612102848285612d17565b509392505050565b600061211d61211884612b74565b612ac6565b90508281526020810184848401111561213957612138612efa565b5b612144848285612d17565b509392505050565b60008135905061215b816130dd565b92915050565b600082601f83011261217657612175612ef0565b5b8135612186848260208601611fe8565b91505092915050565b600082601f8301126121a4576121a3612ef0565b5b81356121b4848260208601612058565b91505092915050565b6000813590506121cc816130f4565b92915050565b6000815190506121e1816130f4565b92915050565b6000813590506121f68161310b565b92915050565b60008151905061220b8161310b565b92915050565b600082601f83011261222657612225612ef0565b5b81356122368482602086016120c8565b91505092915050565b600082601f83011261225457612253612ef0565b5b813561226484826020860161210a565b91505092915050565b60008135905061227c81613122565b92915050565b60008151905061229181613122565b92915050565b6000602082840312156122ad576122ac612f04565b5b60006122bb8482850161214c565b91505092915050565b600080604083850312156122db576122da612f04565b5b60006122e98582860161214c565b92505060206122fa8582860161214c565b9150509250929050565b60008060006060848603121561231d5761231c612f04565b5b600061232b8682870161214c565b935050602061233c8682870161214c565b925050604061234d8682870161226d565b9150509250925092565b6000806000806080858703121561237157612370612f04565b5b600061237f8782880161214c565b94505060206123908782880161214c565b93505060406123a18782880161226d565b925050606085013567ffffffffffffffff8111156123c2576123c1612eff565b5b6123ce87828801612211565b91505092959194509250565b600080604083850312156123f1576123f0612f04565b5b60006123ff8582860161214c565b9250506020612410858286016121bd565b9150509250929050565b6000806040838503121561243157612430612f04565b5b600061243f8582860161214c565b92505060206124508582860161226d565b9150509250929050565b6000806040838503121561247157612470612f04565b5b600083013567ffffffffffffffff81111561248f5761248e612eff565b5b61249b85828601612161565b925050602083013567ffffffffffffffff8111156124bc576124bb612eff565b5b6124c88582860161218f565b9150509250929050565b6000602082840312156124e8576124e7612f04565b5b60006124f6848285016121bd565b91505092915050565b60006020828403121561251557612514612f04565b5b6000612523848285016121d2565b91505092915050565b60006020828403121561254257612541612f04565b5b6000612550848285016121e7565b91505092915050565b60006020828403121561256f5761256e612f04565b5b600061257d848285016121fc565b91505092915050565b60006020828403121561259c5761259b612f04565b5b600082013567ffffffffffffffff8111156125ba576125b9612eff565b5b6125c68482850161223f565b91505092915050565b6000602082840312156125e5576125e4612f04565b5b60006125f38482850161226d565b91505092915050565b60006020828403121561261257612611612f04565b5b600061262084828501612282565b91505092915050565b61263281612ca3565b82525050565b61264181612cb5565b82525050565b600061265282612ba5565b61265c8185612bbb565b935061266c818560208601612d26565b61267581612f09565b840191505092915050565b600061268b82612bb0565b6126958185612bd7565b93506126a5818560208601612d26565b6126ae81612f09565b840191505092915050565b60006126c482612bb0565b6126ce8185612be8565b93506126de818560208601612d26565b80840191505092915050565b60006126f7601f83612bd7565b915061270282612f1a565b602082019050919050565b600061271a602683612bd7565b915061272582612f43565b604082019050919050565b600061273d601483612bd7565b915061274882612f92565b602082019050919050565b6000612760601583612bd7565b915061276b82612fbb565b602082019050919050565b6000612783600583612be8565b915061278e82612fe4565b600582019050919050565b60006127a6602083612bd7565b91506127b18261300d565b602082019050919050565b60006127c9601983612bd7565b91506127d482613036565b602082019050919050565b60006127ec601983612bd7565b91506127f78261305f565b602082019050919050565b600061280f600083612bcc565b915061281a82613088565b600082019050919050565b6000612832601283612bd7565b915061283d8261308b565b602082019050919050565b6000612855601a83612bd7565b9150612860826130b4565b602082019050919050565b61287481612d0d565b82525050565b600061288682856126b9565b915061289282846126b9565b915061289d82612776565b91508190509392505050565b60006128b482612802565b9150819050919050565b60006020820190506128d36000830184612629565b92915050565b60006080820190506128ee6000830187612629565b6128fb6020830186612629565b612908604083018561286b565b818103606083015261291a8184612647565b905095945050505050565b600060408201905061293a6000830185612629565b612947602083018461286b565b9392505050565b60006020820190506129636000830184612638565b92915050565b600060208201905081810360008301526129838184612680565b905092915050565b600060208201905081810360008301526129a4816126ea565b9050919050565b600060208201905081810360008301526129c48161270d565b9050919050565b600060208201905081810360008301526129e481612730565b9050919050565b60006020820190508181036000830152612a0481612753565b9050919050565b60006020820190508181036000830152612a2481612799565b9050919050565b60006020820190508181036000830152612a44816127bc565b9050919050565b60006020820190508181036000830152612a64816127df565b9050919050565b60006020820190508181036000830152612a8481612825565b9050919050565b60006020820190508181036000830152612aa481612848565b9050919050565b6000602082019050612ac0600083018461286b565b92915050565b6000612ad0612ae1565b9050612adc8282612d8b565b919050565b6000604051905090565b600067ffffffffffffffff821115612b0657612b05612ec1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612b3257612b31612ec1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612b5e57612b5d612ec1565b5b612b6782612f09565b9050602081019050919050565b600067ffffffffffffffff821115612b8f57612b8e612ec1565b5b612b9882612f09565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612bfe82612d0d565b9150612c0983612d0d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c3e57612c3d612e05565b5b828201905092915050565b6000612c5482612d0d565b9150612c5f83612d0d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c9857612c97612e05565b5b828202905092915050565b6000612cae82612ced565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612d44578082015181840152602081019050612d29565b83811115612d53576000848401525b50505050565b60006002820490506001821680612d7157607f821691505b60208210811415612d8557612d84612e63565b5b50919050565b612d9482612f09565b810181811067ffffffffffffffff82111715612db357612db2612ec1565b5b80604052505050565b6000612dc782612d0d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612dfa57612df9612e05565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f457863656564206d6178696d756d20737570706c790000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e74726163742063757272656e746c792070617573656400000000000000600082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b50565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f457863656564206d6178206d696e7461626c6520616d6f756e74000000000000600082015250565b6130e681612ca3565b81146130f157600080fd5b50565b6130fd81612cb5565b811461310857600080fd5b50565b61311481612cc1565b811461311f57600080fd5b50565b61312b81612d0d565b811461313657600080fd5b5056fea264697066735822122071852213b87e05d543fde7324b4379dbfc4cc131d717d8e12c1a106673d23c1964736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string):
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
73210:3484:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21283:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22185:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28676:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28109:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73884:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73475:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17936:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73363:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32315:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75866:248;;;;;;;;;;;;;:::i;:::-;;35236:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74015:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74385:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23578:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76462:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19120:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72289:103;;;;;;;;;;;;;:::i;:::-;;71641:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22361:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74564:412;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29234:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36027:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74984:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75268:590;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73501:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29625:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72547:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76122:302;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21283:639;21368:4;21707:10;21692:25;;:11;:25;;;;:102;;;;21784:10;21769:25;;:11;:25;;;;21692:102;:179;;;;21861:10;21846:25;;:11;:25;;;;21692:179;21672:199;;21283:639;;;:::o;22185:100::-;22239:13;22272:5;22265:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22185:100;:::o;28676:218::-;28752:7;28777:16;28785:7;28777;:16::i;:::-;28772:64;;28802:34;;;;;;;;;;;;;;28772:64;28856:15;:24;28872:7;28856:24;;;;;;;;;;;:30;;;;;;;;;;;;28849:37;;28676:218;;;:::o;28109:408::-;28198:13;28214:16;28222:7;28214;:16::i;:::-;28198:32;;28270:5;28247:28;;:19;:17;:19::i;:::-;:28;;;28243:175;;28295:44;28312:5;28319:19;:17;:19::i;:::-;28295:16;:44::i;:::-;28290:128;;28367:35;;;;;;;;;;;;;;28290:128;28243:175;28463:2;28430:15;:24;28446:7;28430:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;28501:7;28497:2;28481:28;;28490:5;28481:28;;;;;;;;;;;;28187:330;28109:408;;:::o;73884:80::-;71527:13;:11;:13::i;:::-;73953:3:::1;73943:7;;:13;;;;;;;;;;;;;;;;;;73884:80:::0;:::o;73475:19::-;;;;;;;;;;;;;:::o;17936:323::-;17997:7;18225:15;:13;:15::i;:::-;18210:12;;18194:13;;:28;:46;18187:53;;17936:323;:::o;73363:33::-;;;;:::o;32315:2825::-;32457:27;32487;32506:7;32487:18;:27::i;:::-;32457:57;;32572:4;32531:45;;32547:19;32531:45;;;32527:86;;32585:28;;;;;;;;;;;;;;32527:86;32627:27;32656:23;32683:35;32710:7;32683:26;:35::i;:::-;32626:92;;;;32818:68;32843:15;32860:4;32866:19;:17;:19::i;:::-;32818:24;:68::i;:::-;32813:180;;32906:43;32923:4;32929:19;:17;:19::i;:::-;32906:16;:43::i;:::-;32901:92;;32958:35;;;;;;;;;;;;;;32901:92;32813:180;33024:1;33010:16;;:2;:16;;;33006:52;;;33035:23;;;;;;;;;;;;;;33006:52;33071:43;33093:4;33099:2;33103:7;33112:1;33071:21;:43::i;:::-;33207:15;33204:160;;;33347:1;33326:19;33319:30;33204:160;33744:18;:24;33763:4;33744:24;;;;;;;;;;;;;;;;33742:26;;;;;;;;;;;;33813:18;:22;33832:2;33813:22;;;;;;;;;;;;;;;;33811:24;;;;;;;;;;;34135:146;34172:2;34221:45;34236:4;34242:2;34246:19;34221:14;:45::i;:::-;14335:8;34193:73;34135:18;:146::i;:::-;34106:17;:26;34124:7;34106:26;;;;;;;;;;;:175;;;;34452:1;14335:8;34401:19;:47;:52;34397:627;;;34474:19;34506:1;34496:7;:11;34474:33;;34663:1;34629:17;:30;34647:11;34629:30;;;;;;;;;;;;:35;34625:384;;;34767:13;;34752:11;:28;34748:242;;34947:19;34914:17;:30;34932:11;34914:30;;;;;;;;;;;:52;;;;34748:242;34625:384;34455:569;34397:627;35071:7;35067:2;35052:27;;35061:4;35052:27;;;;;;;;;;;;35090:42;35111:4;35117:2;35121:7;35130:1;35090:20;:42::i;:::-;32446:2694;;;32315:2825;;;:::o;75866:248::-;71527:13;:11;:13::i;:::-;75953:14:::1;75970:21;75953:38;;76003:9;76026:7;:5;:7::i;:::-;76018:21;;76047:6;76018:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76002:56;;;76077:4;76069:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;75903:211;;75866:248::o:0;35236:193::-;35382:39;35399:4;35405:2;35409:7;35382:39;;;;;;;;;;;;:16;:39::i;:::-;35236:193;;;:::o;74015:84::-;71527:13;:11;:13::i;:::-;74086:5:::1;74077:6;:14;;;;74015:84:::0;:::o;74385:98::-;71527:13;:11;:13::i;:::-;74471:4:::1;74455:13;:20;;;;;;;;;;;;:::i;:::-;;74385:98:::0;:::o;23578:152::-;23650:7;23693:27;23712:7;23693:18;:27::i;:::-;23670:52;;23578:152;;;:::o;76462:229::-;71527:13;:11;:13::i;:::-;76589:9:::1;76584:100;76608:6;:13;76604:1;:17;76584:100;;;76643:29;76649:6;76656:1;76649:9;;;;;;;;:::i;:::-;;;;;;;;76660:8;76669:1;76660:11;;;;;;;;:::i;:::-;;;;;;;;76643:5;:29::i;:::-;76623:3;;;;;:::i;:::-;;;;76584:100;;;;76462:229:::0;;:::o;19120:233::-;19192:7;19233:1;19216:19;;:5;:19;;;19212:60;;;19244:28;;;;;;;;;;;;;;19212:60;13279:13;19290:18;:25;19309:5;19290:25;;;;;;;;;;;;;;;;:55;19283:62;;19120:233;;;:::o;72289:103::-;71527:13;:11;:13::i;:::-;72354:30:::1;72381:1;72354:18;:30::i;:::-;72289:103::o:0;71641:87::-;71687:7;71714:6;;;;;;;;;;;71707:13;;71641:87;:::o;22361:104::-;22417:13;22450:7;22443:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22361:104;:::o;74564:412::-;74624:14;74641:13;:11;:13::i;:::-;74624:30;;74674:7;;;;;;;;;;;74673:8;74665:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;74751:9;;74739:8;74730:6;:17;;;;:::i;:::-;:30;;74722:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;74827:8;74818:6;;:17;;;;:::i;:::-;74805:9;:30;74797:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74896:1;74884:8;:13;;74876:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;74941:27;74947:10;74959:8;74941:5;:27::i;:::-;74613:363;74564:412;:::o;29234:234::-;29381:8;29329:18;:39;29348:19;:17;:19::i;:::-;29329:39;;;;;;;;;;;;;;;:49;29369:8;29329:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;29441:8;29405:55;;29420:19;:17;:19::i;:::-;29405:55;;;29451:8;29405:55;;;;;;:::i;:::-;;;;;;;;29234:234;;:::o;36027:407::-;36202:31;36215:4;36221:2;36225:7;36202:12;:31::i;:::-;36266:1;36248:2;:14;;;:19;36244:183;;36287:56;36318:4;36324:2;36328:7;36337:5;36287:30;:56::i;:::-;36282:145;;36371:40;;;;;;;;;;;;;;36282:145;36244:183;36027:407;;;;:::o;74984:180::-;71527:13;:11;:13::i;:::-;75087:9:::1;;75076:7;75060:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;75052:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;75130:26;75136:10;75148:7;75130:5;:26::i;:::-;74984:180:::0;:::o;75268:590::-;75386:13;75425:16;75433:7;75425;:16::i;:::-;75417:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;75490:28;75521:10;:8;:10::i;:::-;75490:41;;75593:1;75568:14;75562:28;:32;:288;;;;;;;;;;;;;;;;;75686:14;75727:25;75744:7;75727:16;:25::i;:::-;75643:166;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75562:288;75542:308;;;75268:590;;;:::o;73501:32::-;;;;:::o;29625:164::-;29722:4;29746:18;:25;29765:5;29746:25;;;;;;;;;;;;;;;:35;29772:8;29746:35;;;;;;;;;;;;;;;;;;;;;;;;;29739:42;;29625:164;;;;:::o;72547:201::-;71527:13;:11;:13::i;:::-;72656:1:::1;72636:22;;:8;:22;;;;72628:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;72712:28;72731:8;72712:18;:28::i;:::-;72547:201:::0;:::o;76122:302::-;71527:13;:11;:13::i;:::-;76196:12:::1;76218:13;76196:36;;76243:15;76261:5;:15;;;76285:4;76261:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76243:48;;76381:5;:14;;;76396:10;76408:7;76381:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;76185:239;;76122:302:::0;:::o;30047:282::-;30112:4;30168:7;30149:15;:13;:15::i;:::-;:26;;:66;;;;;30202:13;;30192:7;:23;30149:66;:153;;;;;30301:1;14055:8;30253:17;:26;30271:7;30253:26;;;;;;;;;;;;:44;:49;30149:153;30129:173;;30047:282;;;:::o;52355:105::-;52415:7;52442:10;52435:17;;52355:105;:::o;71806:132::-;71881:12;:10;:12::i;:::-;71870:23;;:7;:5;:7::i;:::-;:23;;;71862:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71806:132::o;73696:101::-;73761:7;73788:1;73781:8;;73696:101;:::o;24733:1275::-;24800:7;24820:12;24835:7;24820:22;;24903:4;24884:15;:13;:15::i;:::-;:23;24880:1061;;24937:13;;24930:4;:20;24926:1015;;;24975:14;24992:17;:23;25010:4;24992:23;;;;;;;;;;;;24975:40;;25109:1;14055:8;25081:6;:24;:29;25077:845;;;25746:113;25763:1;25753:6;:11;25746:113;;;25806:17;:25;25824:6;;;;;;;25806:25;;;;;;;;;;;;25797:34;;25746:113;;;25892:6;25885:13;;;;;;25077:845;24952:989;24926:1015;24880:1061;25969:31;;;;;;;;;;;;;;24733:1275;;;;:::o;31210:485::-;31312:27;31341:23;31382:38;31423:15;:24;31439:7;31423:24;;;;;;;;;;;31382:65;;31600:18;31577:41;;31657:19;31651:26;31632:45;;31562:126;31210:485;;;:::o;30438:659::-;30587:11;30752:16;30745:5;30741:28;30732:37;;30912:16;30901:9;30897:32;30884:45;;31062:15;31051:9;31048:30;31040:5;31029:9;31026:20;31023:56;31013:66;;30438:659;;;;;:::o;37096:159::-;;;;;:::o;51664:311::-;51799:7;51819:16;14459:3;51845:19;:41;;51819:68;;14459:3;51913:31;51924:4;51930:2;51934:9;51913:10;:31::i;:::-;51905:40;;:62;;51898:69;;;51664:311;;;;;:::o;26556:450::-;26636:14;26804:16;26797:5;26793:28;26784:37;;26981:5;26967:11;26942:23;26938:41;26935:52;26928:5;26925:63;26915:73;;26556:450;;;;:::o;37920:158::-;;;;;:::o;39696:2966::-;39769:20;39792:13;;39769:36;;39832:1;39820:8;:13;39816:44;;;39842:18;;;;;;;;;;;;;;39816:44;39873:61;39903:1;39907:2;39911:12;39925:8;39873:21;:61::i;:::-;40417:1;13417:2;40387:1;:26;;40386:32;40374:8;:45;40348:18;:22;40367:2;40348:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;40696:139;40733:2;40787:33;40810:1;40814:2;40818:1;40787:14;:33::i;:::-;40754:30;40775:8;40754:20;:30::i;:::-;:66;40696:18;:139::i;:::-;40662:17;:31;40680:12;40662:31;;;;;;;;;;;:173;;;;40852:16;40883:11;40912:8;40897:12;:23;40883:37;;41433:16;41429:2;41425:25;41413:37;;41805:12;41765:8;41724:1;41662:25;41603:1;41542;41515:335;42176:1;42162:12;42158:20;42116:346;42217:3;42208:7;42205:16;42116:346;;42435:7;42425:8;42422:1;42395:25;42392:1;42389;42384:59;42270:1;42261:7;42257:15;42246:26;;42116:346;;;42120:77;42507:1;42495:8;:13;42491:45;;;42517:19;;;;;;;;;;;;;;42491:45;42569:3;42553:13;:19;;;;40122:2462;;42594:60;42623:1;42627:2;42631:12;42645:8;42594:20;:60::i;:::-;39758:2904;39696:2966;;:::o;72908:191::-;72982:16;73001:6;;;;;;;;;;;72982:25;;73027:8;73018:6;;:17;;;;;;;;;;;;;;;;;;73082:8;73051:40;;73072:8;73051:40;;;;;;;;;;;;72971:128;72908:191;:::o;38518:716::-;38681:4;38727:2;38702:45;;;38748:19;:17;:19::i;:::-;38769:4;38775:7;38784:5;38702:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38698:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39002:1;38985:6;:13;:18;38981:235;;;39031:40;;;;;;;;;;;;;;38981:235;39174:6;39168:13;39159:6;39155:2;39151:15;39144:38;38698:529;38871:54;;;38861:64;;;:6;:64;;;;38854:71;;;38518:716;;;;;;:::o;74263:114::-;74323:13;74356;74349:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74263:114;:::o;67619:716::-;67675:13;67726:14;67763:1;67743:17;67754:5;67743:10;:17::i;:::-;:21;67726:38;;67779:20;67813:6;67802:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67779:41;;67835:11;67964:6;67960:2;67956:15;67948:6;67944:28;67937:35;;68001:288;68008:4;68001:288;;;68033:5;;;;;;;;68175:8;68170:2;68163:5;68159:14;68154:30;68149:3;68141:44;68231:2;68222:11;;;;;;:::i;:::-;;;;;68265:1;68256:5;:10;68252:21;;;68268:5;;68252:21;68001:288;;;68310:6;68303:13;;;;;67619:716;;;:::o;70192:98::-;70245:7;70272:10;70265:17;;70192:98;:::o;51365:147::-;51502:6;51365:147;;;;;:::o;27108:324::-;27178:14;27411:1;27401:8;27398:15;27372:24;27368:46;27358:56;;27108:324;;;:::o;64485:922::-;64538:7;64558:14;64575:1;64558:18;;64625:6;64616:5;:15;64612:102;;64661:6;64652:15;;;;;;:::i;:::-;;;;;64696:2;64686:12;;;;64612:102;64741:6;64732:5;:15;64728:102;;64777:6;64768:15;;;;;;:::i;:::-;;;;;64812:2;64802:12;;;;64728:102;64857:6;64848:5;:15;64844:102;;64893:6;64884:15;;;;;;:::i;:::-;;;;;64928:2;64918:12;;;;64844:102;64973:5;64964;:14;64960:99;;65008:5;64999:14;;;;;;:::i;:::-;;;;;65042:1;65032:11;;;;64960:99;65086:5;65077;:14;65073:99;;65121:5;65112:14;;;;;;:::i;:::-;;;;;65155:1;65145:11;;;;65073:99;65199:5;65190;:14;65186:99;;65234:5;65225:14;;;;;;:::i;:::-;;;;;65268:1;65258:11;;;;65186:99;65312:5;65303;:14;65299:66;;65348:1;65338:11;;;;65299:66;65393:6;65386:13;;;64485:922;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3455:5;3486:6;3480:13;3471:22;;3502:30;3526:5;3502:30;:::i;:::-;3401:137;;;;:::o;3544:::-;3589:5;3627:6;3614:20;3605:29;;3643:32;3669:5;3643:32;:::i;:::-;3544:137;;;;:::o;3687:141::-;3743:5;3774:6;3768:13;3759:22;;3790:32;3816:5;3790:32;:::i;:::-;3687:141;;;;:::o;3847:338::-;3902:5;3951:3;3944:4;3936:6;3932:17;3928:27;3918:122;;3959:79;;:::i;:::-;3918:122;4076:6;4063:20;4101:78;4175:3;4167:6;4160:4;4152:6;4148:17;4101:78;:::i;:::-;4092:87;;3908:277;3847:338;;;;:::o;4205:340::-;4261:5;4310:3;4303:4;4295:6;4291:17;4287:27;4277:122;;4318:79;;:::i;:::-;4277:122;4435:6;4422:20;4460:79;4535:3;4527:6;4520:4;4512:6;4508:17;4460:79;:::i;:::-;4451:88;;4267:278;4205:340;;;;:::o;4551:139::-;4597:5;4635:6;4622:20;4613:29;;4651:33;4678:5;4651:33;:::i;:::-;4551:139;;;;:::o;4696:143::-;4753:5;4784:6;4778:13;4769:22;;4800:33;4827:5;4800:33;:::i;:::-;4696:143;;;;:::o;4845:329::-;4904:6;4953:2;4941:9;4932:7;4928:23;4924:32;4921:119;;;4959:79;;:::i;:::-;4921:119;5079:1;5104:53;5149:7;5140:6;5129:9;5125:22;5104:53;:::i;:::-;5094:63;;5050:117;4845:329;;;;:::o;5180:474::-;5248:6;5256;5305:2;5293:9;5284:7;5280:23;5276:32;5273:119;;;5311:79;;:::i;:::-;5273:119;5431:1;5456:53;5501:7;5492:6;5481:9;5477:22;5456:53;:::i;:::-;5446:63;;5402:117;5558:2;5584:53;5629:7;5620:6;5609:9;5605:22;5584:53;:::i;:::-;5574:63;;5529:118;5180:474;;;;;:::o;5660:619::-;5737:6;5745;5753;5802:2;5790:9;5781:7;5777:23;5773:32;5770:119;;;5808:79;;:::i;:::-;5770:119;5928:1;5953:53;5998:7;5989:6;5978:9;5974:22;5953:53;:::i;:::-;5943:63;;5899:117;6055:2;6081:53;6126:7;6117:6;6106:9;6102:22;6081:53;:::i;:::-;6071:63;;6026:118;6183:2;6209:53;6254:7;6245:6;6234:9;6230:22;6209:53;:::i;:::-;6199:63;;6154:118;5660:619;;;;;:::o;6285:943::-;6380:6;6388;6396;6404;6453:3;6441:9;6432:7;6428:23;6424:33;6421:120;;;6460:79;;:::i;:::-;6421:120;6580:1;6605:53;6650:7;6641:6;6630:9;6626:22;6605:53;:::i;:::-;6595:63;;6551:117;6707:2;6733:53;6778:7;6769:6;6758:9;6754:22;6733:53;:::i;:::-;6723:63;;6678:118;6835:2;6861:53;6906:7;6897:6;6886:9;6882:22;6861:53;:::i;:::-;6851:63;;6806:118;6991:2;6980:9;6976:18;6963:32;7022:18;7014:6;7011:30;7008:117;;;7044:79;;:::i;:::-;7008:117;7149:62;7203:7;7194:6;7183:9;7179:22;7149:62;:::i;:::-;7139:72;;6934:287;6285:943;;;;;;;:::o;7234:468::-;7299:6;7307;7356:2;7344:9;7335:7;7331:23;7327:32;7324:119;;;7362:79;;:::i;:::-;7324:119;7482:1;7507:53;7552:7;7543:6;7532:9;7528:22;7507:53;:::i;:::-;7497:63;;7453:117;7609:2;7635:50;7677:7;7668:6;7657:9;7653:22;7635:50;:::i;:::-;7625:60;;7580:115;7234:468;;;;;:::o;7708:474::-;7776:6;7784;7833:2;7821:9;7812:7;7808:23;7804:32;7801:119;;;7839:79;;:::i;:::-;7801:119;7959:1;7984:53;8029:7;8020:6;8009:9;8005:22;7984:53;:::i;:::-;7974:63;;7930:117;8086:2;8112:53;8157:7;8148:6;8137:9;8133:22;8112:53;:::i;:::-;8102:63;;8057:118;7708:474;;;;;:::o;8188:894::-;8306:6;8314;8363:2;8351:9;8342:7;8338:23;8334:32;8331:119;;;8369:79;;:::i;:::-;8331:119;8517:1;8506:9;8502:17;8489:31;8547:18;8539:6;8536:30;8533:117;;;8569:79;;:::i;:::-;8533:117;8674:78;8744:7;8735:6;8724:9;8720:22;8674:78;:::i;:::-;8664:88;;8460:302;8829:2;8818:9;8814:18;8801:32;8860:18;8852:6;8849:30;8846:117;;;8882:79;;:::i;:::-;8846:117;8987:78;9057:7;9048:6;9037:9;9033:22;8987:78;:::i;:::-;8977:88;;8772:303;8188:894;;;;;:::o;9088:323::-;9144:6;9193:2;9181:9;9172:7;9168:23;9164:32;9161:119;;;9199:79;;:::i;:::-;9161:119;9319:1;9344:50;9386:7;9377:6;9366:9;9362:22;9344:50;:::i;:::-;9334:60;;9290:114;9088:323;;;;:::o;9417:345::-;9484:6;9533:2;9521:9;9512:7;9508:23;9504:32;9501:119;;;9539:79;;:::i;:::-;9501:119;9659:1;9684:61;9737:7;9728:6;9717:9;9713:22;9684:61;:::i;:::-;9674:71;;9630:125;9417:345;;;;:::o;9768:327::-;9826:6;9875:2;9863:9;9854:7;9850:23;9846:32;9843:119;;;9881:79;;:::i;:::-;9843:119;10001:1;10026:52;10070:7;10061:6;10050:9;10046:22;10026:52;:::i;:::-;10016:62;;9972:116;9768:327;;;;:::o;10101:349::-;10170:6;10219:2;10207:9;10198:7;10194:23;10190:32;10187:119;;;10225:79;;:::i;:::-;10187:119;10345:1;10370:63;10425:7;10416:6;10405:9;10401:22;10370:63;:::i;:::-;10360:73;;10316:127;10101:349;;;;:::o;10456:509::-;10525:6;10574:2;10562:9;10553:7;10549:23;10545:32;10542:119;;;10580:79;;:::i;:::-;10542:119;10728:1;10717:9;10713:17;10700:31;10758:18;10750:6;10747:30;10744:117;;;10780:79;;:::i;:::-;10744:117;10885:63;10940:7;10931:6;10920:9;10916:22;10885:63;:::i;:::-;10875:73;;10671:287;10456:509;;;;:::o;10971:329::-;11030:6;11079:2;11067:9;11058:7;11054:23;11050:32;11047:119;;;11085:79;;:::i;:::-;11047:119;11205:1;11230:53;11275:7;11266:6;11255:9;11251:22;11230:53;:::i;:::-;11220:63;;11176:117;10971:329;;;;:::o;11306:351::-;11376:6;11425:2;11413:9;11404:7;11400:23;11396:32;11393:119;;;11431:79;;:::i;:::-;11393:119;11551:1;11576:64;11632:7;11623:6;11612:9;11608:22;11576:64;:::i;:::-;11566:74;;11522:128;11306:351;;;;:::o;11663:118::-;11750:24;11768:5;11750:24;:::i;:::-;11745:3;11738:37;11663:118;;:::o;11787:109::-;11868:21;11883:5;11868:21;:::i;:::-;11863:3;11856:34;11787:109;;:::o;11902:360::-;11988:3;12016:38;12048:5;12016:38;:::i;:::-;12070:70;12133:6;12128:3;12070:70;:::i;:::-;12063:77;;12149:52;12194:6;12189:3;12182:4;12175:5;12171:16;12149:52;:::i;:::-;12226:29;12248:6;12226:29;:::i;:::-;12221:3;12217:39;12210:46;;11992:270;11902:360;;;;:::o;12268:364::-;12356:3;12384:39;12417:5;12384:39;:::i;:::-;12439:71;12503:6;12498:3;12439:71;:::i;:::-;12432:78;;12519:52;12564:6;12559:3;12552:4;12545:5;12541:16;12519:52;:::i;:::-;12596:29;12618:6;12596:29;:::i;:::-;12591:3;12587:39;12580:46;;12360:272;12268:364;;;;:::o;12638:377::-;12744:3;12772:39;12805:5;12772:39;:::i;:::-;12827:89;12909:6;12904:3;12827:89;:::i;:::-;12820:96;;12925:52;12970:6;12965:3;12958:4;12951:5;12947:16;12925:52;:::i;:::-;13002:6;12997:3;12993:16;12986:23;;12748:267;12638:377;;;;:::o;13021:366::-;13163:3;13184:67;13248:2;13243:3;13184:67;:::i;:::-;13177:74;;13260:93;13349:3;13260:93;:::i;:::-;13378:2;13373:3;13369:12;13362:19;;13021:366;;;:::o;13393:::-;13535:3;13556:67;13620:2;13615:3;13556:67;:::i;:::-;13549:74;;13632:93;13721:3;13632:93;:::i;:::-;13750:2;13745:3;13741:12;13734:19;;13393:366;;;:::o;13765:::-;13907:3;13928:67;13992:2;13987:3;13928:67;:::i;:::-;13921:74;;14004:93;14093:3;14004:93;:::i;:::-;14122:2;14117:3;14113:12;14106:19;;13765:366;;;:::o;14137:::-;14279:3;14300:67;14364:2;14359:3;14300:67;:::i;:::-;14293:74;;14376:93;14465:3;14376:93;:::i;:::-;14494:2;14489:3;14485:12;14478:19;;14137:366;;;:::o;14509:400::-;14669:3;14690:84;14772:1;14767:3;14690:84;:::i;:::-;14683:91;;14783:93;14872:3;14783:93;:::i;:::-;14901:1;14896:3;14892:11;14885:18;;14509:400;;;:::o;14915:366::-;15057:3;15078:67;15142:2;15137:3;15078:67;:::i;:::-;15071:74;;15154:93;15243:3;15154:93;:::i;:::-;15272:2;15267:3;15263:12;15256:19;;14915:366;;;:::o;15287:::-;15429:3;15450:67;15514:2;15509:3;15450:67;:::i;:::-;15443:74;;15526:93;15615:3;15526:93;:::i;:::-;15644:2;15639:3;15635:12;15628:19;;15287:366;;;:::o;15659:::-;15801:3;15822:67;15886:2;15881:3;15822:67;:::i;:::-;15815:74;;15898:93;15987:3;15898:93;:::i;:::-;16016:2;16011:3;16007:12;16000:19;;15659:366;;;:::o;16031:398::-;16190:3;16211:83;16292:1;16287:3;16211:83;:::i;:::-;16204:90;;16303:93;16392:3;16303:93;:::i;:::-;16421:1;16416:3;16412:11;16405:18;;16031:398;;;:::o;16435:366::-;16577:3;16598:67;16662:2;16657:3;16598:67;:::i;:::-;16591:74;;16674:93;16763:3;16674:93;:::i;:::-;16792:2;16787:3;16783:12;16776:19;;16435:366;;;:::o;16807:::-;16949:3;16970:67;17034:2;17029:3;16970:67;:::i;:::-;16963:74;;17046:93;17135:3;17046:93;:::i;:::-;17164:2;17159:3;17155:12;17148:19;;16807:366;;;:::o;17179:118::-;17266:24;17284:5;17266:24;:::i;:::-;17261:3;17254:37;17179:118;;:::o;17303:701::-;17584:3;17606:95;17697:3;17688:6;17606:95;:::i;:::-;17599:102;;17718:95;17809:3;17800:6;17718:95;:::i;:::-;17711:102;;17830:148;17974:3;17830:148;:::i;:::-;17823:155;;17995:3;17988:10;;17303:701;;;;;:::o;18010:379::-;18194:3;18216:147;18359:3;18216:147;:::i;:::-;18209:154;;18380:3;18373:10;;18010:379;;;:::o;18395:222::-;18488:4;18526:2;18515:9;18511:18;18503:26;;18539:71;18607:1;18596:9;18592:17;18583:6;18539:71;:::i;:::-;18395:222;;;;:::o;18623:640::-;18818:4;18856:3;18845:9;18841:19;18833:27;;18870:71;18938:1;18927:9;18923:17;18914:6;18870:71;:::i;:::-;18951:72;19019:2;19008:9;19004:18;18995:6;18951:72;:::i;:::-;19033;19101:2;19090:9;19086:18;19077:6;19033:72;:::i;:::-;19152:9;19146:4;19142:20;19137:2;19126:9;19122:18;19115:48;19180:76;19251:4;19242:6;19180:76;:::i;:::-;19172:84;;18623:640;;;;;;;:::o;19269:332::-;19390:4;19428:2;19417:9;19413:18;19405:26;;19441:71;19509:1;19498:9;19494:17;19485:6;19441:71;:::i;:::-;19522:72;19590:2;19579:9;19575:18;19566:6;19522:72;:::i;:::-;19269:332;;;;;:::o;19607:210::-;19694:4;19732:2;19721:9;19717:18;19709:26;;19745:65;19807:1;19796:9;19792:17;19783:6;19745:65;:::i;:::-;19607:210;;;;:::o;19823:313::-;19936:4;19974:2;19963:9;19959:18;19951:26;;20023:9;20017:4;20013:20;20009:1;19998:9;19994:17;19987:47;20051:78;20124:4;20115:6;20051:78;:::i;:::-;20043:86;;19823:313;;;;:::o;20142:419::-;20308:4;20346:2;20335:9;20331:18;20323:26;;20395:9;20389:4;20385:20;20381:1;20370:9;20366:17;20359:47;20423:131;20549:4;20423:131;:::i;:::-;20415:139;;20142:419;;;:::o;20567:::-;20733:4;20771:2;20760:9;20756:18;20748:26;;20820:9;20814:4;20810:20;20806:1;20795:9;20791:17;20784:47;20848:131;20974:4;20848:131;:::i;:::-;20840:139;;20567:419;;;:::o;20992:::-;21158:4;21196:2;21185:9;21181:18;21173:26;;21245:9;21239:4;21235:20;21231:1;21220:9;21216:17;21209:47;21273:131;21399:4;21273:131;:::i;:::-;21265:139;;20992:419;;;:::o;21417:::-;21583:4;21621:2;21610:9;21606:18;21598:26;;21670:9;21664:4;21660:20;21656:1;21645:9;21641:17;21634:47;21698:131;21824:4;21698:131;:::i;:::-;21690:139;;21417:419;;;:::o;21842:::-;22008:4;22046:2;22035:9;22031:18;22023:26;;22095:9;22089:4;22085:20;22081:1;22070:9;22066:17;22059:47;22123:131;22249:4;22123:131;:::i;:::-;22115:139;;21842:419;;;:::o;22267:::-;22433:4;22471:2;22460:9;22456:18;22448:26;;22520:9;22514:4;22510:20;22506:1;22495:9;22491:17;22484:47;22548:131;22674:4;22548:131;:::i;:::-;22540:139;;22267:419;;;:::o;22692:::-;22858:4;22896:2;22885:9;22881:18;22873:26;;22945:9;22939:4;22935:20;22931:1;22920:9;22916:17;22909:47;22973:131;23099:4;22973:131;:::i;:::-;22965:139;;22692:419;;;:::o;23117:::-;23283:4;23321:2;23310:9;23306:18;23298:26;;23370:9;23364:4;23360:20;23356:1;23345:9;23341:17;23334:47;23398:131;23524:4;23398:131;:::i;:::-;23390:139;;23117:419;;;:::o;23542:::-;23708:4;23746:2;23735:9;23731:18;23723:26;;23795:9;23789:4;23785:20;23781:1;23770:9;23766:17;23759:47;23823:131;23949:4;23823:131;:::i;:::-;23815:139;;23542:419;;;:::o;23967:222::-;24060:4;24098:2;24087:9;24083:18;24075:26;;24111:71;24179:1;24168:9;24164:17;24155:6;24111:71;:::i;:::-;23967:222;;;;:::o;24195:129::-;24229:6;24256:20;;:::i;:::-;24246:30;;24285:33;24313:4;24305:6;24285:33;:::i;:::-;24195:129;;;:::o;24330:75::-;24363:6;24396:2;24390:9;24380:19;;24330:75;:::o;24411:311::-;24488:4;24578:18;24570:6;24567:30;24564:56;;;24600:18;;:::i;:::-;24564:56;24650:4;24642:6;24638:17;24630:25;;24710:4;24704;24700:15;24692:23;;24411:311;;;:::o;24728:::-;24805:4;24895:18;24887:6;24884:30;24881:56;;;24917:18;;:::i;:::-;24881:56;24967:4;24959:6;24955:17;24947:25;;25027:4;25021;25017:15;25009:23;;24728:311;;;:::o;25045:307::-;25106:4;25196:18;25188:6;25185:30;25182:56;;;25218:18;;:::i;:::-;25182:56;25256:29;25278:6;25256:29;:::i;:::-;25248:37;;25340:4;25334;25330:15;25322:23;;25045:307;;;:::o;25358:308::-;25420:4;25510:18;25502:6;25499:30;25496:56;;;25532:18;;:::i;:::-;25496:56;25570:29;25592:6;25570:29;:::i;:::-;25562:37;;25654:4;25648;25644:15;25636:23;;25358:308;;;:::o;25672:98::-;25723:6;25757:5;25751:12;25741:22;;25672:98;;;:::o;25776:99::-;25828:6;25862:5;25856:12;25846:22;;25776:99;;;:::o;25881:168::-;25964:11;25998:6;25993:3;25986:19;26038:4;26033:3;26029:14;26014:29;;25881:168;;;;:::o;26055:147::-;26156:11;26193:3;26178:18;;26055:147;;;;:::o;26208:169::-;26292:11;26326:6;26321:3;26314:19;26366:4;26361:3;26357:14;26342:29;;26208:169;;;;:::o;26383:148::-;26485:11;26522:3;26507:18;;26383:148;;;;:::o;26537:305::-;26577:3;26596:20;26614:1;26596:20;:::i;:::-;26591:25;;26630:20;26648:1;26630:20;:::i;:::-;26625:25;;26784:1;26716:66;26712:74;26709:1;26706:81;26703:107;;;26790:18;;:::i;:::-;26703:107;26834:1;26831;26827:9;26820:16;;26537:305;;;;:::o;26848:348::-;26888:7;26911:20;26929:1;26911:20;:::i;:::-;26906:25;;26945:20;26963:1;26945:20;:::i;:::-;26940:25;;27133:1;27065:66;27061:74;27058:1;27055:81;27050:1;27043:9;27036:17;27032:105;27029:131;;;27140:18;;:::i;:::-;27029:131;27188:1;27185;27181:9;27170:20;;26848:348;;;;:::o;27202:96::-;27239:7;27268:24;27286:5;27268:24;:::i;:::-;27257:35;;27202:96;;;:::o;27304:90::-;27338:7;27381:5;27374:13;27367:21;27356:32;;27304:90;;;:::o;27400:149::-;27436:7;27476:66;27469:5;27465:78;27454:89;;27400:149;;;:::o;27555:126::-;27592:7;27632:42;27625:5;27621:54;27610:65;;27555:126;;;:::o;27687:77::-;27724:7;27753:5;27742:16;;27687:77;;;:::o;27770:154::-;27854:6;27849:3;27844;27831:30;27916:1;27907:6;27902:3;27898:16;27891:27;27770:154;;;:::o;27930:307::-;27998:1;28008:113;28022:6;28019:1;28016:13;28008:113;;;28107:1;28102:3;28098:11;28092:18;28088:1;28083:3;28079:11;28072:39;28044:2;28041:1;28037:10;28032:15;;28008:113;;;28139:6;28136:1;28133:13;28130:101;;;28219:1;28210:6;28205:3;28201:16;28194:27;28130:101;27979:258;27930:307;;;:::o;28243:320::-;28287:6;28324:1;28318:4;28314:12;28304:22;;28371:1;28365:4;28361:12;28392:18;28382:81;;28448:4;28440:6;28436:17;28426:27;;28382:81;28510:2;28502:6;28499:14;28479:18;28476:38;28473:84;;;28529:18;;:::i;:::-;28473:84;28294:269;28243:320;;;:::o;28569:281::-;28652:27;28674:4;28652:27;:::i;:::-;28644:6;28640:40;28782:6;28770:10;28767:22;28746:18;28734:10;28731:34;28728:62;28725:88;;;28793:18;;:::i;:::-;28725:88;28833:10;28829:2;28822:22;28612:238;28569:281;;:::o;28856:233::-;28895:3;28918:24;28936:5;28918:24;:::i;:::-;28909:33;;28964:66;28957:5;28954:77;28951:103;;;29034:18;;:::i;:::-;28951:103;29081:1;29074:5;29070:13;29063:20;;28856:233;;;:::o;29095:180::-;29143:77;29140:1;29133:88;29240:4;29237:1;29230:15;29264:4;29261:1;29254:15;29281:180;29329:77;29326:1;29319:88;29426:4;29423:1;29416:15;29450:4;29447:1;29440:15;29467:180;29515:77;29512:1;29505:88;29612:4;29609:1;29602:15;29636:4;29633:1;29626:15;29653:180;29701:77;29698:1;29691:88;29798:4;29795:1;29788:15;29822:4;29819:1;29812:15;29839:180;29887:77;29884:1;29877:88;29984:4;29981:1;29974:15;30008:4;30005:1;29998:15;30025:117;30134:1;30131;30124:12;30148:117;30257:1;30254;30247:12;30271:117;30380:1;30377;30370:12;30394:117;30503:1;30500;30493:12;30517:117;30626:1;30623;30616:12;30640:102;30681:6;30732:2;30728:7;30723:2;30716:5;30712:14;30708:28;30698:38;;30640:102;;;:::o;30748:181::-;30888:33;30884:1;30876:6;30872:14;30865:57;30748:181;:::o;30935:225::-;31075:34;31071:1;31063:6;31059:14;31052:58;31144:8;31139:2;31131:6;31127:15;31120:33;30935:225;:::o;31166:170::-;31306:22;31302:1;31294:6;31290:14;31283:46;31166:170;:::o;31342:171::-;31482:23;31478:1;31470:6;31466:14;31459:47;31342:171;:::o;31519:155::-;31659:7;31655:1;31647:6;31643:14;31636:31;31519:155;:::o;31680:182::-;31820:34;31816:1;31808:6;31804:14;31797:58;31680:182;:::o;31868:175::-;32008:27;32004:1;31996:6;31992:14;31985:51;31868:175;:::o;32049:::-;32189:27;32185:1;32177:6;32173:14;32166:51;32049:175;:::o;32230:114::-;;:::o;32350:168::-;32490:20;32486:1;32478:6;32474:14;32467:44;32350:168;:::o;32524:176::-;32664:28;32660:1;32652:6;32648:14;32641:52;32524:176;:::o;32706:122::-;32779:24;32797:5;32779:24;:::i;:::-;32772:5;32769:35;32759:63;;32818:1;32815;32808:12;32759:63;32706:122;:::o;32834:116::-;32904:21;32919:5;32904:21;:::i;:::-;32897:5;32894:32;32884:60;;32940:1;32937;32930:12;32884:60;32834:116;:::o;32956:120::-;33028:23;33045:5;33028:23;:::i;:::-;33021:5;33018:34;33008:62;;33066:1;33063;33056:12;33008:62;32956:120;:::o;33082:122::-;33155:24;33173:5;33155:24;:::i;:::-;33148:5;33145:35;33135:63;;33194:1;33191;33184:12;33135:63;33082:122;:::o
Swarm Source
ipfs://71852213b87e05d543fde7324b4379dbfc4cc131d717d8e12c1a106673d23c19
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.