ERC-721
Overview
Max Total Supply
888 PD
Holders
617
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 PDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PixelDanson
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-12 */ /** ██▓███ ██▓▒██ ██▒▓█████ ██▓ ▓██░ ██▒▓██▒▒▒ █ █ ▒░▓█ ▀ ▓██▒ ▓██░ ██▓▒▒██▒░░ █ ░▒███ ▒██░ ▒██▄█▓▒ ▒░██░ ░ █ █ ▒ ▒▓█ ▄ ▒██░ ▒██▒ ░ ░░██░▒██▒ ▒██▒░▒████▒░██████▒ ▒▓▒░ ░ ░░▓ ▒▒ ░ ░▓ ░░░ ▒░ ░░ ▒░▓ ░ ░▒ ░ ▒ ░░░ ░▒ ░ ░ ░ ░░ ░ ▒ ░ ░░ ▒ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ▓█████▄ ▄▄▄ ███▄ █ ██████ ▒█████ ███▄ █ ▒██▀ ██▌▒████▄ ██ ▀█ █ ▒██ ▒ ▒██▒ ██▒ ██ ▀█ █ ░██ █▌▒██ ▀█▄ ▓██ ▀█ ██▒░ ▓██▄ ▒██░ ██▒▓██ ▀█ ██▒ ░▓█▄ ▌░██▄▄▄▄██ ▓██▒ ▐▌██▒ ▒ ██▒▒██ ██░▓██▒ ▐▌██▒ ░▒████▓ ▓█ ▓██▒▒██░ ▓██░▒██████▒▒░ ████▓▒░▒██░ ▓██░ ▒▒▓ ▒ ▒▒ ▓▒█░░ ▒░ ▒ ▒ ▒ ▒▓▒ ▒ ░░ ▒░▒░▒░ ░ ▒░ ▒ ▒ ░ ▒ ▒ ▒ ▒▒ ░░ ░░ ░ ▒░░ ░▒ ░ ░ ░ ▒ ▒░ ░ ░░ ░ ▒░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ https://twitter.com/PixelDanson */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } /** * @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). */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } _; } } /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } contract PixelDanson is ERC721A, DefaultOperatorFilterer { mapping(uint256 => uint256) blockFree; mapping(address => bool) minted; uint256 public maxSupply = 888; uint256 public maxPerTx = 8; uint256 public price = 0.0025 ether; uint256 public royalty = 50; bool pause; function mint(uint256 amount) payable public { require(totalSupply() + amount <= maxSupply); require(amount <= maxPerTx); _mint(amount); } string uri = "ipfs://bafybeidb7aaope3v73h3tuh2vn3e2ivfxmk3u2gehw4sxfbim6axep3c4i/"; function setUri(string memory _uri) external onlyOwner { uri = _uri; } address owner; modifier onlyOwner { require(owner == msg.sender); _; } constructor() ERC721A("Pixel Danson", "PD") { owner = msg.sender; } function _mint(uint256 amount) internal { require(msg.sender == tx.origin); if (msg.value == 0) { uint256 freeNum = (maxSupply - totalSupply()) / 12; require(blockFree[block.number] + 1 <= freeNum); blockFree[block.number] += 1; _safeMint(msg.sender, 1); return; } require(msg.value >= amount * price); _safeMint(msg.sender, amount); } function reserve(uint16 _mintAmount, address _receiver) external onlyOwner { uint16 totalSupply = uint16(totalSupply()); require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply."); _safeMint(_receiver , _mintAmount); } function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual returns (address, uint256) { uint256 royaltyAmount = (_salePrice * royalty) / 1000; return (owner, royaltyAmount); } function tokenURI(uint256 tokenId) public view override returns (string memory) { return string(abi.encodePacked(uri, _toString(tokenId), ".json")); } function withdraw() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","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":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_mintAmount","type":"uint16"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052610378600a556008600b556608e1bc9bf04000600c556032600d55604051806080016040528060438152602001620035de60439139600f9081620000499190620005d4565b503480156200005757600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600c81526020017f506978656c2044616e736f6e00000000000000000000000000000000000000008152506040518060400160405280600281526020017f50440000000000000000000000000000000000000000000000000000000000008152508160029081620000ec9190620005d4565b508060039081620000fe9190620005d4565b506200010f6200035560201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200030c578015620001d2576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200019892919062000700565b600060405180830381600087803b158015620001b357600080fd5b505af1158015620001c8573d6000803e3d6000fd5b505050506200030b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200028c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200025292919062000700565b600060405180830381600087803b1580156200026d57600080fd5b505af115801562000282573d6000803e3d6000fd5b505050506200030a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002d591906200072d565b600060405180830381600087803b158015620002f057600080fd5b505af115801562000305573d6000803e3d6000fd5b505050505b5b5b505033601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200074a565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003dc57607f821691505b602082108103620003f257620003f162000394565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200045c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200041d565b6200046886836200041d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004b5620004af620004a98462000480565b6200048a565b62000480565b9050919050565b6000819050919050565b620004d18362000494565b620004e9620004e082620004bc565b8484546200042a565b825550505050565b600090565b62000500620004f1565b6200050d818484620004c6565b505050565b5b81811015620005355762000529600082620004f6565b60018101905062000513565b5050565b601f82111562000584576200054e81620003f8565b62000559846200040d565b8101602085101562000569578190505b6200058162000578856200040d565b83018262000512565b50505b505050565b600082821c905092915050565b6000620005a96000198460080262000589565b1980831691505092915050565b6000620005c4838362000596565b9150826002028217905092915050565b620005df826200035a565b67ffffffffffffffff811115620005fb57620005fa62000365565b5b620006078254620003c3565b6200061482828562000539565b600060209050601f8311600181146200064c576000841562000637578287015190505b620006438582620005b6565b865550620006b3565b601f1984166200065c86620003f8565b60005b8281101562000686578489015182556001820191506020850194506020810190506200065f565b86831015620006a65784890151620006a2601f89168262000596565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006e882620006bb565b9050919050565b620006fa81620006db565b82525050565b6000604082019050620007176000830185620006ef565b620007266020830184620006ef565b9392505050565b6000602082019050620007446000830184620006ef565b92915050565b612e84806200075a6000396000f3fe60806040526004361061014b5760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde1461045d578063bad0ba6f14610479578063c87b56dd146104a2578063d5abeb01146104df578063e985e9c51461050a578063f968adbe146105475761014b565b806370a082311461035c57806395d89b41146103995780639b642de1146103c4578063a035b1fe146103ed578063a0712d6814610418578063a22cb465146104345761014b565b806329ee566c1161010857806329ee566c146102585780632a55205a146102835780633ccfd60b146102c157806341f43434146102d857806342842e0e146103035780636352211e1461031f5761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021157806323b872dd1461023c575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190611f82565b610572565b6040516101849190611fca565b60405180910390f35b34801561019957600080fd5b506101a2610604565b6040516101af9190612075565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906120cd565b610696565b6040516101ec919061213b565b60405180910390f35b61020f600480360381019061020a9190612182565b610715565b005b34801561021d57600080fd5b5061022661081f565b60405161023391906121d1565b60405180910390f35b610256600480360381019061025191906121ec565b610836565b005b34801561026457600080fd5b5061026d610986565b60405161027a91906121d1565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a5919061223f565b61098c565b6040516102b892919061227f565b60405180910390f35b3480156102cd57600080fd5b506102d66109de565b005b3480156102e457600080fd5b506102ed610a81565b6040516102fa9190612307565b60405180910390f35b61031d600480360381019061031891906121ec565b610a93565b005b34801561032b57600080fd5b50610346600480360381019061034191906120cd565b610be3565b604051610353919061213b565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190612322565b610bf5565b60405161039091906121d1565b60405180910390f35b3480156103a557600080fd5b506103ae610cad565b6040516103bb9190612075565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190612484565b610d3f565b005b3480156103f957600080fd5b50610402610dac565b60405161040f91906121d1565b60405180910390f35b610432600480360381019061042d91906120cd565b610db2565b005b34801561044057600080fd5b5061045b600480360381019061045691906124f9565b610dee565b005b610477600480360381019061047291906125da565b610ef8565b005b34801561048557600080fd5b506104a0600480360381019061049b9190612697565b61104b565b005b3480156104ae57600080fd5b506104c960048036038101906104c491906120cd565b611118565b6040516104d69190612075565b60405180910390f35b3480156104eb57600080fd5b506104f461114c565b60405161050191906121d1565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906126d7565b611152565b60405161053e9190611fca565b60405180910390f35b34801561055357600080fd5b5061055c6111e6565b60405161056991906121d1565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105cd57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105fd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461061390612746565b80601f016020809104026020016040519081016040528092919081815260200182805461063f90612746565b801561068c5780601f106106615761010080835404028352916020019161068c565b820191906000526020600020905b81548152906001019060200180831161066f57829003601f168201915b5050505050905090565b60006106a1826111ec565b6106d7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610810576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161078d929190612777565b602060405180830381865afa1580156107aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ce91906127b5565b61080f57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610806919061213b565b60405180910390fd5b5b61081a838361124b565b505050565b600061082961138f565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610974573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108a8576108a3848484611394565b610980565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016108f1929190612777565b602060405180830381865afa15801561090e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093291906127b5565b61097357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161096a919061213b565b60405180910390fd5b5b61097f848484611394565b5b50505050565b600d5481565b60008060006103e8600d54856109a29190612811565b6109ac9190612882565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a3857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610a7e573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610bd1573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b0557610b008484846116b6565b610bdd565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610b4e929190612777565b602060405180830381865afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f91906127b5565b610bd057336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610bc7919061213b565b60405180910390fd5b5b610bdc8484846116b6565b5b50505050565b6000610bee826116d6565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c5c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b606060038054610cbc90612746565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce890612746565b8015610d355780601f10610d0a57610100808354040283529160200191610d35565b820191906000526020600020905b815481529060010190602001808311610d1857829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d9957600080fd5b80600f9081610da89190612a55565b5050565b600c5481565b600a5481610dbe61081f565b610dc89190612b27565b1115610dd357600080fd5b600b54811115610de257600080fd5b610deb816117a2565b50565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ee9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e66929190612777565b602060405180830381865afa158015610e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea791906127b5565b610ee857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610edf919061213b565b60405180910390fd5b5b610ef38383611897565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611037573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f6b57610f66858585856119a2565b611044565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610fb4929190612777565b602060405180830381865afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff591906127b5565b61103657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161102d919061213b565b60405180910390fd5b5b611043858585856119a2565b5b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110a557600080fd5b60006110af61081f565b9050600a5483826110c09190612b5b565b61ffff161115611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90612bdd565b60405180910390fd5b611113828461ffff16611a15565b505050565b6060600f61112583611a33565b604051602001611136929190612d08565b6040516020818303038152906040529050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b6000816111f761138f565b11158015611206575060005482105b8015611244575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061125682610be3565b90508073ffffffffffffffffffffffffffffffffffffffff16611277611a83565b73ffffffffffffffffffffffffffffffffffffffff16146112da576112a38161129e611a83565b611152565b6112d9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061139f826116d6565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611406576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061141284611a8b565b915091506114288187611423611a83565b611ab2565b6114745761143d86611438611a83565b611152565b611473576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114da576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114e78686866001611af6565b80156114f257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506115c08561159c888887611afc565b7c020000000000000000000000000000000000000000000000000000000017611b24565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036116465760006001850190506000600460008381526020019081526020016000205403611644576000548114611643578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116ae8686866001611b4f565b505050505050565b6116d183838360405180602001604052806000815250610ef8565b505050565b600080829050806116e561138f565b1161176b5760005481101561176a5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611768575b6000810361175e576004600083600190039350838152602001908152602001600020549050611734565b809250505061179d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117da57600080fd5b6000340361186f576000600c6117ee61081f565b600a546117fb9190612d37565b6118059190612882565b905080600160086000438152602001908152602001600020546118289190612b27565b111561183357600080fd5b60016008600043815260200190815260200160002060008282546118579190612b27565b92505081905550611869336001611a15565b50611894565b600c548161187d9190612811565b34101561188957600080fd5b6118933382611a15565b5b50565b80600760006118a4611a83565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611951611a83565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119969190611fca565b60405180910390a35050565b6119ad848484610836565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a0f576119d884848484611b55565b611a0e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611a2f828260405180602001604052806000815250611ca5565b5050565b606060a060405101806040526020810391506000825281835b600115611a6e57600184039350600a81066030018453600a8104905080611a4c575b50828103602084039350808452505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611b13868684611d42565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b7b611a83565b8786866040518563ffffffff1660e01b8152600401611b9d9493929190612dc0565b6020604051808303816000875af1925050508015611bd957506040513d601f19601f82011682018060405250810190611bd69190612e21565b60015b611c52573d8060008114611c09576040519150601f19603f3d011682016040523d82523d6000602084013e611c0e565b606091505b506000815103611c4a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b611caf8383611d4b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d3d57600080549050600083820390505b611cef6000868380600101945086611b55565b611d25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611cdc578160005414611d3a57600080fd5b50505b505050565b60009392505050565b60008054905060008203611d8b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d986000848385611af6565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611e0f83611e006000866000611afc565b611e0985611f06565b17611b24565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611eb057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611e75565b5060008203611eeb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611f016000848385611b4f565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f5f81611f2a565b8114611f6a57600080fd5b50565b600081359050611f7c81611f56565b92915050565b600060208284031215611f9857611f97611f20565b5b6000611fa684828501611f6d565b91505092915050565b60008115159050919050565b611fc481611faf565b82525050565b6000602082019050611fdf6000830184611fbb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561201f578082015181840152602081019050612004565b60008484015250505050565b6000601f19601f8301169050919050565b600061204782611fe5565b6120518185611ff0565b9350612061818560208601612001565b61206a8161202b565b840191505092915050565b6000602082019050818103600083015261208f818461203c565b905092915050565b6000819050919050565b6120aa81612097565b81146120b557600080fd5b50565b6000813590506120c7816120a1565b92915050565b6000602082840312156120e3576120e2611f20565b5b60006120f1848285016120b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612125826120fa565b9050919050565b6121358161211a565b82525050565b6000602082019050612150600083018461212c565b92915050565b61215f8161211a565b811461216a57600080fd5b50565b60008135905061217c81612156565b92915050565b6000806040838503121561219957612198611f20565b5b60006121a78582860161216d565b92505060206121b8858286016120b8565b9150509250929050565b6121cb81612097565b82525050565b60006020820190506121e660008301846121c2565b92915050565b60008060006060848603121561220557612204611f20565b5b60006122138682870161216d565b93505060206122248682870161216d565b9250506040612235868287016120b8565b9150509250925092565b6000806040838503121561225657612255611f20565b5b6000612264858286016120b8565b9250506020612275858286016120b8565b9150509250929050565b6000604082019050612294600083018561212c565b6122a160208301846121c2565b9392505050565b6000819050919050565b60006122cd6122c86122c3846120fa565b6122a8565b6120fa565b9050919050565b60006122df826122b2565b9050919050565b60006122f1826122d4565b9050919050565b612301816122e6565b82525050565b600060208201905061231c60008301846122f8565b92915050565b60006020828403121561233857612337611f20565b5b60006123468482850161216d565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123918261202b565b810181811067ffffffffffffffff821117156123b0576123af612359565b5b80604052505050565b60006123c3611f16565b90506123cf8282612388565b919050565b600067ffffffffffffffff8211156123ef576123ee612359565b5b6123f88261202b565b9050602081019050919050565b82818337600083830152505050565b6000612427612422846123d4565b6123b9565b90508281526020810184848401111561244357612442612354565b5b61244e848285612405565b509392505050565b600082601f83011261246b5761246a61234f565b5b813561247b848260208601612414565b91505092915050565b60006020828403121561249a57612499611f20565b5b600082013567ffffffffffffffff8111156124b8576124b7611f25565b5b6124c484828501612456565b91505092915050565b6124d681611faf565b81146124e157600080fd5b50565b6000813590506124f3816124cd565b92915050565b600080604083850312156125105761250f611f20565b5b600061251e8582860161216d565b925050602061252f858286016124e4565b9150509250929050565b600067ffffffffffffffff82111561255457612553612359565b5b61255d8261202b565b9050602081019050919050565b600061257d61257884612539565b6123b9565b90508281526020810184848401111561259957612598612354565b5b6125a4848285612405565b509392505050565b600082601f8301126125c1576125c061234f565b5b81356125d184826020860161256a565b91505092915050565b600080600080608085870312156125f4576125f3611f20565b5b60006126028782880161216d565b94505060206126138782880161216d565b9350506040612624878288016120b8565b925050606085013567ffffffffffffffff81111561264557612644611f25565b5b612651878288016125ac565b91505092959194509250565b600061ffff82169050919050565b6126748161265d565b811461267f57600080fd5b50565b6000813590506126918161266b565b92915050565b600080604083850312156126ae576126ad611f20565b5b60006126bc85828601612682565b92505060206126cd8582860161216d565b9150509250929050565b600080604083850312156126ee576126ed611f20565b5b60006126fc8582860161216d565b925050602061270d8582860161216d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275e57607f821691505b60208210810361277157612770612717565b5b50919050565b600060408201905061278c600083018561212c565b612799602083018461212c565b9392505050565b6000815190506127af816124cd565b92915050565b6000602082840312156127cb576127ca611f20565b5b60006127d9848285016127a0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061281c82612097565b915061282783612097565b925082820261283581612097565b9150828204841483151761284c5761284b6127e2565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061288d82612097565b915061289883612097565b9250826128a8576128a7612853565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128d8565b61291f86836128d8565b95508019841693508086168417925050509392505050565b600061295261294d61294884612097565b6122a8565b612097565b9050919050565b6000819050919050565b61296c83612937565b61298061297882612959565b8484546128e5565b825550505050565b600090565b612995612988565b6129a0818484612963565b505050565b5b818110156129c4576129b960008261298d565b6001810190506129a6565b5050565b601f821115612a09576129da816128b3565b6129e3846128c8565b810160208510156129f2578190505b612a066129fe856128c8565b8301826129a5565b50505b505050565b600082821c905092915050565b6000612a2c60001984600802612a0e565b1980831691505092915050565b6000612a458383612a1b565b9150826002028217905092915050565b612a5e82611fe5565b67ffffffffffffffff811115612a7757612a76612359565b5b612a818254612746565b612a8c8282856129c8565b600060209050601f831160018114612abf5760008415612aad578287015190505b612ab78582612a39565b865550612b1f565b601f198416612acd866128b3565b60005b82811015612af557848901518255600182019150602085019450602081019050612ad0565b86831015612b125784890151612b0e601f891682612a1b565b8355505b6001600288020188555050505b505050505050565b6000612b3282612097565b9150612b3d83612097565b9250828201905080821115612b5557612b546127e2565b5b92915050565b6000612b668261265d565b9150612b718361265d565b9250828201905061ffff811115612b8b57612b8a6127e2565b5b92915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000612bc7601383611ff0565b9150612bd282612b91565b602082019050919050565b60006020820190508181036000830152612bf681612bba565b9050919050565b600081905092915050565b60008154612c1581612746565b612c1f8186612bfd565b94506001821660008114612c3a5760018114612c4f57612c82565b60ff1983168652811515820286019350612c82565b612c58856128b3565b60005b83811015612c7a57815481890152600182019150602081019050612c5b565b838801955050505b50505092915050565b6000612c9682611fe5565b612ca08185612bfd565b9350612cb0818560208601612001565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612cf2600583612bfd565b9150612cfd82612cbc565b600582019050919050565b6000612d148285612c08565b9150612d208284612c8b565b9150612d2b82612ce5565b91508190509392505050565b6000612d4282612097565b9150612d4d83612097565b9250828203905081811115612d6557612d646127e2565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000612d9282612d6b565b612d9c8185612d76565b9350612dac818560208601612001565b612db58161202b565b840191505092915050565b6000608082019050612dd5600083018761212c565b612de2602083018661212c565b612def60408301856121c2565b8181036060830152612e018184612d87565b905095945050505050565b600081519050612e1b81611f56565b92915050565b600060208284031215612e3757612e36611f20565b5b6000612e4584828501612e0c565b9150509291505056fea26469706673582212203b40a0e03cd3ed3950963516a6dc6e7c99798e5cb2285dec2d2b0d511893967264736f6c63430008110033697066733a2f2f6261667962656964623761616f706533763733683374756832766e336532697666786d6b337532676568773473786662696d3661786570336334692f
Deployed Bytecode
0x60806040526004361061014b5760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde1461045d578063bad0ba6f14610479578063c87b56dd146104a2578063d5abeb01146104df578063e985e9c51461050a578063f968adbe146105475761014b565b806370a082311461035c57806395d89b41146103995780639b642de1146103c4578063a035b1fe146103ed578063a0712d6814610418578063a22cb465146104345761014b565b806329ee566c1161010857806329ee566c146102585780632a55205a146102835780633ccfd60b146102c157806341f43434146102d857806342842e0e146103035780636352211e1461031f5761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021157806323b872dd1461023c575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190611f82565b610572565b6040516101849190611fca565b60405180910390f35b34801561019957600080fd5b506101a2610604565b6040516101af9190612075565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906120cd565b610696565b6040516101ec919061213b565b60405180910390f35b61020f600480360381019061020a9190612182565b610715565b005b34801561021d57600080fd5b5061022661081f565b60405161023391906121d1565b60405180910390f35b610256600480360381019061025191906121ec565b610836565b005b34801561026457600080fd5b5061026d610986565b60405161027a91906121d1565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a5919061223f565b61098c565b6040516102b892919061227f565b60405180910390f35b3480156102cd57600080fd5b506102d66109de565b005b3480156102e457600080fd5b506102ed610a81565b6040516102fa9190612307565b60405180910390f35b61031d600480360381019061031891906121ec565b610a93565b005b34801561032b57600080fd5b50610346600480360381019061034191906120cd565b610be3565b604051610353919061213b565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190612322565b610bf5565b60405161039091906121d1565b60405180910390f35b3480156103a557600080fd5b506103ae610cad565b6040516103bb9190612075565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190612484565b610d3f565b005b3480156103f957600080fd5b50610402610dac565b60405161040f91906121d1565b60405180910390f35b610432600480360381019061042d91906120cd565b610db2565b005b34801561044057600080fd5b5061045b600480360381019061045691906124f9565b610dee565b005b610477600480360381019061047291906125da565b610ef8565b005b34801561048557600080fd5b506104a0600480360381019061049b9190612697565b61104b565b005b3480156104ae57600080fd5b506104c960048036038101906104c491906120cd565b611118565b6040516104d69190612075565b60405180910390f35b3480156104eb57600080fd5b506104f461114c565b60405161050191906121d1565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906126d7565b611152565b60405161053e9190611fca565b60405180910390f35b34801561055357600080fd5b5061055c6111e6565b60405161056991906121d1565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105cd57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105fd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461061390612746565b80601f016020809104026020016040519081016040528092919081815260200182805461063f90612746565b801561068c5780601f106106615761010080835404028352916020019161068c565b820191906000526020600020905b81548152906001019060200180831161066f57829003601f168201915b5050505050905090565b60006106a1826111ec565b6106d7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610810576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161078d929190612777565b602060405180830381865afa1580156107aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ce91906127b5565b61080f57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610806919061213b565b60405180910390fd5b5b61081a838361124b565b505050565b600061082961138f565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610974573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108a8576108a3848484611394565b610980565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016108f1929190612777565b602060405180830381865afa15801561090e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093291906127b5565b61097357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161096a919061213b565b60405180910390fd5b5b61097f848484611394565b5b50505050565b600d5481565b60008060006103e8600d54856109a29190612811565b6109ac9190612882565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a3857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610a7e573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610bd1573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b0557610b008484846116b6565b610bdd565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610b4e929190612777565b602060405180830381865afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f91906127b5565b610bd057336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610bc7919061213b565b60405180910390fd5b5b610bdc8484846116b6565b5b50505050565b6000610bee826116d6565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c5c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b606060038054610cbc90612746565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce890612746565b8015610d355780601f10610d0a57610100808354040283529160200191610d35565b820191906000526020600020905b815481529060010190602001808311610d1857829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d9957600080fd5b80600f9081610da89190612a55565b5050565b600c5481565b600a5481610dbe61081f565b610dc89190612b27565b1115610dd357600080fd5b600b54811115610de257600080fd5b610deb816117a2565b50565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ee9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e66929190612777565b602060405180830381865afa158015610e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea791906127b5565b610ee857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610edf919061213b565b60405180910390fd5b5b610ef38383611897565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611037573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f6b57610f66858585856119a2565b611044565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610fb4929190612777565b602060405180830381865afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff591906127b5565b61103657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161102d919061213b565b60405180910390fd5b5b611043858585856119a2565b5b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110a557600080fd5b60006110af61081f565b9050600a5483826110c09190612b5b565b61ffff161115611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90612bdd565b60405180910390fd5b611113828461ffff16611a15565b505050565b6060600f61112583611a33565b604051602001611136929190612d08565b6040516020818303038152906040529050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b6000816111f761138f565b11158015611206575060005482105b8015611244575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061125682610be3565b90508073ffffffffffffffffffffffffffffffffffffffff16611277611a83565b73ffffffffffffffffffffffffffffffffffffffff16146112da576112a38161129e611a83565b611152565b6112d9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061139f826116d6565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611406576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061141284611a8b565b915091506114288187611423611a83565b611ab2565b6114745761143d86611438611a83565b611152565b611473576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114da576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114e78686866001611af6565b80156114f257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506115c08561159c888887611afc565b7c020000000000000000000000000000000000000000000000000000000017611b24565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036116465760006001850190506000600460008381526020019081526020016000205403611644576000548114611643578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116ae8686866001611b4f565b505050505050565b6116d183838360405180602001604052806000815250610ef8565b505050565b600080829050806116e561138f565b1161176b5760005481101561176a5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611768575b6000810361175e576004600083600190039350838152602001908152602001600020549050611734565b809250505061179d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117da57600080fd5b6000340361186f576000600c6117ee61081f565b600a546117fb9190612d37565b6118059190612882565b905080600160086000438152602001908152602001600020546118289190612b27565b111561183357600080fd5b60016008600043815260200190815260200160002060008282546118579190612b27565b92505081905550611869336001611a15565b50611894565b600c548161187d9190612811565b34101561188957600080fd5b6118933382611a15565b5b50565b80600760006118a4611a83565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611951611a83565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119969190611fca565b60405180910390a35050565b6119ad848484610836565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a0f576119d884848484611b55565b611a0e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611a2f828260405180602001604052806000815250611ca5565b5050565b606060a060405101806040526020810391506000825281835b600115611a6e57600184039350600a81066030018453600a8104905080611a4c575b50828103602084039350808452505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611b13868684611d42565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b7b611a83565b8786866040518563ffffffff1660e01b8152600401611b9d9493929190612dc0565b6020604051808303816000875af1925050508015611bd957506040513d601f19601f82011682018060405250810190611bd69190612e21565b60015b611c52573d8060008114611c09576040519150601f19603f3d011682016040523d82523d6000602084013e611c0e565b606091505b506000815103611c4a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b611caf8383611d4b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d3d57600080549050600083820390505b611cef6000868380600101945086611b55565b611d25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611cdc578160005414611d3a57600080fd5b50505b505050565b60009392505050565b60008054905060008203611d8b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d986000848385611af6565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611e0f83611e006000866000611afc565b611e0985611f06565b17611b24565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611eb057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611e75565b5060008203611eeb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611f016000848385611b4f565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f5f81611f2a565b8114611f6a57600080fd5b50565b600081359050611f7c81611f56565b92915050565b600060208284031215611f9857611f97611f20565b5b6000611fa684828501611f6d565b91505092915050565b60008115159050919050565b611fc481611faf565b82525050565b6000602082019050611fdf6000830184611fbb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561201f578082015181840152602081019050612004565b60008484015250505050565b6000601f19601f8301169050919050565b600061204782611fe5565b6120518185611ff0565b9350612061818560208601612001565b61206a8161202b565b840191505092915050565b6000602082019050818103600083015261208f818461203c565b905092915050565b6000819050919050565b6120aa81612097565b81146120b557600080fd5b50565b6000813590506120c7816120a1565b92915050565b6000602082840312156120e3576120e2611f20565b5b60006120f1848285016120b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612125826120fa565b9050919050565b6121358161211a565b82525050565b6000602082019050612150600083018461212c565b92915050565b61215f8161211a565b811461216a57600080fd5b50565b60008135905061217c81612156565b92915050565b6000806040838503121561219957612198611f20565b5b60006121a78582860161216d565b92505060206121b8858286016120b8565b9150509250929050565b6121cb81612097565b82525050565b60006020820190506121e660008301846121c2565b92915050565b60008060006060848603121561220557612204611f20565b5b60006122138682870161216d565b93505060206122248682870161216d565b9250506040612235868287016120b8565b9150509250925092565b6000806040838503121561225657612255611f20565b5b6000612264858286016120b8565b9250506020612275858286016120b8565b9150509250929050565b6000604082019050612294600083018561212c565b6122a160208301846121c2565b9392505050565b6000819050919050565b60006122cd6122c86122c3846120fa565b6122a8565b6120fa565b9050919050565b60006122df826122b2565b9050919050565b60006122f1826122d4565b9050919050565b612301816122e6565b82525050565b600060208201905061231c60008301846122f8565b92915050565b60006020828403121561233857612337611f20565b5b60006123468482850161216d565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123918261202b565b810181811067ffffffffffffffff821117156123b0576123af612359565b5b80604052505050565b60006123c3611f16565b90506123cf8282612388565b919050565b600067ffffffffffffffff8211156123ef576123ee612359565b5b6123f88261202b565b9050602081019050919050565b82818337600083830152505050565b6000612427612422846123d4565b6123b9565b90508281526020810184848401111561244357612442612354565b5b61244e848285612405565b509392505050565b600082601f83011261246b5761246a61234f565b5b813561247b848260208601612414565b91505092915050565b60006020828403121561249a57612499611f20565b5b600082013567ffffffffffffffff8111156124b8576124b7611f25565b5b6124c484828501612456565b91505092915050565b6124d681611faf565b81146124e157600080fd5b50565b6000813590506124f3816124cd565b92915050565b600080604083850312156125105761250f611f20565b5b600061251e8582860161216d565b925050602061252f858286016124e4565b9150509250929050565b600067ffffffffffffffff82111561255457612553612359565b5b61255d8261202b565b9050602081019050919050565b600061257d61257884612539565b6123b9565b90508281526020810184848401111561259957612598612354565b5b6125a4848285612405565b509392505050565b600082601f8301126125c1576125c061234f565b5b81356125d184826020860161256a565b91505092915050565b600080600080608085870312156125f4576125f3611f20565b5b60006126028782880161216d565b94505060206126138782880161216d565b9350506040612624878288016120b8565b925050606085013567ffffffffffffffff81111561264557612644611f25565b5b612651878288016125ac565b91505092959194509250565b600061ffff82169050919050565b6126748161265d565b811461267f57600080fd5b50565b6000813590506126918161266b565b92915050565b600080604083850312156126ae576126ad611f20565b5b60006126bc85828601612682565b92505060206126cd8582860161216d565b9150509250929050565b600080604083850312156126ee576126ed611f20565b5b60006126fc8582860161216d565b925050602061270d8582860161216d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275e57607f821691505b60208210810361277157612770612717565b5b50919050565b600060408201905061278c600083018561212c565b612799602083018461212c565b9392505050565b6000815190506127af816124cd565b92915050565b6000602082840312156127cb576127ca611f20565b5b60006127d9848285016127a0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061281c82612097565b915061282783612097565b925082820261283581612097565b9150828204841483151761284c5761284b6127e2565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061288d82612097565b915061289883612097565b9250826128a8576128a7612853565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128d8565b61291f86836128d8565b95508019841693508086168417925050509392505050565b600061295261294d61294884612097565b6122a8565b612097565b9050919050565b6000819050919050565b61296c83612937565b61298061297882612959565b8484546128e5565b825550505050565b600090565b612995612988565b6129a0818484612963565b505050565b5b818110156129c4576129b960008261298d565b6001810190506129a6565b5050565b601f821115612a09576129da816128b3565b6129e3846128c8565b810160208510156129f2578190505b612a066129fe856128c8565b8301826129a5565b50505b505050565b600082821c905092915050565b6000612a2c60001984600802612a0e565b1980831691505092915050565b6000612a458383612a1b565b9150826002028217905092915050565b612a5e82611fe5565b67ffffffffffffffff811115612a7757612a76612359565b5b612a818254612746565b612a8c8282856129c8565b600060209050601f831160018114612abf5760008415612aad578287015190505b612ab78582612a39565b865550612b1f565b601f198416612acd866128b3565b60005b82811015612af557848901518255600182019150602085019450602081019050612ad0565b86831015612b125784890151612b0e601f891682612a1b565b8355505b6001600288020188555050505b505050505050565b6000612b3282612097565b9150612b3d83612097565b9250828201905080821115612b5557612b546127e2565b5b92915050565b6000612b668261265d565b9150612b718361265d565b9250828201905061ffff811115612b8b57612b8a6127e2565b5b92915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000612bc7601383611ff0565b9150612bd282612b91565b602082019050919050565b60006020820190508181036000830152612bf681612bba565b9050919050565b600081905092915050565b60008154612c1581612746565b612c1f8186612bfd565b94506001821660008114612c3a5760018114612c4f57612c82565b60ff1983168652811515820286019350612c82565b612c58856128b3565b60005b83811015612c7a57815481890152600182019150602081019050612c5b565b838801955050505b50505092915050565b6000612c9682611fe5565b612ca08185612bfd565b9350612cb0818560208601612001565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612cf2600583612bfd565b9150612cfd82612cbc565b600582019050919050565b6000612d148285612c08565b9150612d208284612c8b565b9150612d2b82612ce5565b91508190509392505050565b6000612d4282612097565b9150612d4d83612097565b9250828203905081811115612d6557612d646127e2565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000612d9282612d6b565b612d9c8185612d76565b9350612dac818560208601612001565b612db58161202b565b840191505092915050565b6000608082019050612dd5600083018761212c565b612de2602083018661212c565b612def60408301856121c2565b8181036060830152612e018184612d87565b905095945050505050565b600081519050612e1b81611f56565b92915050565b600060208284031215612e3757612e36611f20565b5b6000612e4584828501612e0c565b9150509291505056fea26469706673582212203b40a0e03cd3ed3950963516a6dc6e7c99798e5cb2285dec2d2b0d511893967264736f6c63430008110033
Deployed Bytecode Sourcemap
59198:3100:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20798:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21700:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28191:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61511:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17451:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61684:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59471:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60812:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;61210:109;;;;;;;;;;;;;:::i;:::-;;56567:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61863:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23093:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18635:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21876:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59793:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59427:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59526:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61327:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62050:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60542:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61038:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59348:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29140:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59387:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20798:639;20883:4;21222:10;21207:25;;:11;:25;;;;:102;;;;21299:10;21284:25;;:11;:25;;;;21207:102;:179;;;;21376:10;21361:25;;:11;:25;;;;21207:179;21187:199;;20798:639;;;:::o;21700:100::-;21754:13;21787:5;21780:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21700:100;:::o;28191:218::-;28267:7;28292:16;28300:7;28292;:16::i;:::-;28287:64;;28317:34;;;;;;;;;;;;;;28287:64;28371:15;:24;28387:7;28371:24;;;;;;;;;;;:30;;;;;;;;;;;;28364:37;;28191:218;;;:::o;61511:165::-;61615:8;58609:1;56667:42;58561:45;;;:49;58557:225;;;56667:42;58632;;;58683:4;58690:8;58632:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58627:144;;58746:8;58727:28;;;;;;;;;;;:::i;:::-;;;;;;;;58627:144;58557:225;61636:32:::1;61650:8;61660:7;61636:13;:32::i;:::-;61511:165:::0;;;:::o;17451:323::-;17512:7;17740:15;:13;:15::i;:::-;17725:12;;17709:13;;:28;:46;17702:53;;17451:323;:::o;61684:171::-;61793:4;57863:1;56667:42;57815:45;;;:49;57811:539;;;58104:10;58096:18;;:4;:18;;;58092:85;;61810:37:::1;61829:4;61835:2;61839:7;61810:18;:37::i;:::-;58155:7:::0;;58092:85;56667:42;58196;;;58247:4;58254:10;58196:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58191:148;;58312:10;58293:30;;;;;;;;;;;:::i;:::-;;;;;;;;58191:148;57811:539;61810:37:::1;61829:4;61835:2;61839:7;61810:18;:37::i;:::-;61684:171:::0;;;;;:::o;59471:27::-;;;;:::o;60812:218::-;60900:7;60909;60929:21;60978:4;60967:7;;60954:10;:20;;;;:::i;:::-;60953:29;;;;:::i;:::-;60929:53;;61001:5;;;;;;;;;;;61008:13;60993:29;;;;;60812:218;;;;;:::o;61210:109::-;59952:10;59943:19;;:5;;;;;;;;;;;:19;;;59935:28;;;;;;61268:10:::1;61260:28;;:51;61289:21;61260:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;61210:109::o:0;56567:143::-;56667:42;56567:143;:::o;61863:179::-;61976:4;57863:1;56667:42;57815:45;;;:49;57811:539;;;58104:10;58096:18;;:4;:18;;;58092:85;;61993:41:::1;62016:4;62022:2;62026:7;61993:22;:41::i;:::-;58155:7:::0;;58092:85;56667:42;58196;;;58247:4;58254:10;58196:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58191:148;;58312:10;58293:30;;;;;;;;;;;:::i;:::-;;;;;;;;58191:148;57811:539;61993:41:::1;62016:4;62022:2;62026:7;61993:22;:41::i;:::-;61863:179:::0;;;;;:::o;23093:152::-;23165:7;23208:27;23227:7;23208:18;:27::i;:::-;23185:52;;23093:152;;;:::o;18635:233::-;18707:7;18748:1;18731:19;;:5;:19;;;18727:60;;18759:28;;;;;;;;;;;;;;18727:60;12794:13;18805:18;:25;18824:5;18805:25;;;;;;;;;;;;;;;;:55;18798:62;;18635:233;;;:::o;21876:104::-;21932:13;21965:7;21958:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21876:104;:::o;59793:84::-;59952:10;59943:19;;:5;;;;;;;;;;;:19;;;59935:28;;;;;;59865:4:::1;59859:3;:10;;;;;;:::i;:::-;;59793:84:::0;:::o;59427:35::-;;;;:::o;59526:170::-;59616:9;;59606:6;59590:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;59582:44;;;;;;59655:8;;59645:6;:18;;59637:27;;;;;;59675:13;59681:6;59675:5;:13::i;:::-;59526:170;:::o;61327:176::-;61431:8;58609:1;56667:42;58561:45;;;:49;58557:225;;;56667:42;58632;;;58683:4;58690:8;58632:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58627:144;;58746:8;58727:28;;;;;;;;;;;:::i;:::-;;;;;;;;58627:144;58557:225;61452:43:::1;61476:8;61486;61452:23;:43::i;:::-;61327:176:::0;;;:::o;62050:245::-;62218:4;57863:1;56667:42;57815:45;;;:49;57811:539;;;58104:10;58096:18;;:4;:18;;;58092:85;;62240:47:::1;62263:4;62269:2;62273:7;62282:4;62240:22;:47::i;:::-;58155:7:::0;;58092:85;56667:42;58196;;;58247:4;58254:10;58196:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58191:148;;58312:10;58293:30;;;;;;;;;;;:::i;:::-;;;;;;;;58191:148;57811:539;62240:47:::1;62263:4;62269:2;62273:7;62282:4;62240:22;:47::i;:::-;62050:245:::0;;;;;;:::o;60542:262::-;59952:10;59943:19;;:5;;;;;;;;;;;:19;;;59935:28;;;;;;60628:18:::1;60656:13;:11;:13::i;:::-;60628:42;;60718:9;;60703:11;60689;:25;;;;:::i;:::-;:38;;;;60681:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;60762:34;60772:9;60784:11;60762:34;;:9;:34::i;:::-;60617:187;60542:262:::0;;:::o;61038:164::-;61103:13;61160:3;61165:18;61175:7;61165:9;:18::i;:::-;61143:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61129:65;;61038:164;;;:::o;59348:30::-;;;;:::o;29140:164::-;29237:4;29261:18;:25;29280:5;29261:25;;;;;;;;;;;;;;;:35;29287:8;29261:35;;;;;;;;;;;;;;;;;;;;;;;;;29254:42;;29140:164;;;;:::o;59387:27::-;;;;:::o;29562:282::-;29627:4;29683:7;29664:15;:13;:15::i;:::-;:26;;:66;;;;;29717:13;;29707:7;:23;29664:66;:153;;;;;29816:1;13570:8;29768:17;:26;29786:7;29768:26;;;;;;;;;;;;:44;:49;29664:153;29644:173;;29562:282;;;:::o;27624:408::-;27713:13;27729:16;27737:7;27729;:16::i;:::-;27713:32;;27785:5;27762:28;;:19;:17;:19::i;:::-;:28;;;27758:175;;27810:44;27827:5;27834:19;:17;:19::i;:::-;27810:16;:44::i;:::-;27805:128;;27882:35;;;;;;;;;;;;;;27805:128;27758:175;27978:2;27945:15;:24;27961:7;27945:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;28016:7;28012:2;27996:28;;28005:5;27996:28;;;;;;;;;;;;27702:330;27624:408;;:::o;16967:92::-;17023:7;16967:92;:::o;31830:2825::-;31972:27;32002;32021:7;32002:18;:27::i;:::-;31972:57;;32087:4;32046:45;;32062:19;32046:45;;;32042:86;;32100:28;;;;;;;;;;;;;;32042:86;32142:27;32171:23;32198:35;32225:7;32198:26;:35::i;:::-;32141:92;;;;32333:68;32358:15;32375:4;32381:19;:17;:19::i;:::-;32333:24;:68::i;:::-;32328:180;;32421:43;32438:4;32444:19;:17;:19::i;:::-;32421:16;:43::i;:::-;32416:92;;32473:35;;;;;;;;;;;;;;32416:92;32328:180;32539:1;32525:16;;:2;:16;;;32521:52;;32550:23;;;;;;;;;;;;;;32521:52;32586:43;32608:4;32614:2;32618:7;32627:1;32586:21;:43::i;:::-;32722:15;32719:160;;;32862:1;32841:19;32834:30;32719:160;33259:18;:24;33278:4;33259:24;;;;;;;;;;;;;;;;33257:26;;;;;;;;;;;;33328:18;:22;33347:2;33328:22;;;;;;;;;;;;;;;;33326:24;;;;;;;;;;;33650:146;33687:2;33736:45;33751:4;33757:2;33761:19;33736:14;:45::i;:::-;13850:8;33708:73;33650:18;:146::i;:::-;33621:17;:26;33639:7;33621:26;;;;;;;;;;;:175;;;;33967:1;13850:8;33916:19;:47;:52;33912:627;;33989:19;34021:1;34011:7;:11;33989:33;;34178:1;34144:17;:30;34162:11;34144:30;;;;;;;;;;;;:35;34140:384;;34282:13;;34267:11;:28;34263:242;;34462:19;34429:17;:30;34447:11;34429:30;;;;;;;;;;;:52;;;;34263:242;34140:384;33970:569;33912:627;34586:7;34582:2;34567:27;;34576:4;34567:27;;;;;;;;;;;;34605:42;34626:4;34632:2;34636:7;34645:1;34605:20;:42::i;:::-;31961:2694;;;31830:2825;;;:::o;34751:193::-;34897:39;34914:4;34920:2;34924:7;34897:39;;;;;;;;;;;;:16;:39::i;:::-;34751:193;;;:::o;24248:1275::-;24315:7;24335:12;24350:7;24335:22;;24418:4;24399:15;:13;:15::i;:::-;:23;24395:1061;;24452:13;;24445:4;:20;24441:1015;;;24490:14;24507:17;:23;24525:4;24507:23;;;;;;;;;;;;24490:40;;24624:1;13570:8;24596:6;:24;:29;24592:845;;25261:113;25278:1;25268:6;:11;25261:113;;25321:17;:25;25339:6;;;;;;;25321:25;;;;;;;;;;;;25312:34;;25261:113;;;25407:6;25400:13;;;;;;24592:845;24467:989;24441:1015;24395:1061;25484:31;;;;;;;;;;;;;;24248:1275;;;;:::o;60084:450::-;60157:9;60143:23;;:10;:23;;;60135:32;;;;;;60195:1;60182:9;:14;60178:262;;60213:15;60261:2;60244:13;:11;:13::i;:::-;60232:9;;:25;;;;:::i;:::-;60231:32;;;;:::i;:::-;60213:50;;60317:7;60312:1;60286:9;:23;60296:12;60286:23;;;;;;;;;;;;:27;;;;:::i;:::-;:38;;60278:47;;;;;;60367:1;60340:9;:23;60350:12;60340:23;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;60383:24;60393:10;60405:1;60383:9;:24::i;:::-;60422:7;;;60178:262;60480:5;;60471:6;:14;;;;:::i;:::-;60458:9;:27;;60450:36;;;;;;60497:29;60507:10;60519:6;60497:9;:29::i;:::-;60084:450;;:::o;28749:234::-;28896:8;28844:18;:39;28863:19;:17;:19::i;:::-;28844:39;;;;;;;;;;;;;;;:49;28884:8;28844:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;28956:8;28920:55;;28935:19;:17;:19::i;:::-;28920:55;;;28966:8;28920:55;;;;;;:::i;:::-;;;;;;;;28749:234;;:::o;35542:407::-;35717:31;35730:4;35736:2;35740:7;35717:12;:31::i;:::-;35781:1;35763:2;:14;;;:19;35759:183;;35802:56;35833:4;35839:2;35843:7;35852:5;35802:30;:56::i;:::-;35797:145;;35886:40;;;;;;;;;;;;;;35797:145;35759:183;35542:407;;;;:::o;45702:112::-;45779:27;45789:2;45793:8;45779:27;;;;;;;;;;;;:9;:27::i;:::-;45702:112;;:::o;52077:1745::-;52142:17;52576:4;52569;52563:11;52559:22;52668:1;52662:4;52655:15;52743:4;52740:1;52736:12;52729:19;;52825:1;52820:3;52813:14;52929:3;53168:5;53150:428;53176:1;53150:428;;;53216:1;53211:3;53207:11;53200:18;;53387:2;53381:4;53377:13;53373:2;53369:22;53364:3;53356:36;53481:2;53475:4;53471:13;53463:21;;53548:4;53150:428;53538:25;53150:428;53154:21;53617:3;53612;53608:13;53732:4;53727:3;53723:14;53716:21;;53797:6;53792:3;53785:19;52181:1634;;;52077:1745;;;:::o;51870:105::-;51930:7;51957:10;51950:17;;51870:105;:::o;30725:485::-;30827:27;30856:23;30897:38;30938:15;:24;30954:7;30938:24;;;;;;;;;;;30897:65;;31115:18;31092:41;;31172:19;31166:26;31147:45;;31077:126;30725:485;;;:::o;29953:659::-;30102:11;30267:16;30260:5;30256:28;30247:37;;30427:16;30416:9;30412:32;30399:45;;30577:15;30566:9;30563:30;30555:5;30544:9;30541:20;30538:56;30528:66;;29953:659;;;;;:::o;36611:159::-;;;;;:::o;51179:311::-;51314:7;51334:16;13974:3;51360:19;:41;;51334:68;;13974:3;51428:31;51439:4;51445:2;51449:9;51428:10;:31::i;:::-;51420:40;;:62;;51413:69;;;51179:311;;;;;:::o;26071:450::-;26151:14;26319:16;26312:5;26308:28;26299:37;;26496:5;26482:11;26457:23;26453:41;26450:52;26443:5;26440:63;26430:73;;26071:450;;;;:::o;37435:158::-;;;;;:::o;38033:716::-;38196:4;38242:2;38217:45;;;38263:19;:17;:19::i;:::-;38284:4;38290:7;38299:5;38217:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38213:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38517:1;38500:6;:13;:18;38496:235;;38546:40;;;;;;;;;;;;;;38496:235;38689:6;38683:13;38674:6;38670:2;38666:15;38659:38;38213:529;38386:54;;;38376:64;;;:6;:64;;;;38369:71;;;38033:716;;;;;;:::o;44929:689::-;45060:19;45066:2;45070:8;45060:5;:19::i;:::-;45139:1;45121:2;:14;;;:19;45117:483;;45161:11;45175:13;;45161:27;;45207:13;45229:8;45223:3;:14;45207:30;;45256:233;45287:62;45326:1;45330:2;45334:7;;;;;;45343:5;45287:30;:62::i;:::-;45282:167;;45385:40;;;;;;;;;;;;;;45282:167;45484:3;45476:5;:11;45256:233;;45571:3;45554:13;;:20;45550:34;;45576:8;;;45550:34;45142:458;;45117:483;44929:689;;;:::o;50880:147::-;51017:6;50880:147;;;;;:::o;39211:2966::-;39284:20;39307:13;;39284:36;;39347:1;39335:8;:13;39331:44;;39357:18;;;;;;;;;;;;;;39331:44;39388:61;39418:1;39422:2;39426:12;39440:8;39388:21;:61::i;:::-;39932:1;12932:2;39902:1;:26;;39901:32;39889:8;:45;39863:18;:22;39882:2;39863:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;40211:139;40248:2;40302:33;40325:1;40329:2;40333:1;40302:14;:33::i;:::-;40269:30;40290:8;40269:20;:30::i;:::-;:66;40211:18;:139::i;:::-;40177:17;:31;40195:12;40177:31;;;;;;;;;;;:173;;;;40367:16;40398:11;40427:8;40412:12;:23;40398:37;;40948:16;40944:2;40940:25;40928:37;;41320:12;41280:8;41239:1;41177:25;41118:1;41057;41030:335;41691:1;41677:12;41673:20;41631:346;41732:3;41723:7;41720:16;41631:346;;41950:7;41940:8;41937:1;41910:25;41907:1;41904;41899:59;41785:1;41776:7;41772:15;41761:26;;41631:346;;;41635:77;42022:1;42010:8;:13;42006:45;;42032:19;;;;;;;;;;;;;;42006:45;42084:3;42068:13;:19;;;;39637:2462;;42109:60;42138:1;42142:2;42146:12;42160:8;42109:20;:60::i;:::-;39273:2904;39211:2966;;:::o;26623:324::-;26693:14;26926:1;26916:8;26913:15;26887:24;26883:46;26873:56;;26623:324;;;:::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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:332::-;6468:4;6506:2;6495:9;6491:18;6483:26;;6519:71;6587:1;6576:9;6572:17;6563:6;6519:71;:::i;:::-;6600:72;6668:2;6657:9;6653:18;6644:6;6600:72;:::i;:::-;6347:332;;;;;:::o;6685:60::-;6713:3;6734:5;6727:12;;6685:60;;;:::o;6751:142::-;6801:9;6834:53;6852:34;6861:24;6879:5;6861:24;:::i;:::-;6852:34;:::i;:::-;6834:53;:::i;:::-;6821:66;;6751:142;;;:::o;6899:126::-;6949:9;6982:37;7013:5;6982:37;:::i;:::-;6969:50;;6899:126;;;:::o;7031:158::-;7113:9;7146:37;7177:5;7146:37;:::i;:::-;7133:50;;7031:158;;;:::o;7195:195::-;7314:69;7377:5;7314:69;:::i;:::-;7309:3;7302:82;7195:195;;:::o;7396:286::-;7521:4;7559:2;7548:9;7544:18;7536:26;;7572:103;7672:1;7661:9;7657:17;7648:6;7572:103;:::i;:::-;7396:286;;;;:::o;7688:329::-;7747:6;7796:2;7784:9;7775:7;7771:23;7767:32;7764:119;;;7802:79;;:::i;:::-;7764:119;7922:1;7947:53;7992:7;7983:6;7972:9;7968:22;7947:53;:::i;:::-;7937:63;;7893:117;7688:329;;;;:::o;8023:117::-;8132:1;8129;8122:12;8146:117;8255:1;8252;8245:12;8269:180;8317:77;8314:1;8307:88;8414:4;8411:1;8404:15;8438:4;8435:1;8428:15;8455:281;8538:27;8560:4;8538:27;:::i;:::-;8530:6;8526:40;8668:6;8656:10;8653:22;8632:18;8620:10;8617:34;8614:62;8611:88;;;8679:18;;:::i;:::-;8611:88;8719:10;8715:2;8708:22;8498:238;8455:281;;:::o;8742:129::-;8776:6;8803:20;;:::i;:::-;8793:30;;8832:33;8860:4;8852:6;8832:33;:::i;:::-;8742:129;;;:::o;8877:308::-;8939:4;9029:18;9021:6;9018:30;9015:56;;;9051:18;;:::i;:::-;9015:56;9089:29;9111:6;9089:29;:::i;:::-;9081:37;;9173:4;9167;9163:15;9155:23;;8877:308;;;:::o;9191:146::-;9288:6;9283:3;9278;9265:30;9329:1;9320:6;9315:3;9311:16;9304:27;9191:146;;;:::o;9343:425::-;9421:5;9446:66;9462:49;9504:6;9462:49;:::i;:::-;9446:66;:::i;:::-;9437:75;;9535:6;9528:5;9521:21;9573:4;9566:5;9562:16;9611:3;9602:6;9597:3;9593:16;9590:25;9587:112;;;9618:79;;:::i;:::-;9587:112;9708:54;9755:6;9750:3;9745;9708:54;:::i;:::-;9427:341;9343:425;;;;;:::o;9788:340::-;9844:5;9893:3;9886:4;9878:6;9874:17;9870:27;9860:122;;9901:79;;:::i;:::-;9860:122;10018:6;10005:20;10043:79;10118:3;10110:6;10103:4;10095:6;10091:17;10043:79;:::i;:::-;10034:88;;9850:278;9788:340;;;;:::o;10134:509::-;10203:6;10252:2;10240:9;10231:7;10227:23;10223:32;10220:119;;;10258:79;;:::i;:::-;10220:119;10406:1;10395:9;10391:17;10378:31;10436:18;10428:6;10425:30;10422:117;;;10458:79;;:::i;:::-;10422:117;10563:63;10618:7;10609:6;10598:9;10594:22;10563:63;:::i;:::-;10553:73;;10349:287;10134:509;;;;:::o;10649:116::-;10719:21;10734:5;10719:21;:::i;:::-;10712:5;10709:32;10699:60;;10755:1;10752;10745:12;10699:60;10649:116;:::o;10771:133::-;10814:5;10852:6;10839:20;10830:29;;10868:30;10892:5;10868:30;:::i;:::-;10771:133;;;;:::o;10910:468::-;10975:6;10983;11032:2;11020:9;11011:7;11007:23;11003:32;11000:119;;;11038:79;;:::i;:::-;11000:119;11158:1;11183:53;11228:7;11219:6;11208:9;11204:22;11183:53;:::i;:::-;11173:63;;11129:117;11285:2;11311:50;11353:7;11344:6;11333:9;11329:22;11311:50;:::i;:::-;11301:60;;11256:115;10910:468;;;;;:::o;11384:307::-;11445:4;11535:18;11527:6;11524:30;11521:56;;;11557:18;;:::i;:::-;11521:56;11595:29;11617:6;11595:29;:::i;:::-;11587:37;;11679:4;11673;11669:15;11661:23;;11384:307;;;:::o;11697:423::-;11774:5;11799:65;11815:48;11856:6;11815:48;:::i;:::-;11799:65;:::i;:::-;11790:74;;11887:6;11880:5;11873:21;11925:4;11918:5;11914:16;11963:3;11954:6;11949:3;11945:16;11942:25;11939:112;;;11970:79;;:::i;:::-;11939:112;12060:54;12107:6;12102:3;12097;12060:54;:::i;:::-;11780:340;11697:423;;;;;:::o;12139:338::-;12194:5;12243:3;12236:4;12228:6;12224:17;12220:27;12210:122;;12251:79;;:::i;:::-;12210:122;12368:6;12355:20;12393:78;12467:3;12459:6;12452:4;12444:6;12440:17;12393:78;:::i;:::-;12384:87;;12200:277;12139:338;;;;:::o;12483:943::-;12578:6;12586;12594;12602;12651:3;12639:9;12630:7;12626:23;12622:33;12619:120;;;12658:79;;:::i;:::-;12619:120;12778:1;12803:53;12848:7;12839:6;12828:9;12824:22;12803:53;:::i;:::-;12793:63;;12749:117;12905:2;12931:53;12976:7;12967:6;12956:9;12952:22;12931:53;:::i;:::-;12921:63;;12876:118;13033:2;13059:53;13104:7;13095:6;13084:9;13080:22;13059:53;:::i;:::-;13049:63;;13004:118;13189:2;13178:9;13174:18;13161:32;13220:18;13212:6;13209:30;13206:117;;;13242:79;;:::i;:::-;13206:117;13347:62;13401:7;13392:6;13381:9;13377:22;13347:62;:::i;:::-;13337:72;;13132:287;12483:943;;;;;;;:::o;13432:89::-;13468:7;13508:6;13501:5;13497:18;13486:29;;13432:89;;;:::o;13527:120::-;13599:23;13616:5;13599:23;:::i;:::-;13592:5;13589:34;13579:62;;13637:1;13634;13627:12;13579:62;13527:120;:::o;13653:137::-;13698:5;13736:6;13723:20;13714:29;;13752:32;13778:5;13752:32;:::i;:::-;13653:137;;;;:::o;13796:472::-;13863:6;13871;13920:2;13908:9;13899:7;13895:23;13891:32;13888:119;;;13926:79;;:::i;:::-;13888:119;14046:1;14071:52;14115:7;14106:6;14095:9;14091:22;14071:52;:::i;:::-;14061:62;;14017:116;14172:2;14198:53;14243:7;14234:6;14223:9;14219:22;14198:53;:::i;:::-;14188:63;;14143:118;13796:472;;;;;:::o;14274:474::-;14342:6;14350;14399:2;14387:9;14378:7;14374:23;14370:32;14367:119;;;14405:79;;:::i;:::-;14367:119;14525:1;14550:53;14595:7;14586:6;14575:9;14571:22;14550:53;:::i;:::-;14540:63;;14496:117;14652:2;14678:53;14723:7;14714:6;14703:9;14699:22;14678:53;:::i;:::-;14668:63;;14623:118;14274:474;;;;;:::o;14754:180::-;14802:77;14799:1;14792:88;14899:4;14896:1;14889:15;14923:4;14920:1;14913:15;14940:320;14984:6;15021:1;15015:4;15011:12;15001:22;;15068:1;15062:4;15058:12;15089:18;15079:81;;15145:4;15137:6;15133:17;15123:27;;15079:81;15207:2;15199:6;15196:14;15176:18;15173:38;15170:84;;15226:18;;:::i;:::-;15170:84;14991:269;14940:320;;;:::o;15266:332::-;15387:4;15425:2;15414:9;15410:18;15402:26;;15438:71;15506:1;15495:9;15491:17;15482:6;15438:71;:::i;:::-;15519:72;15587:2;15576:9;15572:18;15563:6;15519:72;:::i;:::-;15266:332;;;;;:::o;15604:137::-;15658:5;15689:6;15683:13;15674:22;;15705:30;15729:5;15705:30;:::i;:::-;15604:137;;;;:::o;15747:345::-;15814:6;15863:2;15851:9;15842:7;15838:23;15834:32;15831:119;;;15869:79;;:::i;:::-;15831:119;15989:1;16014:61;16067:7;16058:6;16047:9;16043:22;16014:61;:::i;:::-;16004:71;;15960:125;15747:345;;;;:::o;16098:180::-;16146:77;16143:1;16136:88;16243:4;16240:1;16233:15;16267:4;16264:1;16257:15;16284:410;16324:7;16347:20;16365:1;16347:20;:::i;:::-;16342:25;;16381:20;16399:1;16381:20;:::i;:::-;16376:25;;16436:1;16433;16429:9;16458:30;16476:11;16458:30;:::i;:::-;16447:41;;16637:1;16628:7;16624:15;16621:1;16618:22;16598:1;16591:9;16571:83;16548:139;;16667:18;;:::i;:::-;16548:139;16332:362;16284:410;;;;:::o;16700:180::-;16748:77;16745:1;16738:88;16845:4;16842:1;16835:15;16869:4;16866:1;16859:15;16886:185;16926:1;16943:20;16961:1;16943:20;:::i;:::-;16938:25;;16977:20;16995:1;16977:20;:::i;:::-;16972:25;;17016:1;17006:35;;17021:18;;:::i;:::-;17006:35;17063:1;17060;17056:9;17051:14;;16886:185;;;;:::o;17077:141::-;17126:4;17149:3;17141:11;;17172:3;17169:1;17162:14;17206:4;17203:1;17193:18;17185:26;;17077:141;;;:::o;17224:93::-;17261:6;17308:2;17303;17296:5;17292:14;17288:23;17278:33;;17224:93;;;:::o;17323:107::-;17367:8;17417:5;17411:4;17407:16;17386:37;;17323:107;;;;:::o;17436:393::-;17505:6;17555:1;17543:10;17539:18;17578:97;17608:66;17597:9;17578:97;:::i;:::-;17696:39;17726:8;17715:9;17696:39;:::i;:::-;17684:51;;17768:4;17764:9;17757:5;17753:21;17744:30;;17817:4;17807:8;17803:19;17796:5;17793:30;17783:40;;17512:317;;17436:393;;;;;:::o;17835:142::-;17885:9;17918:53;17936:34;17945:24;17963:5;17945:24;:::i;:::-;17936:34;:::i;:::-;17918:53;:::i;:::-;17905:66;;17835:142;;;:::o;17983:75::-;18026:3;18047:5;18040:12;;17983:75;;;:::o;18064:269::-;18174:39;18205:7;18174:39;:::i;:::-;18235:91;18284:41;18308:16;18284:41;:::i;:::-;18276:6;18269:4;18263:11;18235:91;:::i;:::-;18229:4;18222:105;18140:193;18064:269;;;:::o;18339:73::-;18384:3;18339:73;:::o;18418:189::-;18495:32;;:::i;:::-;18536:65;18594:6;18586;18580:4;18536:65;:::i;:::-;18471:136;18418:189;;:::o;18613:186::-;18673:120;18690:3;18683:5;18680:14;18673:120;;;18744:39;18781:1;18774:5;18744:39;:::i;:::-;18717:1;18710:5;18706:13;18697:22;;18673:120;;;18613:186;;:::o;18805:543::-;18906:2;18901:3;18898:11;18895:446;;;18940:38;18972:5;18940:38;:::i;:::-;19024:29;19042:10;19024:29;:::i;:::-;19014:8;19010:44;19207:2;19195:10;19192:18;19189:49;;;19228:8;19213:23;;19189:49;19251:80;19307:22;19325:3;19307:22;:::i;:::-;19297:8;19293:37;19280:11;19251:80;:::i;:::-;18910:431;;18895:446;18805:543;;;:::o;19354:117::-;19408:8;19458:5;19452:4;19448:16;19427:37;;19354:117;;;;:::o;19477:169::-;19521:6;19554:51;19602:1;19598:6;19590:5;19587:1;19583:13;19554:51;:::i;:::-;19550:56;19635:4;19629;19625:15;19615:25;;19528:118;19477:169;;;;:::o;19651:295::-;19727:4;19873:29;19898:3;19892:4;19873:29;:::i;:::-;19865:37;;19935:3;19932:1;19928:11;19922:4;19919:21;19911:29;;19651:295;;;;:::o;19951:1395::-;20068:37;20101:3;20068:37;:::i;:::-;20170:18;20162:6;20159:30;20156:56;;;20192:18;;:::i;:::-;20156:56;20236:38;20268:4;20262:11;20236:38;:::i;:::-;20321:67;20381:6;20373;20367:4;20321:67;:::i;:::-;20415:1;20439:4;20426:17;;20471:2;20463:6;20460:14;20488:1;20483:618;;;;21145:1;21162:6;21159:77;;;21211:9;21206:3;21202:19;21196:26;21187:35;;21159:77;21262:67;21322:6;21315:5;21262:67;:::i;:::-;21256:4;21249:81;21118:222;20453:887;;20483:618;20535:4;20531:9;20523:6;20519:22;20569:37;20601:4;20569:37;:::i;:::-;20628:1;20642:208;20656:7;20653:1;20650:14;20642:208;;;20735:9;20730:3;20726:19;20720:26;20712:6;20705:42;20786:1;20778:6;20774:14;20764:24;;20833:2;20822:9;20818:18;20805:31;;20679:4;20676:1;20672:12;20667:17;;20642:208;;;20878:6;20869:7;20866:19;20863:179;;;20936:9;20931:3;20927:19;20921:26;20979:48;21021:4;21013:6;21009:17;20998:9;20979:48;:::i;:::-;20971:6;20964:64;20886:156;20863:179;21088:1;21084;21076:6;21072:14;21068:22;21062:4;21055:36;20490:611;;;20453:887;;20043:1303;;;19951:1395;;:::o;21352:191::-;21392:3;21411:20;21429:1;21411:20;:::i;:::-;21406:25;;21445:20;21463:1;21445:20;:::i;:::-;21440:25;;21488:1;21485;21481:9;21474:16;;21509:3;21506:1;21503:10;21500:36;;;21516:18;;:::i;:::-;21500:36;21352:191;;;;:::o;21549:193::-;21588:3;21607:19;21624:1;21607:19;:::i;:::-;21602:24;;21640:19;21657:1;21640:19;:::i;:::-;21635:24;;21682:1;21679;21675:9;21668:16;;21705:6;21700:3;21697:15;21694:41;;;21715:18;;:::i;:::-;21694:41;21549:193;;;;:::o;21748:169::-;21888:21;21884:1;21876:6;21872:14;21865:45;21748:169;:::o;21923:366::-;22065:3;22086:67;22150:2;22145:3;22086:67;:::i;:::-;22079:74;;22162:93;22251:3;22162:93;:::i;:::-;22280:2;22275:3;22271:12;22264:19;;21923:366;;;:::o;22295:419::-;22461:4;22499:2;22488:9;22484:18;22476:26;;22548:9;22542:4;22538:20;22534:1;22523:9;22519:17;22512:47;22576:131;22702:4;22576:131;:::i;:::-;22568:139;;22295:419;;;:::o;22720:148::-;22822:11;22859:3;22844:18;;22720:148;;;;:::o;22898:874::-;23001:3;23038:5;23032:12;23067:36;23093:9;23067:36;:::i;:::-;23119:89;23201:6;23196:3;23119:89;:::i;:::-;23112:96;;23239:1;23228:9;23224:17;23255:1;23250:166;;;;23430:1;23425:341;;;;23217:549;;23250:166;23334:4;23330:9;23319;23315:25;23310:3;23303:38;23396:6;23389:14;23382:22;23374:6;23370:35;23365:3;23361:45;23354:52;;23250:166;;23425:341;23492:38;23524:5;23492:38;:::i;:::-;23552:1;23566:154;23580:6;23577:1;23574:13;23566:154;;;23654:7;23648:14;23644:1;23639:3;23635:11;23628:35;23704:1;23695:7;23691:15;23680:26;;23602:4;23599:1;23595:12;23590:17;;23566:154;;;23749:6;23744:3;23740:16;23733:23;;23432:334;;23217:549;;23005:767;;22898:874;;;;:::o;23778:390::-;23884:3;23912:39;23945:5;23912:39;:::i;:::-;23967:89;24049:6;24044:3;23967:89;:::i;:::-;23960:96;;24065:65;24123:6;24118:3;24111:4;24104:5;24100:16;24065:65;:::i;:::-;24155:6;24150:3;24146:16;24139:23;;23888:280;23778:390;;;;:::o;24174:155::-;24314:7;24310:1;24302:6;24298:14;24291:31;24174:155;:::o;24335:400::-;24495:3;24516:84;24598:1;24593:3;24516:84;:::i;:::-;24509:91;;24609:93;24698:3;24609:93;:::i;:::-;24727:1;24722:3;24718:11;24711:18;;24335:400;;;:::o;24741:695::-;25019:3;25041:92;25129:3;25120:6;25041:92;:::i;:::-;25034:99;;25150:95;25241:3;25232:6;25150:95;:::i;:::-;25143:102;;25262:148;25406:3;25262:148;:::i;:::-;25255:155;;25427:3;25420:10;;24741:695;;;;;:::o;25442:194::-;25482:4;25502:20;25520:1;25502:20;:::i;:::-;25497:25;;25536:20;25554:1;25536:20;:::i;:::-;25531:25;;25580:1;25577;25573:9;25565:17;;25604:1;25598:4;25595:11;25592:37;;;25609:18;;:::i;:::-;25592:37;25442:194;;;;:::o;25642:98::-;25693:6;25727:5;25721:12;25711:22;;25642:98;;;:::o;25746:168::-;25829:11;25863:6;25858:3;25851:19;25903:4;25898:3;25894:14;25879:29;;25746:168;;;;:::o;25920:373::-;26006:3;26034:38;26066:5;26034:38;:::i;:::-;26088:70;26151:6;26146:3;26088:70;:::i;:::-;26081:77;;26167:65;26225:6;26220:3;26213:4;26206:5;26202:16;26167:65;:::i;:::-;26257:29;26279:6;26257:29;:::i;:::-;26252:3;26248:39;26241:46;;26010:283;25920:373;;;;:::o;26299:640::-;26494:4;26532:3;26521:9;26517:19;26509:27;;26546:71;26614:1;26603:9;26599:17;26590:6;26546:71;:::i;:::-;26627:72;26695:2;26684:9;26680:18;26671:6;26627:72;:::i;:::-;26709;26777:2;26766:9;26762:18;26753:6;26709:72;:::i;:::-;26828:9;26822:4;26818:20;26813:2;26802:9;26798:18;26791:48;26856:76;26927:4;26918:6;26856:76;:::i;:::-;26848:84;;26299:640;;;;;;;:::o;26945:141::-;27001:5;27032:6;27026:13;27017:22;;27048:32;27074:5;27048:32;:::i;:::-;26945:141;;;;:::o;27092:349::-;27161:6;27210:2;27198:9;27189:7;27185:23;27181:32;27178:119;;;27216:79;;:::i;:::-;27178:119;27336:1;27361:63;27416:7;27407:6;27396:9;27392:22;27361:63;:::i;:::-;27351:73;;27307:127;27092:349;;;;:::o
Swarm Source
ipfs://3b40a0e03cd3ed3950963516a6dc6e7c99798e5cb2285dec2d2b0d5118939672
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.