ERC-721
Overview
Max Total Supply
450 RMA
Holders
43
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 RMALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RealMutantApes
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-20 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (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: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.2 // 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(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // 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; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @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; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](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.2 // 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 { // Reference type for token approval. 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 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 { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _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]`. 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 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 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 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. 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`. ) 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 0x80 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // 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: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: contracts/RealMutantApes.sol pragma solidity >=0.8.9 <0.9.0; contract RealMutantApes is ERC721AQueryable, Ownable, ReentrancyGuard { using Strings for uint256; string public baseURI = ''; string public uriSuffix = '.json'; uint256 public cost = 0.007 ether; uint256 public maxSupply = 450; uint256 public maxMintAmountPerWallet = 10; bool public paused = true; constructor( string memory _tokenName, string memory _tokenSymbol ) ERC721A(_tokenName, _tokenSymbol) { } modifier mintCompliance(uint256 _mintAmount) { require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerWallet, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!'); _; } modifier mintPriceCompliance(uint256 _mintAmount) { require(msg.value >= cost * _mintAmount, 'Insufficient funds!'); _; } function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) { require(!paused, 'The contract is paused!'); _safeMint(_msgSender(), _mintAmount); } function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner { _safeMint(_receiver, _mintAmount); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setMaxMintAmountPerWallet(uint256 _maxMintAmountPerWallet) public onlyOwner { maxMintAmountPerWallet = _maxMintAmountPerWallet; } function setBaseURI(string memory _url) public onlyOwner { baseURI = _url; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"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":"maxMintAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","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":"uint256","name":"_maxMintAmountPerWallet","type":"uint256"}],"name":"setMaxMintAmountPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600a90805190602001906200002b92919062000231565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b90805190602001906200007992919062000231565b506618de76816d8000600c556101c2600d55600a600e556001600f60006101000a81548160ff021916908315150217905550348015620000b857600080fd5b5060405162004155380380620041558339818101604052810190620000de91906200047e565b81818160029080519060200190620000f892919062000231565b5080600390805190602001906200011192919062000231565b50620001226200015a60201b60201c565b60008190555050506200014a6200013e6200016360201b60201c565b6200016b60201b60201c565b6001600981905550505062000568565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023f9062000532565b90600052602060002090601f016020900481019282620002635760008555620002af565b82601f106200027e57805160ff1916838001178555620002af565b82800160010185558215620002af579182015b82811115620002ae57825182559160200191906001019062000291565b5b509050620002be9190620002c2565b5090565b5b80821115620002dd576000816000905550600101620002c3565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200034a82620002ff565b810181811067ffffffffffffffff821117156200036c576200036b62000310565b5b80604052505050565b600062000381620002e1565b90506200038f82826200033f565b919050565b600067ffffffffffffffff821115620003b257620003b162000310565b5b620003bd82620002ff565b9050602081019050919050565b60005b83811015620003ea578082015181840152602081019050620003cd565b83811115620003fa576000848401525b50505050565b600062000417620004118462000394565b62000375565b905082815260208101848484011115620004365762000435620002fa565b5b62000443848285620003ca565b509392505050565b600082601f830112620004635762000462620002f5565b5b81516200047584826020860162000400565b91505092915050565b60008060408385031215620004985762000497620002eb565b5b600083015167ffffffffffffffff811115620004b957620004b8620002f0565b5b620004c7858286016200044b565b925050602083015167ffffffffffffffff811115620004eb57620004ea620002f0565b5b620004f9858286016200044b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200054b57607f821691505b6020821081141562000562576200056162000503565b5b50919050565b613bdd80620005786000396000f3fe6080604052600436106102045760003560e01c80636c0360eb11610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd14610758578063d5abeb0114610795578063e985e9c5146107c0578063efbd73f4146107fd578063f2fde38b1461082657610204565b8063a22cb4651461069e578063b88d4fde146106c7578063bc951b91146106f0578063c23dc68f1461071b57610204565b80638462151c116100e75780638462151c146105b25780638da5cb5b146105ef57806395d89b411461061a57806399a2557a14610645578063a0712d681461068257610204565b80636c0360eb1461050a57806370a0823114610535578063715018a614610572578063766b7d091461058957610204565b806323b872dd1161019b5780635503a0e81161016a5780635503a0e81461041157806355f804b31461043c5780635bbb2177146104655780635c975abb146104a25780636352211e146104cd57610204565b806323b872dd1461037f5780633ccfd60b146103a857806342842e0e146103bf57806344a0d68a146103e857610204565b806313faede6116101d757806313faede6146102d757806316ba10e01461030257806316c38b3c1461032b57806318160ddd1461035457610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906128d1565b61084f565b60405161023d9190612919565b60405180910390f35b34801561025257600080fd5b5061025b6108e1565b60405161026891906129cd565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612a25565b610973565b6040516102a59190612a93565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612ada565b6109f2565b005b3480156102e357600080fd5b506102ec610b36565b6040516102f99190612b29565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190612c79565b610b3c565b005b34801561033757600080fd5b50610352600480360381019061034d9190612cee565b610b5e565b005b34801561036057600080fd5b50610369610b83565b6040516103769190612b29565b60405180910390f35b34801561038b57600080fd5b506103a660048036038101906103a19190612d1b565b610b9a565b005b3480156103b457600080fd5b506103bd610ebf565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612d1b565b610f9d565b005b3480156103f457600080fd5b5061040f600480360381019061040a9190612a25565b610fbd565b005b34801561041d57600080fd5b50610426610fcf565b60405161043391906129cd565b60405180910390f35b34801561044857600080fd5b50610463600480360381019061045e9190612c79565b61105d565b005b34801561047157600080fd5b5061048c60048036038101906104879190612dce565b61107f565b6040516104999190612f7e565b60405180910390f35b3480156104ae57600080fd5b506104b7611142565b6040516104c49190612919565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef9190612a25565b611155565b6040516105019190612a93565b60405180910390f35b34801561051657600080fd5b5061051f611167565b60405161052c91906129cd565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190612fa0565b6111f5565b6040516105699190612b29565b60405180910390f35b34801561057e57600080fd5b506105876112ae565b005b34801561059557600080fd5b506105b060048036038101906105ab9190612a25565b6112c2565b005b3480156105be57600080fd5b506105d960048036038101906105d49190612fa0565b6112d4565b6040516105e6919061308b565b60405180910390f35b3480156105fb57600080fd5b5061060461141e565b6040516106119190612a93565b60405180910390f35b34801561062657600080fd5b5061062f611448565b60405161063c91906129cd565b60405180910390f35b34801561065157600080fd5b5061066c600480360381019061066791906130ad565b6114da565b604051610679919061308b565b60405180910390f35b61069c60048036038101906106979190612a25565b6116ee565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190613100565b61184e565b005b3480156106d357600080fd5b506106ee60048036038101906106e991906131e1565b6119c6565b005b3480156106fc57600080fd5b50610705611a39565b6040516107129190612b29565b60405180910390f35b34801561072757600080fd5b50610742600480360381019061073d9190612a25565b611a3f565b60405161074f91906132b9565b60405180910390f35b34801561076457600080fd5b5061077f600480360381019061077a9190612a25565b611aa9565b60405161078c91906129cd565b60405180910390f35b3480156107a157600080fd5b506107aa611b53565b6040516107b79190612b29565b60405180910390f35b3480156107cc57600080fd5b506107e760048036038101906107e291906132d4565b611b59565b6040516107f49190612919565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f9190613314565b611bed565b005b34801561083257600080fd5b5061084d60048036038101906108489190612fa0565b611cad565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108aa57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108da5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108f090613383565b80601f016020809104026020016040519081016040528092919081815260200182805461091c90613383565b80156109695780601f1061093e57610100808354040283529160200191610969565b820191906000526020600020905b81548152906001019060200180831161094c57829003601f168201915b5050505050905090565b600061097e82611d31565b6109b4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109fd82611155565b90508073ffffffffffffffffffffffffffffffffffffffff16610a1e611d90565b73ffffffffffffffffffffffffffffffffffffffff1614610a8157610a4a81610a45611d90565b611b59565b610a80576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b610b44611d98565b80600b9080519060200190610b5a929190612773565b5050565b610b66611d98565b80600f60006101000a81548160ff02191690831515021790555050565b6000610b8d611e16565b6001546000540303905090565b6000610ba582611e1f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c0c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c1884611eed565b91509150610c2e8187610c29611d90565b611f14565b610c7a57610c4386610c3e611d90565b611b59565b610c79576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ce1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cee8686866001611f58565b8015610cf957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610dc785610da3888887611f5e565b7c020000000000000000000000000000000000000000000000000000000017611f86565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e4f576000600185019050600060046000838152602001908152602001600020541415610e4d576000548114610e4c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610eb78686866001611fb1565b505050505050565b610ec7611d98565b60026009541415610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490613401565b60405180910390fd5b60026009819055506000610f1f61141e565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f4290613452565b60006040518083038185875af1925050503d8060008114610f7f576040519150601f19603f3d011682016040523d82523d6000602084013e610f84565b606091505b5050905080610f9257600080fd5b506001600981905550565b610fb8838383604051806020016040528060008152506119c6565b505050565b610fc5611d98565b80600c8190555050565b600b8054610fdc90613383565b80601f016020809104026020016040519081016040528092919081815260200182805461100890613383565b80156110555780601f1061102a57610100808354040283529160200191611055565b820191906000526020600020905b81548152906001019060200180831161103857829003601f168201915b505050505081565b611065611d98565b80600a908051906020019061107b929190612773565b5050565b6060600083839050905060008167ffffffffffffffff8111156110a5576110a4612b4e565b5b6040519080825280602002602001820160405280156110de57816020015b6110cb6127f9565b8152602001906001900390816110c35790505b50905060005b8281146111365761110d86868381811061110157611100613467565b5b90506020020135611a3f565b8282815181106111205761111f613467565b5b60200260200101819052508060010190506110e4565b50809250505092915050565b600f60009054906101000a900460ff1681565b600061116082611e1f565b9050919050565b600a805461117490613383565b80601f01602080910402602001604051908101604052809291908181526020018280546111a090613383565b80156111ed5780601f106111c2576101008083540402835291602001916111ed565b820191906000526020600020905b8154815290600101906020018083116111d057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561125d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112b6611d98565b6112c06000611fb7565b565b6112ca611d98565b80600e8190555050565b606060008060006112e4856111f5565b905060008167ffffffffffffffff81111561130257611301612b4e565b5b6040519080825280602002602001820160405280156113305781602001602082028036833780820191505090505b50905061133b6127f9565b6000611345611e16565b90505b838614611410576113588161207d565b915081604001511561136957611405565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146113a957816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561140457808387806001019850815181106113f7576113f6613467565b5b6020026020010181815250505b5b806001019050611348565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461145790613383565b80601f016020809104026020016040519081016040528092919081815260200182805461148390613383565b80156114d05780601f106114a5576101008083540402835291602001916114d0565b820191906000526020600020905b8154815290600101906020018083116114b357829003601f168201915b5050505050905090565b6060818310611515576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806115206120a8565b905061152a611e16565b85101561153c57611539611e16565b94505b80841115611548578093505b6000611553876111f5565b905084861015611576576000868603905081811015611570578091505b5061157b565b600090505b60008167ffffffffffffffff81111561159757611596612b4e565b5b6040519080825280602002602001820160405280156115c55781602001602082028036833780820191505090505b50905060008214156115dd57809450505050506116e7565b60006115e888611a3f565b9050600081604001516115fd57816000015190505b60008990505b8881141580156116135750848714155b156116d9576116218161207d565b9250826040015115611632576116ce565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461167257826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116cd57808488806001019950815181106116c0576116bf613467565b5b6020026020010181815250505b5b806001019050611603565b508583528296505050505050505b9392505050565b806000811180156117015750600e548111155b611740576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611737906134e2565b60405180910390fd5b600d548161174c610b83565b6117569190613531565b1115611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178e906135d3565b60405180910390fd5b8180600c546117a691906135f3565b3410156117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90613699565b60405180910390fd5b600f60009054906101000a900460ff1615611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182f90613705565b60405180910390fd5b6118496118436120b1565b846120b9565b505050565b611856611d90565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118bb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006118c8611d90565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611975611d90565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119ba9190612919565b60405180910390a35050565b6119d1848484610b9a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a33576119fc848484846120d7565b611a32576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600e5481565b611a476127f9565b611a4f6127f9565b611a57611e16565b831080611a6b5750611a676120a8565b8310155b15611a795780915050611aa4565b611a828361207d565b9050806040015115611a975780915050611aa4565b611aa083612237565b9150505b919050565b6060611ab482611d31565b611af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aea90613797565b60405180910390fd5b6000611afd612257565b90506000815111611b1d5760405180602001604052806000815250611b4b565b80611b27846122e9565b600b604051602001611b3b93929190613887565b6040516020818303038152906040525b915050919050565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611c005750600e548111155b611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c36906134e2565b60405180910390fd5b600d5481611c4b610b83565b611c559190613531565b1115611c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8d906135d3565b60405180910390fd5b611c9e611d98565b611ca882846120b9565b505050565b611cb5611d98565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c9061392a565b60405180910390fd5b611d2e81611fb7565b50565b600081611d3c611e16565b11158015611d4b575060005482105b8015611d89575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b611da06120b1565b73ffffffffffffffffffffffffffffffffffffffff16611dbe61141e565b73ffffffffffffffffffffffffffffffffffffffff1614611e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0b90613996565b60405180910390fd5b565b60006001905090565b60008082905080611e2e611e16565b11611eb657600054811015611eb55760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611eb3575b6000811415611ea9576004600083600190039350838152602001908152602001600020549050611e7e565b8092505050611ee8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611f7586868461244a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120856127f9565b6120a16004600084815260200190815260200160002054612453565b9050919050565b60008054905090565b600033905090565b6120d3828260405180602001604052806000815250612509565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120fd611d90565b8786866040518563ffffffff1660e01b815260040161211f9493929190613a0b565b602060405180830381600087803b15801561213957600080fd5b505af192505050801561216a57506040513d601f19601f820116820180604052508101906121679190613a6c565b60015b6121e4573d806000811461219a576040519150601f19603f3d011682016040523d82523d6000602084013e61219f565b606091505b506000815114156121dc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b61223f6127f9565b61225061224b83611e1f565b612453565b9050919050565b6060600a805461226690613383565b80601f016020809104026020016040519081016040528092919081815260200182805461229290613383565b80156122df5780601f106122b4576101008083540402835291602001916122df565b820191906000526020600020905b8154815290600101906020018083116122c257829003601f168201915b5050505050905090565b60606000821415612331576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612445565b600082905060005b6000821461236357808061234c90613a99565b915050600a8261235c9190613b11565b9150612339565b60008167ffffffffffffffff81111561237f5761237e612b4e565b5b6040519080825280601f01601f1916602001820160405280156123b15781602001600182028036833780820191505090505b5090505b6000851461243e576001826123ca9190613b42565b9150600a856123d99190613b76565b60306123e59190613531565b60f81b8183815181106123fb576123fa613467565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124379190613b11565b94506123b5565b8093505050505b919050565b60009392505050565b61245b6127f9565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b61251383836125a6565b60008373ffffffffffffffffffffffffffffffffffffffff163b146125a157600080549050600083820390505b61255360008683806001019450866120d7565b612589576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061254057816000541461259e57600080fd5b50505b505050565b60008054905060008214156125e7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125f46000848385611f58565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061266b8361265c6000866000611f5e565b61266585612763565b17611f86565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461270c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506126d1565b506000821415612748576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061275e6000848385611fb1565b505050565b60006001821460e11b9050919050565b82805461277f90613383565b90600052602060002090601f0160209004810192826127a157600085556127e8565b82601f106127ba57805160ff19168380011785556127e8565b828001600101855582156127e8579182015b828111156127e75782518255916020019190600101906127cc565b5b5090506127f59190612848565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612861576000816000905550600101612849565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6128ae81612879565b81146128b957600080fd5b50565b6000813590506128cb816128a5565b92915050565b6000602082840312156128e7576128e661286f565b5b60006128f5848285016128bc565b91505092915050565b60008115159050919050565b612913816128fe565b82525050565b600060208201905061292e600083018461290a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561296e578082015181840152602081019050612953565b8381111561297d576000848401525b50505050565b6000601f19601f8301169050919050565b600061299f82612934565b6129a9818561293f565b93506129b9818560208601612950565b6129c281612983565b840191505092915050565b600060208201905081810360008301526129e78184612994565b905092915050565b6000819050919050565b612a02816129ef565b8114612a0d57600080fd5b50565b600081359050612a1f816129f9565b92915050565b600060208284031215612a3b57612a3a61286f565b5b6000612a4984828501612a10565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a7d82612a52565b9050919050565b612a8d81612a72565b82525050565b6000602082019050612aa86000830184612a84565b92915050565b612ab781612a72565b8114612ac257600080fd5b50565b600081359050612ad481612aae565b92915050565b60008060408385031215612af157612af061286f565b5b6000612aff85828601612ac5565b9250506020612b1085828601612a10565b9150509250929050565b612b23816129ef565b82525050565b6000602082019050612b3e6000830184612b1a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b8682612983565b810181811067ffffffffffffffff82111715612ba557612ba4612b4e565b5b80604052505050565b6000612bb8612865565b9050612bc48282612b7d565b919050565b600067ffffffffffffffff821115612be457612be3612b4e565b5b612bed82612983565b9050602081019050919050565b82818337600083830152505050565b6000612c1c612c1784612bc9565b612bae565b905082815260208101848484011115612c3857612c37612b49565b5b612c43848285612bfa565b509392505050565b600082601f830112612c6057612c5f612b44565b5b8135612c70848260208601612c09565b91505092915050565b600060208284031215612c8f57612c8e61286f565b5b600082013567ffffffffffffffff811115612cad57612cac612874565b5b612cb984828501612c4b565b91505092915050565b612ccb816128fe565b8114612cd657600080fd5b50565b600081359050612ce881612cc2565b92915050565b600060208284031215612d0457612d0361286f565b5b6000612d1284828501612cd9565b91505092915050565b600080600060608486031215612d3457612d3361286f565b5b6000612d4286828701612ac5565b9350506020612d5386828701612ac5565b9250506040612d6486828701612a10565b9150509250925092565b600080fd5b600080fd5b60008083601f840112612d8e57612d8d612b44565b5b8235905067ffffffffffffffff811115612dab57612daa612d6e565b5b602083019150836020820283011115612dc757612dc6612d73565b5b9250929050565b60008060208385031215612de557612de461286f565b5b600083013567ffffffffffffffff811115612e0357612e02612874565b5b612e0f85828601612d78565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e5081612a72565b82525050565b600067ffffffffffffffff82169050919050565b612e7381612e56565b82525050565b612e82816128fe565b82525050565b600062ffffff82169050919050565b612ea081612e88565b82525050565b608082016000820151612ebc6000850182612e47565b506020820151612ecf6020850182612e6a565b506040820151612ee26040850182612e79565b506060820151612ef56060850182612e97565b50505050565b6000612f078383612ea6565b60808301905092915050565b6000602082019050919050565b6000612f2b82612e1b565b612f358185612e26565b9350612f4083612e37565b8060005b83811015612f71578151612f588882612efb565b9750612f6383612f13565b925050600181019050612f44565b5085935050505092915050565b60006020820190508181036000830152612f988184612f20565b905092915050565b600060208284031215612fb657612fb561286f565b5b6000612fc484828501612ac5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613002816129ef565b82525050565b60006130148383612ff9565b60208301905092915050565b6000602082019050919050565b600061303882612fcd565b6130428185612fd8565b935061304d83612fe9565b8060005b8381101561307e5781516130658882613008565b975061307083613020565b925050600181019050613051565b5085935050505092915050565b600060208201905081810360008301526130a5818461302d565b905092915050565b6000806000606084860312156130c6576130c561286f565b5b60006130d486828701612ac5565b93505060206130e586828701612a10565b92505060406130f686828701612a10565b9150509250925092565b600080604083850312156131175761311661286f565b5b600061312585828601612ac5565b925050602061313685828601612cd9565b9150509250929050565b600067ffffffffffffffff82111561315b5761315a612b4e565b5b61316482612983565b9050602081019050919050565b600061318461317f84613140565b612bae565b9050828152602081018484840111156131a05761319f612b49565b5b6131ab848285612bfa565b509392505050565b600082601f8301126131c8576131c7612b44565b5b81356131d8848260208601613171565b91505092915050565b600080600080608085870312156131fb576131fa61286f565b5b600061320987828801612ac5565b945050602061321a87828801612ac5565b935050604061322b87828801612a10565b925050606085013567ffffffffffffffff81111561324c5761324b612874565b5b613258878288016131b3565b91505092959194509250565b60808201600082015161327a6000850182612e47565b50602082015161328d6020850182612e6a565b5060408201516132a06040850182612e79565b5060608201516132b36060850182612e97565b50505050565b60006080820190506132ce6000830184613264565b92915050565b600080604083850312156132eb576132ea61286f565b5b60006132f985828601612ac5565b925050602061330a85828601612ac5565b9150509250929050565b6000806040838503121561332b5761332a61286f565b5b600061333985828601612a10565b925050602061334a85828601612ac5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061339b57607f821691505b602082108114156133af576133ae613354565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006133eb601f8361293f565b91506133f6826133b5565b602082019050919050565b6000602082019050818103600083015261341a816133de565b9050919050565b600081905092915050565b50565b600061343c600083613421565b91506134478261342c565b600082019050919050565b600061345d8261342f565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006134cc60148361293f565b91506134d782613496565b602082019050919050565b600060208201905081810360008301526134fb816134bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061353c826129ef565b9150613547836129ef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561357c5761357b613502565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006135bd60148361293f565b91506135c882613587565b602082019050919050565b600060208201905081810360008301526135ec816135b0565b9050919050565b60006135fe826129ef565b9150613609836129ef565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561364257613641613502565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b600061368360138361293f565b915061368e8261364d565b602082019050919050565b600060208201905081810360008301526136b281613676565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006136ef60178361293f565b91506136fa826136b9565b602082019050919050565b6000602082019050818103600083015261371e816136e2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613781602f8361293f565b915061378c82613725565b604082019050919050565b600060208201905081810360008301526137b081613774565b9050919050565b600081905092915050565b60006137cd82612934565b6137d781856137b7565b93506137e7818560208601612950565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461381581613383565b61381f81866137b7565b9450600182166000811461383a576001811461384b5761387e565b60ff1983168652818601935061387e565b613854856137f3565b60005b8381101561387657815481890152600182019150602081019050613857565b838801955050505b50505092915050565b600061389382866137c2565b915061389f82856137c2565b91506138ab8284613808565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061391460268361293f565b915061391f826138b8565b604082019050919050565b6000602082019050818103600083015261394381613907565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061398060208361293f565b915061398b8261394a565b602082019050919050565b600060208201905081810360008301526139af81613973565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006139dd826139b6565b6139e781856139c1565b93506139f7818560208601612950565b613a0081612983565b840191505092915050565b6000608082019050613a206000830187612a84565b613a2d6020830186612a84565b613a3a6040830185612b1a565b8181036060830152613a4c81846139d2565b905095945050505050565b600081519050613a66816128a5565b92915050565b600060208284031215613a8257613a8161286f565b5b6000613a9084828501613a57565b91505092915050565b6000613aa4826129ef565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ad757613ad6613502565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b1c826129ef565b9150613b27836129ef565b925082613b3757613b36613ae2565b5b828204905092915050565b6000613b4d826129ef565b9150613b58836129ef565b925082821015613b6b57613b6a613502565b5b828203905092915050565b6000613b81826129ef565b9150613b8c836129ef565b925082613b9c57613b9b613ae2565b5b82820690509291505056fea264697066735822122025b941ca13bf28f6f455ac56825a606c27708ae3d8dac9b4ba916626fdf62bab64736f6c634300080900330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000105265616c204d7574616e742041706573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003524d410000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102045760003560e01c80636c0360eb11610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd14610758578063d5abeb0114610795578063e985e9c5146107c0578063efbd73f4146107fd578063f2fde38b1461082657610204565b8063a22cb4651461069e578063b88d4fde146106c7578063bc951b91146106f0578063c23dc68f1461071b57610204565b80638462151c116100e75780638462151c146105b25780638da5cb5b146105ef57806395d89b411461061a57806399a2557a14610645578063a0712d681461068257610204565b80636c0360eb1461050a57806370a0823114610535578063715018a614610572578063766b7d091461058957610204565b806323b872dd1161019b5780635503a0e81161016a5780635503a0e81461041157806355f804b31461043c5780635bbb2177146104655780635c975abb146104a25780636352211e146104cd57610204565b806323b872dd1461037f5780633ccfd60b146103a857806342842e0e146103bf57806344a0d68a146103e857610204565b806313faede6116101d757806313faede6146102d757806316ba10e01461030257806316c38b3c1461032b57806318160ddd1461035457610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906128d1565b61084f565b60405161023d9190612919565b60405180910390f35b34801561025257600080fd5b5061025b6108e1565b60405161026891906129cd565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612a25565b610973565b6040516102a59190612a93565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612ada565b6109f2565b005b3480156102e357600080fd5b506102ec610b36565b6040516102f99190612b29565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190612c79565b610b3c565b005b34801561033757600080fd5b50610352600480360381019061034d9190612cee565b610b5e565b005b34801561036057600080fd5b50610369610b83565b6040516103769190612b29565b60405180910390f35b34801561038b57600080fd5b506103a660048036038101906103a19190612d1b565b610b9a565b005b3480156103b457600080fd5b506103bd610ebf565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612d1b565b610f9d565b005b3480156103f457600080fd5b5061040f600480360381019061040a9190612a25565b610fbd565b005b34801561041d57600080fd5b50610426610fcf565b60405161043391906129cd565b60405180910390f35b34801561044857600080fd5b50610463600480360381019061045e9190612c79565b61105d565b005b34801561047157600080fd5b5061048c60048036038101906104879190612dce565b61107f565b6040516104999190612f7e565b60405180910390f35b3480156104ae57600080fd5b506104b7611142565b6040516104c49190612919565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef9190612a25565b611155565b6040516105019190612a93565b60405180910390f35b34801561051657600080fd5b5061051f611167565b60405161052c91906129cd565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190612fa0565b6111f5565b6040516105699190612b29565b60405180910390f35b34801561057e57600080fd5b506105876112ae565b005b34801561059557600080fd5b506105b060048036038101906105ab9190612a25565b6112c2565b005b3480156105be57600080fd5b506105d960048036038101906105d49190612fa0565b6112d4565b6040516105e6919061308b565b60405180910390f35b3480156105fb57600080fd5b5061060461141e565b6040516106119190612a93565b60405180910390f35b34801561062657600080fd5b5061062f611448565b60405161063c91906129cd565b60405180910390f35b34801561065157600080fd5b5061066c600480360381019061066791906130ad565b6114da565b604051610679919061308b565b60405180910390f35b61069c60048036038101906106979190612a25565b6116ee565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190613100565b61184e565b005b3480156106d357600080fd5b506106ee60048036038101906106e991906131e1565b6119c6565b005b3480156106fc57600080fd5b50610705611a39565b6040516107129190612b29565b60405180910390f35b34801561072757600080fd5b50610742600480360381019061073d9190612a25565b611a3f565b60405161074f91906132b9565b60405180910390f35b34801561076457600080fd5b5061077f600480360381019061077a9190612a25565b611aa9565b60405161078c91906129cd565b60405180910390f35b3480156107a157600080fd5b506107aa611b53565b6040516107b79190612b29565b60405180910390f35b3480156107cc57600080fd5b506107e760048036038101906107e291906132d4565b611b59565b6040516107f49190612919565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f9190613314565b611bed565b005b34801561083257600080fd5b5061084d60048036038101906108489190612fa0565b611cad565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108aa57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108da5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108f090613383565b80601f016020809104026020016040519081016040528092919081815260200182805461091c90613383565b80156109695780601f1061093e57610100808354040283529160200191610969565b820191906000526020600020905b81548152906001019060200180831161094c57829003601f168201915b5050505050905090565b600061097e82611d31565b6109b4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109fd82611155565b90508073ffffffffffffffffffffffffffffffffffffffff16610a1e611d90565b73ffffffffffffffffffffffffffffffffffffffff1614610a8157610a4a81610a45611d90565b611b59565b610a80576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b610b44611d98565b80600b9080519060200190610b5a929190612773565b5050565b610b66611d98565b80600f60006101000a81548160ff02191690831515021790555050565b6000610b8d611e16565b6001546000540303905090565b6000610ba582611e1f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c0c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c1884611eed565b91509150610c2e8187610c29611d90565b611f14565b610c7a57610c4386610c3e611d90565b611b59565b610c79576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ce1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cee8686866001611f58565b8015610cf957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610dc785610da3888887611f5e565b7c020000000000000000000000000000000000000000000000000000000017611f86565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e4f576000600185019050600060046000838152602001908152602001600020541415610e4d576000548114610e4c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610eb78686866001611fb1565b505050505050565b610ec7611d98565b60026009541415610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490613401565b60405180910390fd5b60026009819055506000610f1f61141e565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f4290613452565b60006040518083038185875af1925050503d8060008114610f7f576040519150601f19603f3d011682016040523d82523d6000602084013e610f84565b606091505b5050905080610f9257600080fd5b506001600981905550565b610fb8838383604051806020016040528060008152506119c6565b505050565b610fc5611d98565b80600c8190555050565b600b8054610fdc90613383565b80601f016020809104026020016040519081016040528092919081815260200182805461100890613383565b80156110555780601f1061102a57610100808354040283529160200191611055565b820191906000526020600020905b81548152906001019060200180831161103857829003601f168201915b505050505081565b611065611d98565b80600a908051906020019061107b929190612773565b5050565b6060600083839050905060008167ffffffffffffffff8111156110a5576110a4612b4e565b5b6040519080825280602002602001820160405280156110de57816020015b6110cb6127f9565b8152602001906001900390816110c35790505b50905060005b8281146111365761110d86868381811061110157611100613467565b5b90506020020135611a3f565b8282815181106111205761111f613467565b5b60200260200101819052508060010190506110e4565b50809250505092915050565b600f60009054906101000a900460ff1681565b600061116082611e1f565b9050919050565b600a805461117490613383565b80601f01602080910402602001604051908101604052809291908181526020018280546111a090613383565b80156111ed5780601f106111c2576101008083540402835291602001916111ed565b820191906000526020600020905b8154815290600101906020018083116111d057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561125d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112b6611d98565b6112c06000611fb7565b565b6112ca611d98565b80600e8190555050565b606060008060006112e4856111f5565b905060008167ffffffffffffffff81111561130257611301612b4e565b5b6040519080825280602002602001820160405280156113305781602001602082028036833780820191505090505b50905061133b6127f9565b6000611345611e16565b90505b838614611410576113588161207d565b915081604001511561136957611405565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146113a957816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561140457808387806001019850815181106113f7576113f6613467565b5b6020026020010181815250505b5b806001019050611348565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461145790613383565b80601f016020809104026020016040519081016040528092919081815260200182805461148390613383565b80156114d05780601f106114a5576101008083540402835291602001916114d0565b820191906000526020600020905b8154815290600101906020018083116114b357829003601f168201915b5050505050905090565b6060818310611515576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806115206120a8565b905061152a611e16565b85101561153c57611539611e16565b94505b80841115611548578093505b6000611553876111f5565b905084861015611576576000868603905081811015611570578091505b5061157b565b600090505b60008167ffffffffffffffff81111561159757611596612b4e565b5b6040519080825280602002602001820160405280156115c55781602001602082028036833780820191505090505b50905060008214156115dd57809450505050506116e7565b60006115e888611a3f565b9050600081604001516115fd57816000015190505b60008990505b8881141580156116135750848714155b156116d9576116218161207d565b9250826040015115611632576116ce565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461167257826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116cd57808488806001019950815181106116c0576116bf613467565b5b6020026020010181815250505b5b806001019050611603565b508583528296505050505050505b9392505050565b806000811180156117015750600e548111155b611740576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611737906134e2565b60405180910390fd5b600d548161174c610b83565b6117569190613531565b1115611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178e906135d3565b60405180910390fd5b8180600c546117a691906135f3565b3410156117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90613699565b60405180910390fd5b600f60009054906101000a900460ff1615611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182f90613705565b60405180910390fd5b6118496118436120b1565b846120b9565b505050565b611856611d90565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118bb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006118c8611d90565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611975611d90565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119ba9190612919565b60405180910390a35050565b6119d1848484610b9a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a33576119fc848484846120d7565b611a32576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600e5481565b611a476127f9565b611a4f6127f9565b611a57611e16565b831080611a6b5750611a676120a8565b8310155b15611a795780915050611aa4565b611a828361207d565b9050806040015115611a975780915050611aa4565b611aa083612237565b9150505b919050565b6060611ab482611d31565b611af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aea90613797565b60405180910390fd5b6000611afd612257565b90506000815111611b1d5760405180602001604052806000815250611b4b565b80611b27846122e9565b600b604051602001611b3b93929190613887565b6040516020818303038152906040525b915050919050565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611c005750600e548111155b611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c36906134e2565b60405180910390fd5b600d5481611c4b610b83565b611c559190613531565b1115611c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8d906135d3565b60405180910390fd5b611c9e611d98565b611ca882846120b9565b505050565b611cb5611d98565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c9061392a565b60405180910390fd5b611d2e81611fb7565b50565b600081611d3c611e16565b11158015611d4b575060005482105b8015611d89575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b611da06120b1565b73ffffffffffffffffffffffffffffffffffffffff16611dbe61141e565b73ffffffffffffffffffffffffffffffffffffffff1614611e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0b90613996565b60405180910390fd5b565b60006001905090565b60008082905080611e2e611e16565b11611eb657600054811015611eb55760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611eb3575b6000811415611ea9576004600083600190039350838152602001908152602001600020549050611e7e565b8092505050611ee8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611f7586868461244a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120856127f9565b6120a16004600084815260200190815260200160002054612453565b9050919050565b60008054905090565b600033905090565b6120d3828260405180602001604052806000815250612509565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120fd611d90565b8786866040518563ffffffff1660e01b815260040161211f9493929190613a0b565b602060405180830381600087803b15801561213957600080fd5b505af192505050801561216a57506040513d601f19601f820116820180604052508101906121679190613a6c565b60015b6121e4573d806000811461219a576040519150601f19603f3d011682016040523d82523d6000602084013e61219f565b606091505b506000815114156121dc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b61223f6127f9565b61225061224b83611e1f565b612453565b9050919050565b6060600a805461226690613383565b80601f016020809104026020016040519081016040528092919081815260200182805461229290613383565b80156122df5780601f106122b4576101008083540402835291602001916122df565b820191906000526020600020905b8154815290600101906020018083116122c257829003601f168201915b5050505050905090565b60606000821415612331576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612445565b600082905060005b6000821461236357808061234c90613a99565b915050600a8261235c9190613b11565b9150612339565b60008167ffffffffffffffff81111561237f5761237e612b4e565b5b6040519080825280601f01601f1916602001820160405280156123b15781602001600182028036833780820191505090505b5090505b6000851461243e576001826123ca9190613b42565b9150600a856123d99190613b76565b60306123e59190613531565b60f81b8183815181106123fb576123fa613467565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124379190613b11565b94506123b5565b8093505050505b919050565b60009392505050565b61245b6127f9565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b61251383836125a6565b60008373ffffffffffffffffffffffffffffffffffffffff163b146125a157600080549050600083820390505b61255360008683806001019450866120d7565b612589576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061254057816000541461259e57600080fd5b50505b505050565b60008054905060008214156125e7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125f46000848385611f58565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061266b8361265c6000866000611f5e565b61266585612763565b17611f86565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461270c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506126d1565b506000821415612748576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061275e6000848385611fb1565b505050565b60006001821460e11b9050919050565b82805461277f90613383565b90600052602060002090601f0160209004810192826127a157600085556127e8565b82601f106127ba57805160ff19168380011785556127e8565b828001600101855582156127e8579182015b828111156127e75782518255916020019190600101906127cc565b5b5090506127f59190612848565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612861576000816000905550600101612849565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6128ae81612879565b81146128b957600080fd5b50565b6000813590506128cb816128a5565b92915050565b6000602082840312156128e7576128e661286f565b5b60006128f5848285016128bc565b91505092915050565b60008115159050919050565b612913816128fe565b82525050565b600060208201905061292e600083018461290a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561296e578082015181840152602081019050612953565b8381111561297d576000848401525b50505050565b6000601f19601f8301169050919050565b600061299f82612934565b6129a9818561293f565b93506129b9818560208601612950565b6129c281612983565b840191505092915050565b600060208201905081810360008301526129e78184612994565b905092915050565b6000819050919050565b612a02816129ef565b8114612a0d57600080fd5b50565b600081359050612a1f816129f9565b92915050565b600060208284031215612a3b57612a3a61286f565b5b6000612a4984828501612a10565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a7d82612a52565b9050919050565b612a8d81612a72565b82525050565b6000602082019050612aa86000830184612a84565b92915050565b612ab781612a72565b8114612ac257600080fd5b50565b600081359050612ad481612aae565b92915050565b60008060408385031215612af157612af061286f565b5b6000612aff85828601612ac5565b9250506020612b1085828601612a10565b9150509250929050565b612b23816129ef565b82525050565b6000602082019050612b3e6000830184612b1a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b8682612983565b810181811067ffffffffffffffff82111715612ba557612ba4612b4e565b5b80604052505050565b6000612bb8612865565b9050612bc48282612b7d565b919050565b600067ffffffffffffffff821115612be457612be3612b4e565b5b612bed82612983565b9050602081019050919050565b82818337600083830152505050565b6000612c1c612c1784612bc9565b612bae565b905082815260208101848484011115612c3857612c37612b49565b5b612c43848285612bfa565b509392505050565b600082601f830112612c6057612c5f612b44565b5b8135612c70848260208601612c09565b91505092915050565b600060208284031215612c8f57612c8e61286f565b5b600082013567ffffffffffffffff811115612cad57612cac612874565b5b612cb984828501612c4b565b91505092915050565b612ccb816128fe565b8114612cd657600080fd5b50565b600081359050612ce881612cc2565b92915050565b600060208284031215612d0457612d0361286f565b5b6000612d1284828501612cd9565b91505092915050565b600080600060608486031215612d3457612d3361286f565b5b6000612d4286828701612ac5565b9350506020612d5386828701612ac5565b9250506040612d6486828701612a10565b9150509250925092565b600080fd5b600080fd5b60008083601f840112612d8e57612d8d612b44565b5b8235905067ffffffffffffffff811115612dab57612daa612d6e565b5b602083019150836020820283011115612dc757612dc6612d73565b5b9250929050565b60008060208385031215612de557612de461286f565b5b600083013567ffffffffffffffff811115612e0357612e02612874565b5b612e0f85828601612d78565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e5081612a72565b82525050565b600067ffffffffffffffff82169050919050565b612e7381612e56565b82525050565b612e82816128fe565b82525050565b600062ffffff82169050919050565b612ea081612e88565b82525050565b608082016000820151612ebc6000850182612e47565b506020820151612ecf6020850182612e6a565b506040820151612ee26040850182612e79565b506060820151612ef56060850182612e97565b50505050565b6000612f078383612ea6565b60808301905092915050565b6000602082019050919050565b6000612f2b82612e1b565b612f358185612e26565b9350612f4083612e37565b8060005b83811015612f71578151612f588882612efb565b9750612f6383612f13565b925050600181019050612f44565b5085935050505092915050565b60006020820190508181036000830152612f988184612f20565b905092915050565b600060208284031215612fb657612fb561286f565b5b6000612fc484828501612ac5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613002816129ef565b82525050565b60006130148383612ff9565b60208301905092915050565b6000602082019050919050565b600061303882612fcd565b6130428185612fd8565b935061304d83612fe9565b8060005b8381101561307e5781516130658882613008565b975061307083613020565b925050600181019050613051565b5085935050505092915050565b600060208201905081810360008301526130a5818461302d565b905092915050565b6000806000606084860312156130c6576130c561286f565b5b60006130d486828701612ac5565b93505060206130e586828701612a10565b92505060406130f686828701612a10565b9150509250925092565b600080604083850312156131175761311661286f565b5b600061312585828601612ac5565b925050602061313685828601612cd9565b9150509250929050565b600067ffffffffffffffff82111561315b5761315a612b4e565b5b61316482612983565b9050602081019050919050565b600061318461317f84613140565b612bae565b9050828152602081018484840111156131a05761319f612b49565b5b6131ab848285612bfa565b509392505050565b600082601f8301126131c8576131c7612b44565b5b81356131d8848260208601613171565b91505092915050565b600080600080608085870312156131fb576131fa61286f565b5b600061320987828801612ac5565b945050602061321a87828801612ac5565b935050604061322b87828801612a10565b925050606085013567ffffffffffffffff81111561324c5761324b612874565b5b613258878288016131b3565b91505092959194509250565b60808201600082015161327a6000850182612e47565b50602082015161328d6020850182612e6a565b5060408201516132a06040850182612e79565b5060608201516132b36060850182612e97565b50505050565b60006080820190506132ce6000830184613264565b92915050565b600080604083850312156132eb576132ea61286f565b5b60006132f985828601612ac5565b925050602061330a85828601612ac5565b9150509250929050565b6000806040838503121561332b5761332a61286f565b5b600061333985828601612a10565b925050602061334a85828601612ac5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061339b57607f821691505b602082108114156133af576133ae613354565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006133eb601f8361293f565b91506133f6826133b5565b602082019050919050565b6000602082019050818103600083015261341a816133de565b9050919050565b600081905092915050565b50565b600061343c600083613421565b91506134478261342c565b600082019050919050565b600061345d8261342f565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006134cc60148361293f565b91506134d782613496565b602082019050919050565b600060208201905081810360008301526134fb816134bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061353c826129ef565b9150613547836129ef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561357c5761357b613502565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006135bd60148361293f565b91506135c882613587565b602082019050919050565b600060208201905081810360008301526135ec816135b0565b9050919050565b60006135fe826129ef565b9150613609836129ef565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561364257613641613502565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b600061368360138361293f565b915061368e8261364d565b602082019050919050565b600060208201905081810360008301526136b281613676565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006136ef60178361293f565b91506136fa826136b9565b602082019050919050565b6000602082019050818103600083015261371e816136e2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613781602f8361293f565b915061378c82613725565b604082019050919050565b600060208201905081810360008301526137b081613774565b9050919050565b600081905092915050565b60006137cd82612934565b6137d781856137b7565b93506137e7818560208601612950565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461381581613383565b61381f81866137b7565b9450600182166000811461383a576001811461384b5761387e565b60ff1983168652818601935061387e565b613854856137f3565b60005b8381101561387657815481890152600182019150602081019050613857565b838801955050505b50505092915050565b600061389382866137c2565b915061389f82856137c2565b91506138ab8284613808565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061391460268361293f565b915061391f826138b8565b604082019050919050565b6000602082019050818103600083015261394381613907565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061398060208361293f565b915061398b8261394a565b602082019050919050565b600060208201905081810360008301526139af81613973565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006139dd826139b6565b6139e781856139c1565b93506139f7818560208601612950565b613a0081612983565b840191505092915050565b6000608082019050613a206000830187612a84565b613a2d6020830186612a84565b613a3a6040830185612b1a565b8181036060830152613a4c81846139d2565b905095945050505050565b600081519050613a66816128a5565b92915050565b600060208284031215613a8257613a8161286f565b5b6000613a9084828501613a57565b91505092915050565b6000613aa4826129ef565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ad757613ad6613502565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b1c826129ef565b9150613b27836129ef565b925082613b3757613b36613ae2565b5b828204905092915050565b6000613b4d826129ef565b9150613b58836129ef565b925082821015613b6b57613b6a613502565b5b828203905092915050565b6000613b81826129ef565b9150613b8c836129ef565b925082613b9c57613b9b613ae2565b5b82820690509291505056fea264697066735822122025b941ca13bf28f6f455ac56825a606c27708ae3d8dac9b4ba916626fdf62bab64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000105265616c204d7574616e742041706573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003524d410000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): Real Mutant Apes
Arg [1] : _tokenSymbol (string): RMA
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [3] : 5265616c204d7574616e74204170657300000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 524d410000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
68771:2481:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27317:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28219:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34702:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34143:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68953:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70885:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70480:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23970:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38409:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70991:150;;;;;;;;;;;;;:::i;:::-;;41322:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70563:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68911:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70795:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63900:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69075:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29612:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68880:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25154:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8065:103;;;;;;;;;;;;;:::i;:::-;;70643:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67776:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7417:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28395:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64816:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69621:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35260:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42105:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69026:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63313:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70101:373;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68991:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35725:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69839:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8323:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27317:639;27402:4;27741:10;27726:25;;:11;:25;;;;:102;;;;27818:10;27803:25;;:11;:25;;;;27726:102;:179;;;;27895:10;27880:25;;:11;:25;;;;27726:179;27706:199;;27317:639;;;:::o;28219:100::-;28273:13;28306:5;28299:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28219:100;:::o;34702:218::-;34778:7;34803:16;34811:7;34803;:16::i;:::-;34798:64;;34828:34;;;;;;;;;;;;;;34798:64;34882:15;:24;34898:7;34882:24;;;;;;;;;;;:30;;;;;;;;;;;;34875:37;;34702:218;;;:::o;34143:400::-;34224:13;34240:16;34248:7;34240;:16::i;:::-;34224:32;;34296:5;34273:28;;:19;:17;:19::i;:::-;:28;;;34269:175;;34321:44;34338:5;34345:19;:17;:19::i;:::-;34321:16;:44::i;:::-;34316:128;;34393:35;;;;;;;;;;;;;;34316:128;34269:175;34489:2;34456:15;:24;34472:7;34456:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34527:7;34523:2;34507:28;;34516:5;34507:28;;;;;;;;;;;;34213:330;34143:400;;:::o;68953:33::-;;;;:::o;70885:100::-;7303:13;:11;:13::i;:::-;70969:10:::1;70957:9;:22;;;;;;;;;;;;:::i;:::-;;70885:100:::0;:::o;70480:77::-;7303:13;:11;:13::i;:::-;70545:6:::1;70536;;:15;;;;;;;;;;;;;;;;;;70480:77:::0;:::o;23970:323::-;24031:7;24259:15;:13;:15::i;:::-;24244:12;;24228:13;;:28;:46;24221:53;;23970:323;:::o;38409:2817::-;38543:27;38573;38592:7;38573:18;:27::i;:::-;38543:57;;38658:4;38617:45;;38633:19;38617:45;;;38613:86;;38671:28;;;;;;;;;;;;;;38613:86;38713:27;38742:23;38769:35;38796:7;38769:26;:35::i;:::-;38712:92;;;;38904:68;38929:15;38946:4;38952:19;:17;:19::i;:::-;38904:24;:68::i;:::-;38899:180;;38992:43;39009:4;39015:19;:17;:19::i;:::-;38992:16;:43::i;:::-;38987:92;;39044:35;;;;;;;;;;;;;;38987:92;38899:180;39110:1;39096:16;;:2;:16;;;39092:52;;;39121:23;;;;;;;;;;;;;;39092:52;39157:43;39179:4;39185:2;39189:7;39198:1;39157:21;:43::i;:::-;39293:15;39290:160;;;39433:1;39412:19;39405:30;39290:160;39830:18;:24;39849:4;39830:24;;;;;;;;;;;;;;;;39828:26;;;;;;;;;;;;39899:18;:22;39918:2;39899:22;;;;;;;;;;;;;;;;39897:24;;;;;;;;;;;40221:146;40258:2;40307:45;40322:4;40328:2;40332:19;40307:14;:45::i;:::-;20369:8;40279:73;40221:18;:146::i;:::-;40192:17;:26;40210:7;40192:26;;;;;;;;;;;:175;;;;40538:1;20369:8;40487:19;:47;:52;40483:627;;;40560:19;40592:1;40582:7;:11;40560:33;;40749:1;40715:17;:30;40733:11;40715:30;;;;;;;;;;;;:35;40711:384;;;40853:13;;40838:11;:28;40834:242;;41033:19;41000:17;:30;41018:11;41000:30;;;;;;;;;;;:52;;;;40834:242;40711:384;40541:569;40483:627;41157:7;41153:2;41138:27;;41147:4;41138:27;;;;;;;;;;;;41176:42;41197:4;41203:2;41207:7;41216:1;41176:20;:42::i;:::-;38532:2694;;;38409:2817;;;:::o;70991:150::-;7303:13;:11;:13::i;:::-;4342:1:::1;4940:7;;:19;;4932:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4342:1;5073:7;:18;;;;71049:7:::2;71070;:5;:7::i;:::-;71062:21;;71091;71062:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71048:69;;;71132:2;71124:11;;;::::0;::::2;;71041:100;4298:1:::1;5252:7;:22;;;;70991:150::o:0;41322:185::-;41460:39;41477:4;41483:2;41487:7;41460:39;;;;;;;;;;;;:16;:39::i;:::-;41322:185;;;:::o;70563:74::-;7303:13;:11;:13::i;:::-;70626:5:::1;70619:4;:12;;;;70563:74:::0;:::o;68911:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70795:84::-;7303:13;:11;:13::i;:::-;70869:4:::1;70859:7;:14;;;;;;;;;;;;:::i;:::-;;70795:84:::0;:::o;63900:528::-;64044:23;64110:22;64135:8;;:15;;64110:40;;64165:34;64223:14;64202:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;64165:73;;64258:9;64253:125;64274:14;64269:1;:19;64253:125;;64330:32;64350:8;;64359:1;64350:11;;;;;;;:::i;:::-;;;;;;;;64330:19;:32::i;:::-;64314:10;64325:1;64314:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;64290:3;;;;;64253:125;;;;64399:10;64392:17;;;;63900:528;;;;:::o;69075:25::-;;;;;;;;;;;;;:::o;29612:152::-;29684:7;29727:27;29746:7;29727:18;:27::i;:::-;29704:52;;29612:152;;;:::o;68880:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25154:233::-;25226:7;25267:1;25250:19;;:5;:19;;;25246:60;;;25278:28;;;;;;;;;;;;;;25246:60;19313:13;25324:18;:25;25343:5;25324:25;;;;;;;;;;;;;;;;:55;25317:62;;25154:233;;;:::o;8065:103::-;7303:13;:11;:13::i;:::-;8130:30:::1;8157:1;8130:18;:30::i;:::-;8065:103::o:0;70643:146::-;7303:13;:11;:13::i;:::-;70760:23:::1;70735:22;:48;;;;70643:146:::0;:::o;67776:900::-;67854:16;67908:19;67942:25;67982:22;68007:16;68017:5;68007:9;:16::i;:::-;67982:41;;68038:25;68080:14;68066:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68038:57;;68110:31;;:::i;:::-;68161:9;68173:15;:13;:15::i;:::-;68161:27;;68156:472;68205:14;68190:11;:29;68156:472;;68257:15;68270:1;68257:12;:15::i;:::-;68245:27;;68295:9;:16;;;68291:73;;;68336:8;;68291:73;68412:1;68386:28;;:9;:14;;;:28;;;68382:111;;68459:9;:14;;;68439:34;;68382:111;68536:5;68515:26;;:17;:26;;;68511:102;;;68592:1;68566:8;68575:13;;;;;;68566:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;68511:102;68156:472;68221:3;;;;;68156:472;;;;68649:8;68642:15;;;;;;;67776:900;;;:::o;7417:87::-;7463:7;7490:6;;;;;;;;;;;7483:13;;7417:87;:::o;28395:104::-;28451:13;28484:7;28477:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28395:104;:::o;64816:2513::-;64959:16;65026:4;65017:5;:13;65013:45;;65039:19;;;;;;;;;;;;;;65013:45;65073:19;65107:17;65127:14;:12;:14::i;:::-;65107:34;;65227:15;:13;:15::i;:::-;65219:5;:23;65215:87;;;65271:15;:13;:15::i;:::-;65263:23;;65215:87;65378:9;65371:4;:16;65367:73;;;65415:9;65408:16;;65367:73;65454:25;65482:16;65492:5;65482:9;:16::i;:::-;65454:44;;65676:4;65668:5;:12;65664:278;;;65701:19;65730:5;65723:4;:12;65701:34;;65772:17;65758:11;:31;65754:111;;;65834:11;65814:31;;65754:111;65682:198;65664:278;;;65925:1;65905:21;;65664:278;65956:25;65998:17;65984:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65956:60;;66056:1;66035:17;:22;66031:78;;;66085:8;66078:15;;;;;;;;66031:78;66253:31;66287:26;66307:5;66287:19;:26::i;:::-;66253:60;;66328:25;66573:9;:16;;;66568:92;;66630:9;:14;;;66610:34;;66568:92;66679:9;66691:5;66679:17;;66674:478;66703:4;66698:1;:9;;:45;;;;;66726:17;66711:11;:32;;66698:45;66674:478;;;66781:15;66794:1;66781:12;:15::i;:::-;66769:27;;66819:9;:16;;;66815:73;;;66860:8;;66815:73;66936:1;66910:28;;:9;:14;;;:28;;;66906:111;;66983:9;:14;;;66963:34;;66906:111;67060:5;67039:26;;:17;:26;;;67035:102;;;67116:1;67090:8;67099:13;;;;;;67090:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;67035:102;66674:478;66745:3;;;;;66674:478;;;;67254:11;67244:8;67237:29;67302:8;67295:15;;;;;;;;64816:2513;;;;;;:::o;69621:212::-;69686:11;69314:1;69300:11;:15;:56;;;;;69334:22;;69319:11;:37;;69300:56;69292:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;69427:9;;69412:11;69396:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;69388:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;69719:11:::1;69566;69559:4;;:18;;;;:::i;:::-;69546:9;:31;;69538:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;69748:6:::2;;;;;;;;;;;69747:7;69739:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;69791:36;69801:12;:10;:12::i;:::-;69815:11;69791:9;:36::i;:::-;69468:1:::1;69621:212:::0;;:::o;35260:308::-;35371:19;:17;:19::i;:::-;35359:31;;:8;:31;;;35355:61;;;35399:17;;;;;;;;;;;;;;35355:61;35481:8;35429:18;:39;35448:19;:17;:19::i;:::-;35429:39;;;;;;;;;;;;;;;:49;35469:8;35429:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;35541:8;35505:55;;35520:19;:17;:19::i;:::-;35505:55;;;35551:8;35505:55;;;;;;:::i;:::-;;;;;;;;35260:308;;:::o;42105:399::-;42272:31;42285:4;42291:2;42295:7;42272:12;:31::i;:::-;42336:1;42318:2;:14;;;:19;42314:183;;42357:56;42388:4;42394:2;42398:7;42407:5;42357:30;:56::i;:::-;42352:145;;42441:40;;;;;;;;;;;;;;42352:145;42314:183;42105:399;;;;:::o;69026:42::-;;;;:::o;63313:428::-;63397:21;;:::i;:::-;63431:31;;:::i;:::-;63487:15;:13;:15::i;:::-;63477:7;:25;:54;;;;63517:14;:12;:14::i;:::-;63506:7;:25;;63477:54;63473:103;;;63555:9;63548:16;;;;;63473:103;63598:21;63611:7;63598:12;:21::i;:::-;63586:33;;63634:9;:16;;;63630:65;;;63674:9;63667:16;;;;;63630:65;63712:21;63725:7;63712:12;:21::i;:::-;63705:28;;;63313:428;;;;:::o;70101:373::-;70175:13;70205:17;70213:8;70205:7;:17::i;:::-;70197:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;70283:28;70314:10;:8;:10::i;:::-;70283:41;;70369:1;70344:14;70338:28;:32;:130;;;;;;;;;;;;;;;;;70406:14;70422:19;:8;:17;:19::i;:::-;70443:9;70389:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70338:130;70331:137;;;70101:373;;;:::o;68991:30::-;;;;:::o;35725:164::-;35822:4;35846:18;:25;35865:5;35846:25;;;;;;;;;;;;;;;:35;35872:8;35846:35;;;;;;;;;;;;;;;;;;;;;;;;;35839:42;;35725:164;;;;:::o;69839:155::-;69925:11;69314:1;69300:11;:15;:56;;;;;69334:22;;69319:11;:37;;69300:56;69292:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;69427:9;;69412:11;69396:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;69388:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7303:13:::1;:11;:13::i;:::-;69955:33:::2;69965:9;69976:11;69955:9;:33::i;:::-;69839:155:::0;;;:::o;8323:201::-;7303:13;:11;:13::i;:::-;8432:1:::1;8412:22;;:8;:22;;;;8404:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8488:28;8507:8;8488:18;:28::i;:::-;8323:201:::0;:::o;36147:282::-;36212:4;36268:7;36249:15;:13;:15::i;:::-;:26;;:66;;;;;36302:13;;36292:7;:23;36249:66;:153;;;;;36401:1;20089:8;36353:17;:26;36371:7;36353:26;;;;;;;;;;;;:44;:49;36249:153;36229:173;;36147:282;;;:::o;57913:105::-;57973:7;58000:10;57993:17;;57913:105;:::o;7582:132::-;7657:12;:10;:12::i;:::-;7646:23;;:7;:5;:7::i;:::-;:23;;;7638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7582:132::o;70000:95::-;70065:7;70088:1;70081:8;;70000:95;:::o;30767:1275::-;30834:7;30854:12;30869:7;30854:22;;30937:4;30918:15;:13;:15::i;:::-;:23;30914:1061;;30971:13;;30964:4;:20;30960:1015;;;31009:14;31026:17;:23;31044:4;31026:23;;;;;;;;;;;;31009:40;;31143:1;20089:8;31115:6;:24;:29;31111:845;;;31780:113;31797:1;31787:6;:11;31780:113;;;31840:17;:25;31858:6;;;;;;;31840:25;;;;;;;;;;;;31831:34;;31780:113;;;31926:6;31919:13;;;;;;31111:845;30986:989;30960:1015;30914:1061;32003:31;;;;;;;;;;;;;;30767:1275;;;;:::o;37310:479::-;37412:27;37441:23;37482:38;37523:15;:24;37539:7;37523:24;;;;;;;;;;;37482:65;;37694:18;37671:41;;37751:19;37745:26;37726:45;;37656:126;37310:479;;;:::o;36538:659::-;36687:11;36852:16;36845:5;36841:28;36832:37;;37012:16;37001:9;36997:32;36984:45;;37162:15;37151:9;37148:30;37140:5;37129:9;37126:20;37123:56;37113:66;;36538:659;;;;;:::o;43166:159::-;;;;;:::o;57222:311::-;57357:7;57377:16;20493:3;57403:19;:41;;57377:68;;20493:3;57471:31;57482:4;57488:2;57492:9;57471:10;:31::i;:::-;57463:40;;:62;;57456:69;;;57222:311;;;;;:::o;32590:450::-;32670:14;32838:16;32831:5;32827:28;32818:37;;33015:5;33001:11;32976:23;32972:41;32969:52;32962:5;32959:63;32949:73;;32590:450;;;;:::o;43990:158::-;;;;;:::o;8684:191::-;8758:16;8777:6;;;;;;;;;;;8758:25;;8803:8;8794:6;;:17;;;;;;;;;;;;;;;;;;8858:8;8827:40;;8848:8;8827:40;;;;;;;;;;;;8747:128;8684:191;:::o;30215:161::-;30283:21;;:::i;:::-;30324:44;30343:17;:24;30361:5;30343:24;;;;;;;;;;;;30324:18;:44::i;:::-;30317:51;;30215:161;;;:::o;23657:103::-;23712:7;23739:13;;23732:20;;23657:103;:::o;5968:98::-;6021:7;6048:10;6041:17;;5968:98;:::o;51745:112::-;51822:27;51832:2;51836:8;51822:27;;;;;;;;;;;;:9;:27::i;:::-;51745:112;;:::o;44588:716::-;44751:4;44797:2;44772:45;;;44818:19;:17;:19::i;:::-;44839:4;44845:7;44854:5;44772:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44768:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45072:1;45055:6;:13;:18;45051:235;;;45101:40;;;;;;;;;;;;;;45051:235;45244:6;45238:13;45229:6;45225:2;45221:15;45214:38;44768:529;44941:54;;;44931:64;;;:6;:64;;;;44924:71;;;44588:716;;;;;;:::o;29953:166::-;30023:21;;:::i;:::-;30064:47;30083:27;30102:7;30083:18;:27::i;:::-;30064:18;:47::i;:::-;30057:54;;29953:166;;;:::o;71147:102::-;71207:13;71236:7;71229:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71147:102;:::o;463:723::-;519:13;749:1;740:5;:10;736:53;;;767:10;;;;;;;;;;;;;;;;;;;;;736:53;799:12;814:5;799:20;;830:14;855:78;870:1;862:4;:9;855:78;;888:8;;;;;:::i;:::-;;;;919:2;911:10;;;;;:::i;:::-;;;855:78;;;943:19;975:6;965:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;943:39;;993:154;1009:1;1000:5;:10;993:154;;1037:1;1027:11;;;;;:::i;:::-;;;1104:2;1096:5;:10;;;;:::i;:::-;1083:2;:24;;;;:::i;:::-;1070:39;;1053:6;1060;1053:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1133:2;1124:11;;;;;:::i;:::-;;;993:154;;;1171:6;1157:21;;;;;463:723;;;;:::o;56923:147::-;57060:6;56923:147;;;;;:::o;32141:366::-;32207:31;;:::i;:::-;32284:6;32251:9;:14;;:41;;;;;;;;;;;19972:3;32337:6;:33;;32303:9;:24;;:68;;;;;;;;;;;32429:1;20089:8;32401:6;:24;:29;;32382:9;:16;;:48;;;;;;;;;;;20493:3;32470:6;:28;;32441:9;:19;;:58;;;;;;;;;;;32141:366;;;:::o;50972:689::-;51103:19;51109:2;51113:8;51103:5;:19::i;:::-;51182:1;51164:2;:14;;;:19;51160:483;;51204:11;51218:13;;51204:27;;51250:13;51272:8;51266:3;:14;51250:30;;51299:233;51330:62;51369:1;51373:2;51377:7;;;;;;51386:5;51330:30;:62::i;:::-;51325:167;;51428:40;;;;;;;;;;;;;;51325:167;51527:3;51519:5;:11;51299:233;;51614:3;51597:13;;:20;51593:34;;51619:8;;;51593:34;51185:458;;51160:483;50972:689;;;:::o;45766:2454::-;45839:20;45862:13;;45839:36;;45902:1;45890:8;:13;45886:44;;;45912:18;;;;;;;;;;;;;;45886:44;45943:61;45973:1;45977:2;45981:12;45995:8;45943:21;:61::i;:::-;46487:1;19451:2;46457:1;:26;;46456:32;46444:8;:45;46418:18;:22;46437:2;46418:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;46766:139;46803:2;46857:33;46880:1;46884:2;46888:1;46857:14;:33::i;:::-;46824:30;46845:8;46824:20;:30::i;:::-;:66;46766:18;:139::i;:::-;46732:17;:31;46750:12;46732:31;;;;;;;;;;;:173;;;;46922:16;46953:11;46982:8;46967:12;:23;46953:37;;47237:16;47233:2;47229:25;47217:37;;47609:12;47569:8;47528:1;47466:25;47407:1;47346;47319:335;47734:1;47720:12;47716:20;47674:346;47775:3;47766:7;47763:16;47674:346;;47993:7;47983:8;47980:1;47953:25;47950:1;47947;47942:59;47828:1;47819:7;47815:15;47804:26;;47674:346;;;47678:77;48065:1;48053:8;:13;48049:45;;;48075:19;;;;;;;;;;;;;;48049:45;48127:3;48111:13;:19;;;;46192:1950;;48152:60;48181:1;48185:2;48189:12;48203:8;48152:20;:60::i;:::-;45828:2392;45766:2454;;:::o;33142:324::-;33212:14;33445:1;33435:8;33432:15;33406:24;33402:46;33392:56;;33142:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:509::-;7465:6;7514:2;7502:9;7493:7;7489:23;7485:32;7482:119;;;7520:79;;:::i;:::-;7482:119;7668:1;7657:9;7653:17;7640:31;7698:18;7690:6;7687:30;7684:117;;;7720:79;;:::i;:::-;7684:117;7825:63;7880:7;7871:6;7860:9;7856:22;7825:63;:::i;:::-;7815:73;;7611:287;7396:509;;;;:::o;7911:116::-;7981:21;7996:5;7981:21;:::i;:::-;7974:5;7971:32;7961:60;;8017:1;8014;8007:12;7961:60;7911:116;:::o;8033:133::-;8076:5;8114:6;8101:20;8092:29;;8130:30;8154:5;8130:30;:::i;:::-;8033:133;;;;:::o;8172:323::-;8228:6;8277:2;8265:9;8256:7;8252:23;8248:32;8245:119;;;8283:79;;:::i;:::-;8245:119;8403:1;8428:50;8470:7;8461:6;8450:9;8446:22;8428:50;:::i;:::-;8418:60;;8374:114;8172:323;;;;:::o;8501:619::-;8578:6;8586;8594;8643:2;8631:9;8622:7;8618:23;8614:32;8611:119;;;8649:79;;:::i;:::-;8611:119;8769:1;8794:53;8839:7;8830:6;8819:9;8815:22;8794:53;:::i;:::-;8784:63;;8740:117;8896:2;8922:53;8967:7;8958:6;8947:9;8943:22;8922:53;:::i;:::-;8912:63;;8867:118;9024:2;9050:53;9095:7;9086:6;9075:9;9071:22;9050:53;:::i;:::-;9040:63;;8995:118;8501:619;;;;;:::o;9126:117::-;9235:1;9232;9225:12;9249:117;9358:1;9355;9348:12;9389:568;9462:8;9472:6;9522:3;9515:4;9507:6;9503:17;9499:27;9489:122;;9530:79;;:::i;:::-;9489:122;9643:6;9630:20;9620:30;;9673:18;9665:6;9662:30;9659:117;;;9695:79;;:::i;:::-;9659:117;9809:4;9801:6;9797:17;9785:29;;9863:3;9855:4;9847:6;9843:17;9833:8;9829:32;9826:41;9823:128;;;9870:79;;:::i;:::-;9823:128;9389:568;;;;;:::o;9963:559::-;10049:6;10057;10106:2;10094:9;10085:7;10081:23;10077:32;10074:119;;;10112:79;;:::i;:::-;10074:119;10260:1;10249:9;10245:17;10232:31;10290:18;10282:6;10279:30;10276:117;;;10312:79;;:::i;:::-;10276:117;10425:80;10497:7;10488:6;10477:9;10473:22;10425:80;:::i;:::-;10407:98;;;;10203:312;9963:559;;;;;:::o;10528:145::-;10626:6;10660:5;10654:12;10644:22;;10528:145;;;:::o;10679:215::-;10809:11;10843:6;10838:3;10831:19;10883:4;10878:3;10874:14;10859:29;;10679:215;;;;:::o;10900:163::-;10998:4;11021:3;11013:11;;11051:4;11046:3;11042:14;11034:22;;10900:163;;;:::o;11069:108::-;11146:24;11164:5;11146:24;:::i;:::-;11141:3;11134:37;11069:108;;:::o;11183:101::-;11219:7;11259:18;11252:5;11248:30;11237:41;;11183:101;;;:::o;11290:105::-;11365:23;11382:5;11365:23;:::i;:::-;11360:3;11353:36;11290:105;;:::o;11401:99::-;11472:21;11487:5;11472:21;:::i;:::-;11467:3;11460:34;11401:99;;:::o;11506:91::-;11542:7;11582:8;11575:5;11571:20;11560:31;;11506:91;;;:::o;11603:105::-;11678:23;11695:5;11678:23;:::i;:::-;11673:3;11666:36;11603:105;;:::o;11786:864::-;11935:4;11930:3;11926:14;12022:4;12015:5;12011:16;12005:23;12041:63;12098:4;12093:3;12089:14;12075:12;12041:63;:::i;:::-;11950:164;12206:4;12199:5;12195:16;12189:23;12225:61;12280:4;12275:3;12271:14;12257:12;12225:61;:::i;:::-;12124:172;12380:4;12373:5;12369:16;12363:23;12399:57;12450:4;12445:3;12441:14;12427:12;12399:57;:::i;:::-;12306:160;12553:4;12546:5;12542:16;12536:23;12572:61;12627:4;12622:3;12618:14;12604:12;12572:61;:::i;:::-;12476:167;11904:746;11786:864;;:::o;12656:303::-;12787:10;12808:108;12912:3;12904:6;12808:108;:::i;:::-;12948:4;12943:3;12939:14;12925:28;;12656:303;;;;:::o;12965:144::-;13066:4;13098;13093:3;13089:14;13081:22;;12965:144;;;:::o;13191:980::-;13372:3;13401:85;13480:5;13401:85;:::i;:::-;13502:117;13612:6;13607:3;13502:117;:::i;:::-;13495:124;;13643:87;13724:5;13643:87;:::i;:::-;13753:7;13784:1;13769:377;13794:6;13791:1;13788:13;13769:377;;;13870:6;13864:13;13897:125;14018:3;14003:13;13897:125;:::i;:::-;13890:132;;14045:91;14129:6;14045:91;:::i;:::-;14035:101;;13829:317;13816:1;13813;13809:9;13804:14;;13769:377;;;13773:14;14162:3;14155:10;;13377:794;;;13191:980;;;;:::o;14177:497::-;14382:4;14420:2;14409:9;14405:18;14397:26;;14469:9;14463:4;14459:20;14455:1;14444:9;14440:17;14433:47;14497:170;14662:4;14653:6;14497:170;:::i;:::-;14489:178;;14177:497;;;;:::o;14680:329::-;14739:6;14788:2;14776:9;14767:7;14763:23;14759:32;14756:119;;;14794:79;;:::i;:::-;14756:119;14914:1;14939:53;14984:7;14975:6;14964:9;14960:22;14939:53;:::i;:::-;14929:63;;14885:117;14680:329;;;;:::o;15015:114::-;15082:6;15116:5;15110:12;15100:22;;15015:114;;;:::o;15135:184::-;15234:11;15268:6;15263:3;15256:19;15308:4;15303:3;15299:14;15284:29;;15135:184;;;;:::o;15325:132::-;15392:4;15415:3;15407:11;;15445:4;15440:3;15436:14;15428:22;;15325:132;;;:::o;15463:108::-;15540:24;15558:5;15540:24;:::i;:::-;15535:3;15528:37;15463:108;;:::o;15577:179::-;15646:10;15667:46;15709:3;15701:6;15667:46;:::i;:::-;15745:4;15740:3;15736:14;15722:28;;15577:179;;;;:::o;15762:113::-;15832:4;15864;15859:3;15855:14;15847:22;;15762:113;;;:::o;15911:732::-;16030:3;16059:54;16107:5;16059:54;:::i;:::-;16129:86;16208:6;16203:3;16129:86;:::i;:::-;16122:93;;16239:56;16289:5;16239:56;:::i;:::-;16318:7;16349:1;16334:284;16359:6;16356:1;16353:13;16334:284;;;16435:6;16429:13;16462:63;16521:3;16506:13;16462:63;:::i;:::-;16455:70;;16548:60;16601:6;16548:60;:::i;:::-;16538:70;;16394:224;16381:1;16378;16374:9;16369:14;;16334:284;;;16338:14;16634:3;16627:10;;16035:608;;;15911:732;;;;:::o;16649:373::-;16792:4;16830:2;16819:9;16815:18;16807:26;;16879:9;16873:4;16869:20;16865:1;16854:9;16850:17;16843:47;16907:108;17010:4;17001:6;16907:108;:::i;:::-;16899:116;;16649:373;;;;:::o;17028:619::-;17105:6;17113;17121;17170:2;17158:9;17149:7;17145:23;17141:32;17138:119;;;17176:79;;:::i;:::-;17138:119;17296:1;17321:53;17366:7;17357:6;17346:9;17342:22;17321:53;:::i;:::-;17311:63;;17267:117;17423:2;17449:53;17494:7;17485:6;17474:9;17470:22;17449:53;:::i;:::-;17439:63;;17394:118;17551:2;17577:53;17622:7;17613:6;17602:9;17598:22;17577:53;:::i;:::-;17567:63;;17522:118;17028:619;;;;;:::o;17653:468::-;17718:6;17726;17775:2;17763:9;17754:7;17750:23;17746:32;17743:119;;;17781:79;;:::i;:::-;17743:119;17901:1;17926:53;17971:7;17962:6;17951:9;17947:22;17926:53;:::i;:::-;17916:63;;17872:117;18028:2;18054:50;18096:7;18087:6;18076:9;18072:22;18054:50;:::i;:::-;18044:60;;17999:115;17653:468;;;;;:::o;18127:307::-;18188:4;18278:18;18270:6;18267:30;18264:56;;;18300:18;;:::i;:::-;18264:56;18338:29;18360:6;18338:29;:::i;:::-;18330:37;;18422:4;18416;18412:15;18404:23;;18127:307;;;:::o;18440:410::-;18517:5;18542:65;18558:48;18599:6;18558:48;:::i;:::-;18542:65;:::i;:::-;18533:74;;18630:6;18623:5;18616:21;18668:4;18661:5;18657:16;18706:3;18697:6;18692:3;18688:16;18685:25;18682:112;;;18713:79;;:::i;:::-;18682:112;18803:41;18837:6;18832:3;18827;18803:41;:::i;:::-;18523:327;18440:410;;;;;:::o;18869:338::-;18924:5;18973:3;18966:4;18958:6;18954:17;18950:27;18940:122;;18981:79;;:::i;:::-;18940:122;19098:6;19085:20;19123:78;19197:3;19189:6;19182:4;19174:6;19170:17;19123:78;:::i;:::-;19114:87;;18930:277;18869:338;;;;:::o;19213:943::-;19308:6;19316;19324;19332;19381:3;19369:9;19360:7;19356:23;19352:33;19349:120;;;19388:79;;:::i;:::-;19349:120;19508:1;19533:53;19578:7;19569:6;19558:9;19554:22;19533:53;:::i;:::-;19523:63;;19479:117;19635:2;19661:53;19706:7;19697:6;19686:9;19682:22;19661:53;:::i;:::-;19651:63;;19606:118;19763:2;19789:53;19834:7;19825:6;19814:9;19810:22;19789:53;:::i;:::-;19779:63;;19734:118;19919:2;19908:9;19904:18;19891:32;19950:18;19942:6;19939:30;19936:117;;;19972:79;;:::i;:::-;19936:117;20077:62;20131:7;20122:6;20111:9;20107:22;20077:62;:::i;:::-;20067:72;;19862:287;19213:943;;;;;;;:::o;20234:874::-;20393:4;20388:3;20384:14;20480:4;20473:5;20469:16;20463:23;20499:63;20556:4;20551:3;20547:14;20533:12;20499:63;:::i;:::-;20408:164;20664:4;20657:5;20653:16;20647:23;20683:61;20738:4;20733:3;20729:14;20715:12;20683:61;:::i;:::-;20582:172;20838:4;20831:5;20827:16;20821:23;20857:57;20908:4;20903:3;20899:14;20885:12;20857:57;:::i;:::-;20764:160;21011:4;21004:5;21000:16;20994:23;21030:61;21085:4;21080:3;21076:14;21062:12;21030:61;:::i;:::-;20934:167;20362:746;20234:874;;:::o;21114:347::-;21269:4;21307:3;21296:9;21292:19;21284:27;;21321:133;21451:1;21440:9;21436:17;21427:6;21321:133;:::i;:::-;21114:347;;;;:::o;21467:474::-;21535:6;21543;21592:2;21580:9;21571:7;21567:23;21563:32;21560:119;;;21598:79;;:::i;:::-;21560:119;21718:1;21743:53;21788:7;21779:6;21768:9;21764:22;21743:53;:::i;:::-;21733:63;;21689:117;21845:2;21871:53;21916:7;21907:6;21896:9;21892:22;21871:53;:::i;:::-;21861:63;;21816:118;21467:474;;;;;:::o;21947:::-;22015:6;22023;22072:2;22060:9;22051:7;22047:23;22043:32;22040:119;;;22078:79;;:::i;:::-;22040:119;22198:1;22223:53;22268:7;22259:6;22248:9;22244:22;22223:53;:::i;:::-;22213:63;;22169:117;22325:2;22351:53;22396:7;22387:6;22376:9;22372:22;22351:53;:::i;:::-;22341:63;;22296:118;21947:474;;;;;:::o;22427:180::-;22475:77;22472:1;22465:88;22572:4;22569:1;22562:15;22596:4;22593:1;22586:15;22613:320;22657:6;22694:1;22688:4;22684:12;22674:22;;22741:1;22735:4;22731:12;22762:18;22752:81;;22818:4;22810:6;22806:17;22796:27;;22752:81;22880:2;22872:6;22869:14;22849:18;22846:38;22843:84;;;22899:18;;:::i;:::-;22843:84;22664:269;22613:320;;;:::o;22939:181::-;23079:33;23075:1;23067:6;23063:14;23056:57;22939:181;:::o;23126:366::-;23268:3;23289:67;23353:2;23348:3;23289:67;:::i;:::-;23282:74;;23365:93;23454:3;23365:93;:::i;:::-;23483:2;23478:3;23474:12;23467:19;;23126:366;;;:::o;23498:419::-;23664:4;23702:2;23691:9;23687:18;23679:26;;23751:9;23745:4;23741:20;23737:1;23726:9;23722:17;23715:47;23779:131;23905:4;23779:131;:::i;:::-;23771:139;;23498:419;;;:::o;23923:147::-;24024:11;24061:3;24046:18;;23923:147;;;;:::o;24076:114::-;;:::o;24196:398::-;24355:3;24376:83;24457:1;24452:3;24376:83;:::i;:::-;24369:90;;24468:93;24557:3;24468:93;:::i;:::-;24586:1;24581:3;24577:11;24570:18;;24196:398;;;:::o;24600:379::-;24784:3;24806:147;24949:3;24806:147;:::i;:::-;24799:154;;24970:3;24963:10;;24600:379;;;:::o;24985:180::-;25033:77;25030:1;25023:88;25130:4;25127:1;25120:15;25154:4;25151:1;25144:15;25171:170;25311:22;25307:1;25299:6;25295:14;25288:46;25171:170;:::o;25347:366::-;25489:3;25510:67;25574:2;25569:3;25510:67;:::i;:::-;25503:74;;25586:93;25675:3;25586:93;:::i;:::-;25704:2;25699:3;25695:12;25688:19;;25347:366;;;:::o;25719:419::-;25885:4;25923:2;25912:9;25908:18;25900:26;;25972:9;25966:4;25962:20;25958:1;25947:9;25943:17;25936:47;26000:131;26126:4;26000:131;:::i;:::-;25992:139;;25719:419;;;:::o;26144:180::-;26192:77;26189:1;26182:88;26289:4;26286:1;26279:15;26313:4;26310:1;26303:15;26330:305;26370:3;26389:20;26407:1;26389:20;:::i;:::-;26384:25;;26423:20;26441:1;26423:20;:::i;:::-;26418:25;;26577:1;26509:66;26505:74;26502:1;26499:81;26496:107;;;26583:18;;:::i;:::-;26496:107;26627:1;26624;26620:9;26613:16;;26330:305;;;;:::o;26641:170::-;26781:22;26777:1;26769:6;26765:14;26758:46;26641:170;:::o;26817:366::-;26959:3;26980:67;27044:2;27039:3;26980:67;:::i;:::-;26973:74;;27056:93;27145:3;27056:93;:::i;:::-;27174:2;27169:3;27165:12;27158:19;;26817:366;;;:::o;27189:419::-;27355:4;27393:2;27382:9;27378:18;27370:26;;27442:9;27436:4;27432:20;27428:1;27417:9;27413:17;27406:47;27470:131;27596:4;27470:131;:::i;:::-;27462:139;;27189:419;;;:::o;27614:348::-;27654:7;27677:20;27695:1;27677:20;:::i;:::-;27672:25;;27711:20;27729:1;27711:20;:::i;:::-;27706:25;;27899:1;27831:66;27827:74;27824:1;27821:81;27816:1;27809:9;27802:17;27798:105;27795:131;;;27906:18;;:::i;:::-;27795:131;27954:1;27951;27947:9;27936:20;;27614:348;;;;:::o;27968:169::-;28108:21;28104:1;28096:6;28092:14;28085:45;27968:169;:::o;28143:366::-;28285:3;28306:67;28370:2;28365:3;28306:67;:::i;:::-;28299:74;;28382:93;28471:3;28382:93;:::i;:::-;28500:2;28495:3;28491:12;28484:19;;28143:366;;;:::o;28515:419::-;28681:4;28719:2;28708:9;28704:18;28696:26;;28768:9;28762:4;28758:20;28754:1;28743:9;28739:17;28732:47;28796:131;28922:4;28796:131;:::i;:::-;28788:139;;28515:419;;;:::o;28940:173::-;29080:25;29076:1;29068:6;29064:14;29057:49;28940:173;:::o;29119:366::-;29261:3;29282:67;29346:2;29341:3;29282:67;:::i;:::-;29275:74;;29358:93;29447:3;29358:93;:::i;:::-;29476:2;29471:3;29467:12;29460:19;;29119:366;;;:::o;29491:419::-;29657:4;29695:2;29684:9;29680:18;29672:26;;29744:9;29738:4;29734:20;29730:1;29719:9;29715:17;29708:47;29772:131;29898:4;29772:131;:::i;:::-;29764:139;;29491:419;;;:::o;29916:234::-;30056:34;30052:1;30044:6;30040:14;30033:58;30125:17;30120:2;30112:6;30108:15;30101:42;29916:234;:::o;30156:366::-;30298:3;30319:67;30383:2;30378:3;30319:67;:::i;:::-;30312:74;;30395:93;30484:3;30395:93;:::i;:::-;30513:2;30508:3;30504:12;30497:19;;30156:366;;;:::o;30528:419::-;30694:4;30732:2;30721:9;30717:18;30709:26;;30781:9;30775:4;30771:20;30767:1;30756:9;30752:17;30745:47;30809:131;30935:4;30809:131;:::i;:::-;30801:139;;30528:419;;;:::o;30953:148::-;31055:11;31092:3;31077:18;;30953:148;;;;:::o;31107:377::-;31213:3;31241:39;31274:5;31241:39;:::i;:::-;31296:89;31378:6;31373:3;31296:89;:::i;:::-;31289:96;;31394:52;31439:6;31434:3;31427:4;31420:5;31416:16;31394:52;:::i;:::-;31471:6;31466:3;31462:16;31455:23;;31217:267;31107:377;;;;:::o;31490:141::-;31539:4;31562:3;31554:11;;31585:3;31582:1;31575:14;31619:4;31616:1;31606:18;31598:26;;31490:141;;;:::o;31661:845::-;31764:3;31801:5;31795:12;31830:36;31856:9;31830:36;:::i;:::-;31882:89;31964:6;31959:3;31882:89;:::i;:::-;31875:96;;32002:1;31991:9;31987:17;32018:1;32013:137;;;;32164:1;32159:341;;;;31980:520;;32013:137;32097:4;32093:9;32082;32078:25;32073:3;32066:38;32133:6;32128:3;32124:16;32117:23;;32013:137;;32159:341;32226:38;32258:5;32226:38;:::i;:::-;32286:1;32300:154;32314:6;32311:1;32308:13;32300:154;;;32388:7;32382:14;32378:1;32373:3;32369:11;32362:35;32438:1;32429:7;32425:15;32414:26;;32336:4;32333:1;32329:12;32324:17;;32300:154;;;32483:6;32478:3;32474:16;32467:23;;32166:334;;31980:520;;31768:738;;31661:845;;;;:::o;32512:589::-;32737:3;32759:95;32850:3;32841:6;32759:95;:::i;:::-;32752:102;;32871:95;32962:3;32953:6;32871:95;:::i;:::-;32864:102;;32983:92;33071:3;33062:6;32983:92;:::i;:::-;32976:99;;33092:3;33085:10;;32512:589;;;;;;:::o;33107:225::-;33247:34;33243:1;33235:6;33231:14;33224:58;33316:8;33311:2;33303:6;33299:15;33292:33;33107:225;:::o;33338:366::-;33480:3;33501:67;33565:2;33560:3;33501:67;:::i;:::-;33494:74;;33577:93;33666:3;33577:93;:::i;:::-;33695:2;33690:3;33686:12;33679:19;;33338:366;;;:::o;33710:419::-;33876:4;33914:2;33903:9;33899:18;33891:26;;33963:9;33957:4;33953:20;33949:1;33938:9;33934:17;33927:47;33991:131;34117:4;33991:131;:::i;:::-;33983:139;;33710:419;;;:::o;34135:182::-;34275:34;34271:1;34263:6;34259:14;34252:58;34135:182;:::o;34323:366::-;34465:3;34486:67;34550:2;34545:3;34486:67;:::i;:::-;34479:74;;34562:93;34651:3;34562:93;:::i;:::-;34680:2;34675:3;34671:12;34664:19;;34323:366;;;:::o;34695:419::-;34861:4;34899:2;34888:9;34884:18;34876:26;;34948:9;34942:4;34938:20;34934:1;34923:9;34919:17;34912:47;34976:131;35102:4;34976:131;:::i;:::-;34968:139;;34695:419;;;:::o;35120:98::-;35171:6;35205:5;35199:12;35189:22;;35120:98;;;:::o;35224:168::-;35307:11;35341:6;35336:3;35329:19;35381:4;35376:3;35372:14;35357:29;;35224:168;;;;:::o;35398:360::-;35484:3;35512:38;35544:5;35512:38;:::i;:::-;35566:70;35629:6;35624:3;35566:70;:::i;:::-;35559:77;;35645:52;35690:6;35685:3;35678:4;35671:5;35667:16;35645:52;:::i;:::-;35722:29;35744:6;35722:29;:::i;:::-;35717:3;35713:39;35706:46;;35488:270;35398:360;;;;:::o;35764:640::-;35959:4;35997:3;35986:9;35982:19;35974:27;;36011:71;36079:1;36068:9;36064:17;36055:6;36011:71;:::i;:::-;36092:72;36160:2;36149:9;36145:18;36136:6;36092:72;:::i;:::-;36174;36242:2;36231:9;36227:18;36218:6;36174:72;:::i;:::-;36293:9;36287:4;36283:20;36278:2;36267:9;36263:18;36256:48;36321:76;36392:4;36383:6;36321:76;:::i;:::-;36313:84;;35764:640;;;;;;;:::o;36410:141::-;36466:5;36497:6;36491:13;36482:22;;36513:32;36539:5;36513:32;:::i;:::-;36410:141;;;;:::o;36557:349::-;36626:6;36675:2;36663:9;36654:7;36650:23;36646:32;36643:119;;;36681:79;;:::i;:::-;36643:119;36801:1;36826:63;36881:7;36872:6;36861:9;36857:22;36826:63;:::i;:::-;36816:73;;36772:127;36557:349;;;;:::o;36912:233::-;36951:3;36974:24;36992:5;36974:24;:::i;:::-;36965:33;;37020:66;37013:5;37010:77;37007:103;;;37090:18;;:::i;:::-;37007:103;37137:1;37130:5;37126:13;37119:20;;36912:233;;;:::o;37151:180::-;37199:77;37196:1;37189:88;37296:4;37293:1;37286:15;37320:4;37317:1;37310:15;37337:185;37377:1;37394:20;37412:1;37394:20;:::i;:::-;37389:25;;37428:20;37446:1;37428:20;:::i;:::-;37423:25;;37467:1;37457:35;;37472:18;;:::i;:::-;37457:35;37514:1;37511;37507:9;37502:14;;37337:185;;;;:::o;37528:191::-;37568:4;37588:20;37606:1;37588:20;:::i;:::-;37583:25;;37622:20;37640:1;37622:20;:::i;:::-;37617:25;;37661:1;37658;37655:8;37652:34;;;37666:18;;:::i;:::-;37652:34;37711:1;37708;37704:9;37696:17;;37528:191;;;;:::o;37725:176::-;37757:1;37774:20;37792:1;37774:20;:::i;:::-;37769:25;;37808:20;37826:1;37808:20;:::i;:::-;37803:25;;37847:1;37837:35;;37852:18;;:::i;:::-;37837:35;37893:1;37890;37886:9;37881:14;;37725:176;;;;:::o
Swarm Source
ipfs://25b941ca13bf28f6f455ac56825a606c27708ae3d8dac9b4ba916626fdf62bab
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.