ERC-721
Overview
Max Total Supply
2,000 FIDS
Holders
431
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 FIDSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FurryIdiots
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-17 */ // SPDX-License-Identifier: MIT // File: @rari-capital/solmate/src/auth/Owned.sol pragma solidity >=0.8.0; /// @notice Simple single owner authorization mixin. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol) abstract contract Owned { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event OwnerUpdated(address indexed user, address indexed newOwner); /*////////////////////////////////////////////////////////////// OWNERSHIP STORAGE //////////////////////////////////////////////////////////////*/ address public owner; modifier onlyOwner() virtual { require(msg.sender == owner, "UNAUTHORIZED"); _; } /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(address _owner) { owner = _owner; emit OwnerUpdated(address(0), _owner); } /*////////////////////////////////////////////////////////////// OWNERSHIP LOGIC //////////////////////////////////////////////////////////////*/ function setOwner(address newOwner) public virtual onlyOwner { owner = newOwner; emit OwnerUpdated(msg.sender, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: contracts/FurryIdiots.sol pragma solidity ^0.8.4; contract FurryIdiots is ERC721A, Owned { uint256 public maxPerWallet = 5; uint256 public maxSupply = 2000; uint256 public maxPerTx = 5; uint256 public price = 0.00 ether; bool public activated; string public baseURI = "https://ipfs.io/ipfs/QmWtqgu3F7n3BP9o47YBZSXytBwdxrMYapEJHMiUdHDi8s/"; constructor() ERC721A("Furry Idiots", "FIDS") Owned(msg.sender) {} function mint(uint256 numberOfTokens) external payable { require(activated, "Inactive"); require(totalSupply() + numberOfTokens <= maxSupply, "All minted"); require(numberOfTokens <= maxPerTx, "Too many for Tx"); require(_numberMinted(msg.sender) + numberOfTokens <= maxPerWallet,"Too many for address"); require(msg.value >= price * numberOfTokens, "Not enought funds"); _safeMint(msg.sender, numberOfTokens); } function _startTokenId() internal pure override returns (uint256) { return 1; } function _baseURI() internal view override returns (string memory) { return baseURI; } function setPrice(uint256 _price) public onlyOwner { price = _price; } function setIsActive(bool _isActive) external onlyOwner { activated = _isActive; } function collectReserves() external onlyOwner { require(totalSupply() == 0, "RESERVES TAKEN"); _mint(msg.sender, 50); } function withdraw() external onlyOwner { require( payable(owner).send(address(this).balance), "UNSUCCESSFUL" ); } }
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":[],"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":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","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":"activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectReserves","outputs":[],"stateMutability":"nonpayable","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":"maxPerWallet","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":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","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
608060405260056009556107d0600a556005600b556000600c5560405180608001604052806044815260200162002d9460449139600e90805190602001906200004a929190620001bc565b503480156200005857600080fd5b50336040518060400160405280600c81526020017f4675727279204964696f747300000000000000000000000000000000000000008152506040518060400160405280600481526020017f46494453000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000de929190620001bc565b508060039080519060200190620000f7929190620001bc565b5062000108620001b360201b60201c565b600081905550505080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a350620002d1565b60006001905090565b828054620001ca906200026c565b90600052602060002090601f016020900481019282620001ee57600085556200023a565b82601f106200020957805160ff19168380011785556200023a565b828001600101855582156200023a579182015b82811115620002395782518255916020019190600101906200021c565b5b5090506200024991906200024d565b5090565b5b80821115620002685760008160009055506001016200024e565b5090565b600060028204905060018216806200028557607f821691505b602082108114156200029c576200029b620002a2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612ab380620002e16000396000f3fe60806040526004361061019c5760003560e01c80636352211e116100ec578063a0712d681161008a578063c87b56dd11610064578063c87b56dd1461054b578063d5abeb0114610588578063e985e9c5146105b3578063f968adbe146105f05761019c565b8063a0712d68146104ea578063a22cb46514610506578063b88d4fde1461052f5761019c565b80638da5cb5b116100c65780638da5cb5b1461044057806391b7f5ed1461046b57806395d89b4114610494578063a035b1fe146104bf5761019c565b80636352211e1461039b5780636c0360eb146103d857806370a08231146104035761019c565b806318160ddd116101595780632750fc78116101335780632750fc78146103145780633ccfd60b1461033d57806342842e0e14610354578063453c2310146103705761019c565b806318160ddd146102a2578063186601ca146102cd57806323b872dd146102f85761019c565b806301ffc9a7146101a1578063029877b6146101de57806306fdde03146101f5578063081812fc14610220578063095ea7b31461025d57806313af403514610279575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612173565b61061b565b6040516101d5919061246d565b60405180910390f35b3480156101ea57600080fd5b506101f36106ad565b005b34801561020157600080fd5b5061020a610794565b6040516102179190612488565b60405180910390f35b34801561022c57600080fd5b50610247600480360381019061024291906121cd565b610826565b6040516102549190612406565b60405180910390f35b61027760048036038101906102729190612106565b6108a5565b005b34801561028557600080fd5b506102a0600480360381019061029b9190611f83565b6109e9565b005b3480156102ae57600080fd5b506102b7610b17565b6040516102c491906125aa565b60405180910390f35b3480156102d957600080fd5b506102e2610b2e565b6040516102ef919061246d565b60405180910390f35b610312600480360381019061030d9190611ff0565b610b41565b005b34801561032057600080fd5b5061033b60048036038101906103369190612146565b610e66565b005b34801561034957600080fd5b50610352610f13565b005b61036e60048036038101906103699190611ff0565b61103b565b005b34801561037c57600080fd5b5061038561105b565b60405161039291906125aa565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd91906121cd565b611061565b6040516103cf9190612406565b60405180910390f35b3480156103e457600080fd5b506103ed611073565b6040516103fa9190612488565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190611f83565b611101565b60405161043791906125aa565b60405180910390f35b34801561044c57600080fd5b506104556111ba565b6040516104629190612406565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d91906121cd565b6111e0565b005b3480156104a057600080fd5b506104a961127a565b6040516104b69190612488565b60405180910390f35b3480156104cb57600080fd5b506104d461130c565b6040516104e191906125aa565b60405180910390f35b61050460048036038101906104ff91906121cd565b611312565b005b34801561051257600080fd5b5061052d600480360381019061052891906120c6565b6114b2565b005b61054960048036038101906105449190612043565b6115bd565b005b34801561055757600080fd5b50610572600480360381019061056d91906121cd565b611630565b60405161057f9190612488565b60405180910390f35b34801561059457600080fd5b5061059d6116cf565b6040516105aa91906125aa565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d59190611fb0565b6116d5565b6040516105e7919061246d565b60405180910390f35b3480156105fc57600080fd5b50610605611769565b60405161061291906125aa565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a65750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461073d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610734906124ca565b60405180910390fd5b6000610747610b17565b14610787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e906124ea565b60405180910390fd5b61079233603261176f565b565b6060600280546107a3906127c4565b80601f01602080910402602001604051908101604052809291908181526020018280546107cf906127c4565b801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b5050505050905090565b60006108318261192c565b610867576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b082611061565b90508073ffffffffffffffffffffffffffffffffffffffff166108d161198b565b73ffffffffffffffffffffffffffffffffffffffff1614610934576108fd816108f861198b565b6116d5565b610933576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a70906124ca565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a350565b6000610b21611993565b6001546000540303905090565b600d60009054906101000a900460ff1681565b6000610b4c8261199c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bb3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610bbf84611a6a565b91509150610bd58187610bd061198b565b611a91565b610c2157610bea86610be561198b565b6116d5565b610c20576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c88576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c958686866001611ad5565b8015610ca057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d6e85610d4a888887611adb565b7c020000000000000000000000000000000000000000000000000000000017611b03565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610df6576000600185019050600060046000838152602001908152602001600020541415610df4576000548114610df3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e5e8686866001611b2e565b505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906124ca565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a906124ca565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611039576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110309061250a565b60405180910390fd5b565b611056838383604051806020016040528060008152506115bd565b505050565b60095481565b600061106c8261199c565b9050919050565b600e8054611080906127c4565b80601f01602080910402602001604051908101604052809291908181526020018280546110ac906127c4565b80156110f95780601f106110ce576101008083540402835291602001916110f9565b820191906000526020600020905b8154815290600101906020018083116110dc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611169576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611270576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611267906124ca565b60405180910390fd5b80600c8190555050565b606060038054611289906127c4565b80601f01602080910402602001604051908101604052809291908181526020018280546112b5906127c4565b80156113025780601f106112d757610100808354040283529160200191611302565b820191906000526020600020905b8154815290600101906020018083116112e557829003601f168201915b5050505050905090565b600c5481565b600d60009054906101000a900460ff16611361576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113589061252a565b60405180910390fd5b600a548161136d610b17565b611377919061265e565b11156113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af906124aa565b60405180910390fd5b600b548111156113fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f49061254a565b60405180910390fd5b6009548161140a33611b34565b611414919061265e565b1115611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c9061256a565b60405180910390fd5b80600c5461146391906126b4565b3410156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c9061258a565b60405180910390fd5b6114af3382611b8b565b50565b80600760006114bf61198b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661156c61198b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115b1919061246d565b60405180910390a35050565b6115c8848484610b41565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461162a576115f384848484611ba9565b611629576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061163b8261192c565b611671576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061167b611d09565b905060008151141561169c57604051806020016040528060008152506116c7565b806116a684611d9b565b6040516020016116b79291906123e2565b6040516020818303038152906040525b915050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b60008054905060008214156117b0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117bd6000848385611ad5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611834836118256000866000611adb565b61182e85611df4565b17611b03565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146118d557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061189a565b506000821415611911576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506119276000848385611b2e565b505050565b600081611937611993565b11158015611946575060005482105b8015611984575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806119ab611993565b11611a3357600054811015611a325760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a30575b6000811415611a265760046000836001900393508381526020019081526020016000205490506119fb565b8092505050611a65565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611af2868684611e04565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611ba5828260405180602001604052806000815250611e0d565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bcf61198b565b8786866040518563ffffffff1660e01b8152600401611bf19493929190612421565b602060405180830381600087803b158015611c0b57600080fd5b505af1925050508015611c3c57506040513d601f19601f82011682018060405250810190611c3991906121a0565b60015b611cb6573d8060008114611c6c576040519150601f19603f3d011682016040523d82523d6000602084013e611c71565b606091505b50600081511415611cae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054611d18906127c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611d44906127c4565b8015611d915780601f10611d6657610100808354040283529160200191611d91565b820191906000526020600020905b815481529060010190602001808311611d7457829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115611ddf57600184039350600a81066030018453600a8104905080611dda57611ddf565b611db4565b50828103602084039350808452505050919050565b60006001821460e11b9050919050565b60009392505050565b611e17838361176f565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611ea557600080549050600083820390505b611e576000868380600101945086611ba9565b611e8d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611e44578160005414611ea257600080fd5b50505b505050565b6000611ebd611eb8846125ea565b6125c5565b905082815260208101848484011115611ed957611ed86128b9565b5b611ee4848285612782565b509392505050565b600081359050611efb81612a21565b92915050565b600081359050611f1081612a38565b92915050565b600081359050611f2581612a4f565b92915050565b600081519050611f3a81612a4f565b92915050565b600082601f830112611f5557611f546128b4565b5b8135611f65848260208601611eaa565b91505092915050565b600081359050611f7d81612a66565b92915050565b600060208284031215611f9957611f986128c3565b5b6000611fa784828501611eec565b91505092915050565b60008060408385031215611fc757611fc66128c3565b5b6000611fd585828601611eec565b9250506020611fe685828601611eec565b9150509250929050565b600080600060608486031215612009576120086128c3565b5b600061201786828701611eec565b935050602061202886828701611eec565b925050604061203986828701611f6e565b9150509250925092565b6000806000806080858703121561205d5761205c6128c3565b5b600061206b87828801611eec565b945050602061207c87828801611eec565b935050604061208d87828801611f6e565b925050606085013567ffffffffffffffff8111156120ae576120ad6128be565b5b6120ba87828801611f40565b91505092959194509250565b600080604083850312156120dd576120dc6128c3565b5b60006120eb85828601611eec565b92505060206120fc85828601611f01565b9150509250929050565b6000806040838503121561211d5761211c6128c3565b5b600061212b85828601611eec565b925050602061213c85828601611f6e565b9150509250929050565b60006020828403121561215c5761215b6128c3565b5b600061216a84828501611f01565b91505092915050565b600060208284031215612189576121886128c3565b5b600061219784828501611f16565b91505092915050565b6000602082840312156121b6576121b56128c3565b5b60006121c484828501611f2b565b91505092915050565b6000602082840312156121e3576121e26128c3565b5b60006121f184828501611f6e565b91505092915050565b6122038161270e565b82525050565b61221281612720565b82525050565b60006122238261261b565b61222d8185612631565b935061223d818560208601612791565b612246816128c8565b840191505092915050565b600061225c82612626565b6122668185612642565b9350612276818560208601612791565b61227f816128c8565b840191505092915050565b600061229582612626565b61229f8185612653565b93506122af818560208601612791565b80840191505092915050565b60006122c8600a83612642565b91506122d3826128d9565b602082019050919050565b60006122eb600c83612642565b91506122f682612902565b602082019050919050565b600061230e600e83612642565b91506123198261292b565b602082019050919050565b6000612331600c83612642565b915061233c82612954565b602082019050919050565b6000612354600883612642565b915061235f8261297d565b602082019050919050565b6000612377600f83612642565b9150612382826129a6565b602082019050919050565b600061239a601483612642565b91506123a5826129cf565b602082019050919050565b60006123bd601183612642565b91506123c8826129f8565b602082019050919050565b6123dc81612778565b82525050565b60006123ee828561228a565b91506123fa828461228a565b91508190509392505050565b600060208201905061241b60008301846121fa565b92915050565b600060808201905061243660008301876121fa565b61244360208301866121fa565b61245060408301856123d3565b81810360608301526124628184612218565b905095945050505050565b60006020820190506124826000830184612209565b92915050565b600060208201905081810360008301526124a28184612251565b905092915050565b600060208201905081810360008301526124c3816122bb565b9050919050565b600060208201905081810360008301526124e3816122de565b9050919050565b6000602082019050818103600083015261250381612301565b9050919050565b6000602082019050818103600083015261252381612324565b9050919050565b6000602082019050818103600083015261254381612347565b9050919050565b600060208201905081810360008301526125638161236a565b9050919050565b600060208201905081810360008301526125838161238d565b9050919050565b600060208201905081810360008301526125a3816123b0565b9050919050565b60006020820190506125bf60008301846123d3565b92915050565b60006125cf6125e0565b90506125db82826127f6565b919050565b6000604051905090565b600067ffffffffffffffff82111561260557612604612885565b5b61260e826128c8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061266982612778565b915061267483612778565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156126a9576126a8612827565b5b828201905092915050565b60006126bf82612778565b91506126ca83612778565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561270357612702612827565b5b828202905092915050565b600061271982612758565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156127af578082015181840152602081019050612794565b838111156127be576000848401525b50505050565b600060028204905060018216806127dc57607f821691505b602082108114156127f0576127ef612856565b5b50919050565b6127ff826128c8565b810181811067ffffffffffffffff8211171561281e5761281d612885565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416c6c206d696e74656400000000000000000000000000000000000000000000600082015250565b7f554e415554484f52495a45440000000000000000000000000000000000000000600082015250565b7f52455345525645532054414b454e000000000000000000000000000000000000600082015250565b7f554e5355434345535346554c0000000000000000000000000000000000000000600082015250565b7f496e616374697665000000000000000000000000000000000000000000000000600082015250565b7f546f6f206d616e7920666f722054780000000000000000000000000000000000600082015250565b7f546f6f206d616e7920666f722061646472657373000000000000000000000000600082015250565b7f4e6f7420656e6f756768742066756e6473000000000000000000000000000000600082015250565b612a2a8161270e565b8114612a3557600080fd5b50565b612a4181612720565b8114612a4c57600080fd5b50565b612a588161272c565b8114612a6357600080fd5b50565b612a6f81612778565b8114612a7a57600080fd5b5056fea264697066735822122052b545012a3d25e88000d3cdaba6bb0a83e8f631a620f8205f17e41f0e0cf0c264736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d57747167753346376e334250396f343759425a5358797442776478724d596170454a484d69556448446938732f
Deployed Bytecode
0x60806040526004361061019c5760003560e01c80636352211e116100ec578063a0712d681161008a578063c87b56dd11610064578063c87b56dd1461054b578063d5abeb0114610588578063e985e9c5146105b3578063f968adbe146105f05761019c565b8063a0712d68146104ea578063a22cb46514610506578063b88d4fde1461052f5761019c565b80638da5cb5b116100c65780638da5cb5b1461044057806391b7f5ed1461046b57806395d89b4114610494578063a035b1fe146104bf5761019c565b80636352211e1461039b5780636c0360eb146103d857806370a08231146104035761019c565b806318160ddd116101595780632750fc78116101335780632750fc78146103145780633ccfd60b1461033d57806342842e0e14610354578063453c2310146103705761019c565b806318160ddd146102a2578063186601ca146102cd57806323b872dd146102f85761019c565b806301ffc9a7146101a1578063029877b6146101de57806306fdde03146101f5578063081812fc14610220578063095ea7b31461025d57806313af403514610279575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612173565b61061b565b6040516101d5919061246d565b60405180910390f35b3480156101ea57600080fd5b506101f36106ad565b005b34801561020157600080fd5b5061020a610794565b6040516102179190612488565b60405180910390f35b34801561022c57600080fd5b50610247600480360381019061024291906121cd565b610826565b6040516102549190612406565b60405180910390f35b61027760048036038101906102729190612106565b6108a5565b005b34801561028557600080fd5b506102a0600480360381019061029b9190611f83565b6109e9565b005b3480156102ae57600080fd5b506102b7610b17565b6040516102c491906125aa565b60405180910390f35b3480156102d957600080fd5b506102e2610b2e565b6040516102ef919061246d565b60405180910390f35b610312600480360381019061030d9190611ff0565b610b41565b005b34801561032057600080fd5b5061033b60048036038101906103369190612146565b610e66565b005b34801561034957600080fd5b50610352610f13565b005b61036e60048036038101906103699190611ff0565b61103b565b005b34801561037c57600080fd5b5061038561105b565b60405161039291906125aa565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd91906121cd565b611061565b6040516103cf9190612406565b60405180910390f35b3480156103e457600080fd5b506103ed611073565b6040516103fa9190612488565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190611f83565b611101565b60405161043791906125aa565b60405180910390f35b34801561044c57600080fd5b506104556111ba565b6040516104629190612406565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d91906121cd565b6111e0565b005b3480156104a057600080fd5b506104a961127a565b6040516104b69190612488565b60405180910390f35b3480156104cb57600080fd5b506104d461130c565b6040516104e191906125aa565b60405180910390f35b61050460048036038101906104ff91906121cd565b611312565b005b34801561051257600080fd5b5061052d600480360381019061052891906120c6565b6114b2565b005b61054960048036038101906105449190612043565b6115bd565b005b34801561055757600080fd5b50610572600480360381019061056d91906121cd565b611630565b60405161057f9190612488565b60405180910390f35b34801561059457600080fd5b5061059d6116cf565b6040516105aa91906125aa565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d59190611fb0565b6116d5565b6040516105e7919061246d565b60405180910390f35b3480156105fc57600080fd5b50610605611769565b60405161061291906125aa565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a65750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461073d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610734906124ca565b60405180910390fd5b6000610747610b17565b14610787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e906124ea565b60405180910390fd5b61079233603261176f565b565b6060600280546107a3906127c4565b80601f01602080910402602001604051908101604052809291908181526020018280546107cf906127c4565b801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b5050505050905090565b60006108318261192c565b610867576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b082611061565b90508073ffffffffffffffffffffffffffffffffffffffff166108d161198b565b73ffffffffffffffffffffffffffffffffffffffff1614610934576108fd816108f861198b565b6116d5565b610933576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a70906124ca565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a350565b6000610b21611993565b6001546000540303905090565b600d60009054906101000a900460ff1681565b6000610b4c8261199c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bb3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610bbf84611a6a565b91509150610bd58187610bd061198b565b611a91565b610c2157610bea86610be561198b565b6116d5565b610c20576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c88576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c958686866001611ad5565b8015610ca057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d6e85610d4a888887611adb565b7c020000000000000000000000000000000000000000000000000000000017611b03565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610df6576000600185019050600060046000838152602001908152602001600020541415610df4576000548114610df3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e5e8686866001611b2e565b505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906124ca565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a906124ca565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611039576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110309061250a565b60405180910390fd5b565b611056838383604051806020016040528060008152506115bd565b505050565b60095481565b600061106c8261199c565b9050919050565b600e8054611080906127c4565b80601f01602080910402602001604051908101604052809291908181526020018280546110ac906127c4565b80156110f95780601f106110ce576101008083540402835291602001916110f9565b820191906000526020600020905b8154815290600101906020018083116110dc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611169576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611270576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611267906124ca565b60405180910390fd5b80600c8190555050565b606060038054611289906127c4565b80601f01602080910402602001604051908101604052809291908181526020018280546112b5906127c4565b80156113025780601f106112d757610100808354040283529160200191611302565b820191906000526020600020905b8154815290600101906020018083116112e557829003601f168201915b5050505050905090565b600c5481565b600d60009054906101000a900460ff16611361576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113589061252a565b60405180910390fd5b600a548161136d610b17565b611377919061265e565b11156113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af906124aa565b60405180910390fd5b600b548111156113fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f49061254a565b60405180910390fd5b6009548161140a33611b34565b611414919061265e565b1115611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c9061256a565b60405180910390fd5b80600c5461146391906126b4565b3410156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c9061258a565b60405180910390fd5b6114af3382611b8b565b50565b80600760006114bf61198b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661156c61198b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115b1919061246d565b60405180910390a35050565b6115c8848484610b41565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461162a576115f384848484611ba9565b611629576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061163b8261192c565b611671576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061167b611d09565b905060008151141561169c57604051806020016040528060008152506116c7565b806116a684611d9b565b6040516020016116b79291906123e2565b6040516020818303038152906040525b915050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b60008054905060008214156117b0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117bd6000848385611ad5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611834836118256000866000611adb565b61182e85611df4565b17611b03565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146118d557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061189a565b506000821415611911576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506119276000848385611b2e565b505050565b600081611937611993565b11158015611946575060005482105b8015611984575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806119ab611993565b11611a3357600054811015611a325760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a30575b6000811415611a265760046000836001900393508381526020019081526020016000205490506119fb565b8092505050611a65565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611af2868684611e04565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611ba5828260405180602001604052806000815250611e0d565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bcf61198b565b8786866040518563ffffffff1660e01b8152600401611bf19493929190612421565b602060405180830381600087803b158015611c0b57600080fd5b505af1925050508015611c3c57506040513d601f19601f82011682018060405250810190611c3991906121a0565b60015b611cb6573d8060008114611c6c576040519150601f19603f3d011682016040523d82523d6000602084013e611c71565b606091505b50600081511415611cae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054611d18906127c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611d44906127c4565b8015611d915780601f10611d6657610100808354040283529160200191611d91565b820191906000526020600020905b815481529060010190602001808311611d7457829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115611ddf57600184039350600a81066030018453600a8104905080611dda57611ddf565b611db4565b50828103602084039350808452505050919050565b60006001821460e11b9050919050565b60009392505050565b611e17838361176f565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611ea557600080549050600083820390505b611e576000868380600101945086611ba9565b611e8d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611e44578160005414611ea257600080fd5b50505b505050565b6000611ebd611eb8846125ea565b6125c5565b905082815260208101848484011115611ed957611ed86128b9565b5b611ee4848285612782565b509392505050565b600081359050611efb81612a21565b92915050565b600081359050611f1081612a38565b92915050565b600081359050611f2581612a4f565b92915050565b600081519050611f3a81612a4f565b92915050565b600082601f830112611f5557611f546128b4565b5b8135611f65848260208601611eaa565b91505092915050565b600081359050611f7d81612a66565b92915050565b600060208284031215611f9957611f986128c3565b5b6000611fa784828501611eec565b91505092915050565b60008060408385031215611fc757611fc66128c3565b5b6000611fd585828601611eec565b9250506020611fe685828601611eec565b9150509250929050565b600080600060608486031215612009576120086128c3565b5b600061201786828701611eec565b935050602061202886828701611eec565b925050604061203986828701611f6e565b9150509250925092565b6000806000806080858703121561205d5761205c6128c3565b5b600061206b87828801611eec565b945050602061207c87828801611eec565b935050604061208d87828801611f6e565b925050606085013567ffffffffffffffff8111156120ae576120ad6128be565b5b6120ba87828801611f40565b91505092959194509250565b600080604083850312156120dd576120dc6128c3565b5b60006120eb85828601611eec565b92505060206120fc85828601611f01565b9150509250929050565b6000806040838503121561211d5761211c6128c3565b5b600061212b85828601611eec565b925050602061213c85828601611f6e565b9150509250929050565b60006020828403121561215c5761215b6128c3565b5b600061216a84828501611f01565b91505092915050565b600060208284031215612189576121886128c3565b5b600061219784828501611f16565b91505092915050565b6000602082840312156121b6576121b56128c3565b5b60006121c484828501611f2b565b91505092915050565b6000602082840312156121e3576121e26128c3565b5b60006121f184828501611f6e565b91505092915050565b6122038161270e565b82525050565b61221281612720565b82525050565b60006122238261261b565b61222d8185612631565b935061223d818560208601612791565b612246816128c8565b840191505092915050565b600061225c82612626565b6122668185612642565b9350612276818560208601612791565b61227f816128c8565b840191505092915050565b600061229582612626565b61229f8185612653565b93506122af818560208601612791565b80840191505092915050565b60006122c8600a83612642565b91506122d3826128d9565b602082019050919050565b60006122eb600c83612642565b91506122f682612902565b602082019050919050565b600061230e600e83612642565b91506123198261292b565b602082019050919050565b6000612331600c83612642565b915061233c82612954565b602082019050919050565b6000612354600883612642565b915061235f8261297d565b602082019050919050565b6000612377600f83612642565b9150612382826129a6565b602082019050919050565b600061239a601483612642565b91506123a5826129cf565b602082019050919050565b60006123bd601183612642565b91506123c8826129f8565b602082019050919050565b6123dc81612778565b82525050565b60006123ee828561228a565b91506123fa828461228a565b91508190509392505050565b600060208201905061241b60008301846121fa565b92915050565b600060808201905061243660008301876121fa565b61244360208301866121fa565b61245060408301856123d3565b81810360608301526124628184612218565b905095945050505050565b60006020820190506124826000830184612209565b92915050565b600060208201905081810360008301526124a28184612251565b905092915050565b600060208201905081810360008301526124c3816122bb565b9050919050565b600060208201905081810360008301526124e3816122de565b9050919050565b6000602082019050818103600083015261250381612301565b9050919050565b6000602082019050818103600083015261252381612324565b9050919050565b6000602082019050818103600083015261254381612347565b9050919050565b600060208201905081810360008301526125638161236a565b9050919050565b600060208201905081810360008301526125838161238d565b9050919050565b600060208201905081810360008301526125a3816123b0565b9050919050565b60006020820190506125bf60008301846123d3565b92915050565b60006125cf6125e0565b90506125db82826127f6565b919050565b6000604051905090565b600067ffffffffffffffff82111561260557612604612885565b5b61260e826128c8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061266982612778565b915061267483612778565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156126a9576126a8612827565b5b828201905092915050565b60006126bf82612778565b91506126ca83612778565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561270357612702612827565b5b828202905092915050565b600061271982612758565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156127af578082015181840152602081019050612794565b838111156127be576000848401525b50505050565b600060028204905060018216806127dc57607f821691505b602082108114156127f0576127ef612856565b5b50919050565b6127ff826128c8565b810181811067ffffffffffffffff8211171561281e5761281d612885565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416c6c206d696e74656400000000000000000000000000000000000000000000600082015250565b7f554e415554484f52495a45440000000000000000000000000000000000000000600082015250565b7f52455345525645532054414b454e000000000000000000000000000000000000600082015250565b7f554e5355434345535346554c0000000000000000000000000000000000000000600082015250565b7f496e616374697665000000000000000000000000000000000000000000000000600082015250565b7f546f6f206d616e7920666f722054780000000000000000000000000000000000600082015250565b7f546f6f206d616e7920666f722061646472657373000000000000000000000000600082015250565b7f4e6f7420656e6f756768742066756e6473000000000000000000000000000000600082015250565b612a2a8161270e565b8114612a3557600080fd5b50565b612a4181612720565b8114612a4c57600080fd5b50565b612a588161272c565b8114612a6357600080fd5b50565b612a6f81612778565b8114612a7a57600080fd5b5056fea264697066735822122052b545012a3d25e88000d3cdaba6bb0a83e8f631a620f8205f17e41f0e0cf0c264736f6c63430008070033
Deployed Bytecode Sourcemap
53041:1578:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19937:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54328:136;;;;;;;;;;;;;:::i;:::-;;20839:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27330:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26763:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1378:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16590:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53239:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30969:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54224:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54472:144;;;;;;;;;;;;;:::i;:::-;;33890:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53087:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22232:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53269:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17774:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;742:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54136:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21015:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53197:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53446:471;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27888:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34681:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21225:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53125:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28279:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53163:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19937:639;20022:4;20361:10;20346:25;;:11;:25;;;;:102;;;;20438:10;20423:25;;:11;:25;;;;20346:102;:179;;;;20515:10;20500:25;;:11;:25;;;;20346:179;20326:199;;19937:639;;;:::o;54328:136::-;833:5;;;;;;;;;;;819:19;;:10;:19;;;811:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;54406:1:::1;54389:13;:11;:13::i;:::-;:18;54381:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;54435:21;54441:10;54453:2;54435:5;:21::i;:::-;54328:136::o:0;20839:100::-;20893:13;20926:5;20919:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20839:100;:::o;27330:218::-;27406:7;27431:16;27439:7;27431;:16::i;:::-;27426:64;;27456:34;;;;;;;;;;;;;;27426:64;27510:15;:24;27526:7;27510:24;;;;;;;;;;;:30;;;;;;;;;;;;27503:37;;27330:218;;;:::o;26763:408::-;26852:13;26868:16;26876:7;26868;:16::i;:::-;26852:32;;26924:5;26901:28;;:19;:17;:19::i;:::-;:28;;;26897:175;;26949:44;26966:5;26973:19;:17;:19::i;:::-;26949:16;:44::i;:::-;26944:128;;27021:35;;;;;;;;;;;;;;26944:128;26897:175;27117:2;27084:15;:24;27100:7;27084:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;27155:7;27151:2;27135:28;;27144:5;27135:28;;;;;;;;;;;;26841:330;26763:408;;:::o;1378:148::-;833:5;;;;;;;;;;;819:19;;:10;:19;;;811:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;1458:8:::1;1450:5;;:16;;;;;;;;;;;;;;;;;;1509:8;1484:34;;1497:10;1484:34;;;;;;;;;;;;1378:148:::0;:::o;16590:323::-;16651:7;16879:15;:13;:15::i;:::-;16864:12;;16848:13;;:28;:46;16841:53;;16590:323;:::o;53239:21::-;;;;;;;;;;;;;:::o;30969:2825::-;31111:27;31141;31160:7;31141:18;:27::i;:::-;31111:57;;31226:4;31185:45;;31201:19;31185:45;;;31181:86;;31239:28;;;;;;;;;;;;;;31181:86;31281:27;31310:23;31337:35;31364:7;31337:26;:35::i;:::-;31280:92;;;;31472:68;31497:15;31514:4;31520:19;:17;:19::i;:::-;31472:24;:68::i;:::-;31467:180;;31560:43;31577:4;31583:19;:17;:19::i;:::-;31560:16;:43::i;:::-;31555:92;;31612:35;;;;;;;;;;;;;;31555:92;31467:180;31678:1;31664:16;;:2;:16;;;31660:52;;;31689:23;;;;;;;;;;;;;;31660:52;31725:43;31747:4;31753:2;31757:7;31766:1;31725:21;:43::i;:::-;31861:15;31858:160;;;32001:1;31980:19;31973:30;31858:160;32398:18;:24;32417:4;32398:24;;;;;;;;;;;;;;;;32396:26;;;;;;;;;;;;32467:18;:22;32486:2;32467:22;;;;;;;;;;;;;;;;32465:24;;;;;;;;;;;32789:146;32826:2;32875:45;32890:4;32896:2;32900:19;32875:14;:45::i;:::-;12989:8;32847:73;32789:18;:146::i;:::-;32760:17;:26;32778:7;32760:26;;;;;;;;;;;:175;;;;33106:1;12989:8;33055:19;:47;:52;33051:627;;;33128:19;33160:1;33150:7;:11;33128:33;;33317:1;33283:17;:30;33301:11;33283:30;;;;;;;;;;;;:35;33279:384;;;33421:13;;33406:11;:28;33402:242;;33601:19;33568:17;:30;33586:11;33568:30;;;;;;;;;;;:52;;;;33402:242;33279:384;33109:569;33051:627;33725:7;33721:2;33706:27;;33715:4;33706:27;;;;;;;;;;;;33744:42;33765:4;33771:2;33775:7;33784:1;33744:20;:42::i;:::-;31100:2694;;;30969:2825;;;:::o;54224:96::-;833:5;;;;;;;;;;;819:19;;:10;:19;;;811:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;54303:9:::1;54291;;:21;;;;;;;;;;;;;;;;;;54224:96:::0;:::o;54472:144::-;833:5;;;;;;;;;;;819:19;;:10;:19;;;811:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;54542:5:::1;;;;;;;;;;;54534:19;;:42;54554:21;54534:42;;;;;;;;;;;;;;;;;;;;;;;54518:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;54472:144::o:0;33890:193::-;34036:39;34053:4;34059:2;34063:7;34036:39;;;;;;;;;;;;:16;:39::i;:::-;33890:193;;;:::o;53087:31::-;;;;:::o;22232:152::-;22304:7;22347:27;22366:7;22347:18;:27::i;:::-;22324:52;;22232:152;;;:::o;53269:94::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17774:233::-;17846:7;17887:1;17870:19;;:5;:19;;;17866:60;;;17898:28;;;;;;;;;;;;;;17866:60;11933:13;17944:18;:25;17963:5;17944:25;;;;;;;;;;;;;;;;:55;17937:62;;17774:233;;;:::o;742:20::-;;;;;;;;;;;;;:::o;54136:80::-;833:5;;;;;;;;;;;819:19;;:10;:19;;;811:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;54202:6:::1;54194:5;:14;;;;54136:80:::0;:::o;21015:104::-;21071:13;21104:7;21097:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21015:104;:::o;53197:33::-;;;;:::o;53446:471::-;53520:9;;;;;;;;;;;53512:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;53595:9;;53577:14;53561:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;53553:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;53656:8;;53638:14;:26;;53630:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;53749:12;;53731:14;53703:25;53717:10;53703:13;:25::i;:::-;:42;;;;:::i;:::-;:58;;53695:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;53825:14;53817:5;;:22;;;;:::i;:::-;53804:9;:35;;53796:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53872:37;53882:10;53894:14;53872:9;:37::i;:::-;53446:471;:::o;27888:234::-;28035:8;27983:18;:39;28002:19;:17;:19::i;:::-;27983:39;;;;;;;;;;;;;;;:49;28023:8;27983:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;28095:8;28059:55;;28074:19;:17;:19::i;:::-;28059:55;;;28105:8;28059:55;;;;;;:::i;:::-;;;;;;;;27888:234;;:::o;34681:407::-;34856:31;34869:4;34875:2;34879:7;34856:12;:31::i;:::-;34920:1;34902:2;:14;;;:19;34898:183;;34941:56;34972:4;34978:2;34982:7;34991:5;34941:30;:56::i;:::-;34936:145;;35025:40;;;;;;;;;;;;;;34936:145;34898:183;34681:407;;;;:::o;21225:318::-;21298:13;21329:16;21337:7;21329;:16::i;:::-;21324:59;;21354:29;;;;;;;;;;;;;;21324:59;21396:21;21420:10;:8;:10::i;:::-;21396:34;;21473:1;21454:7;21448:21;:26;;:87;;;;;;;;;;;;;;;;;21501:7;21510:18;21520:7;21510:9;:18::i;:::-;21484:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21448:87;21441:94;;;21225:318;;;:::o;53125:31::-;;;;:::o;28279:164::-;28376:4;28400:18;:25;28419:5;28400:25;;;;;;;;;;;;;;;:35;28426:8;28400:35;;;;;;;;;;;;;;;;;;;;;;;;;28393:42;;28279:164;;;;:::o;53163:27::-;;;;:::o;38350:2966::-;38423:20;38446:13;;38423:36;;38486:1;38474:8;:13;38470:44;;;38496:18;;;;;;;;;;;;;;38470:44;38527:61;38557:1;38561:2;38565:12;38579:8;38527:21;:61::i;:::-;39071:1;12071:2;39041:1;:26;;39040:32;39028:8;:45;39002:18;:22;39021:2;39002:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;39350:139;39387:2;39441:33;39464:1;39468:2;39472:1;39441:14;:33::i;:::-;39408:30;39429:8;39408:20;:30::i;:::-;:66;39350:18;:139::i;:::-;39316:17;:31;39334:12;39316:31;;;;;;;;;;;:173;;;;39506:16;39537:11;39566:8;39551:12;:23;39537:37;;40087:16;40083:2;40079:25;40067:37;;40459:12;40419:8;40378:1;40316:25;40257:1;40196;40169:335;40830:1;40816:12;40812:20;40770:346;40871:3;40862:7;40859:16;40770:346;;41089:7;41079:8;41076:1;41049:25;41046:1;41043;41038:59;40924:1;40915:7;40911:15;40900:26;;40770:346;;;40774:77;41161:1;41149:8;:13;41145:45;;;41171:19;;;;;;;;;;;;;;41145:45;41223:3;41207:13;:19;;;;38776:2462;;41248:60;41277:1;41281:2;41285:12;41299:8;41248:20;:60::i;:::-;38412:2904;38350:2966;;:::o;28701:282::-;28766:4;28822:7;28803:15;:13;:15::i;:::-;:26;;:66;;;;;28856:13;;28846:7;:23;28803:66;:153;;;;;28955:1;12709:8;28907:17;:26;28925:7;28907:26;;;;;;;;;;;;:44;:49;28803:153;28783:173;;28701:282;;;:::o;51009:105::-;51069:7;51096:10;51089:17;;51009:105;:::o;53929:91::-;53986:7;54013:1;54006:8;;53929:91;:::o;23387:1275::-;23454:7;23474:12;23489:7;23474:22;;23557:4;23538:15;:13;:15::i;:::-;:23;23534:1061;;23591:13;;23584:4;:20;23580:1015;;;23629:14;23646:17;:23;23664:4;23646:23;;;;;;;;;;;;23629:40;;23763:1;12709:8;23735:6;:24;:29;23731:845;;;24400:113;24417:1;24407:6;:11;24400:113;;;24460:17;:25;24478:6;;;;;;;24460:25;;;;;;;;;;;;24451:34;;24400:113;;;24546:6;24539:13;;;;;;23731:845;23606:989;23580:1015;23534:1061;24623:31;;;;;;;;;;;;;;23387:1275;;;;:::o;29864:485::-;29966:27;29995:23;30036:38;30077:15;:24;30093:7;30077:24;;;;;;;;;;;30036:65;;30254:18;30231:41;;30311:19;30305:26;30286:45;;30216:126;29864:485;;;:::o;29092:659::-;29241:11;29406:16;29399:5;29395:28;29386:37;;29566:16;29555:9;29551:32;29538:45;;29716:15;29705:9;29702:30;29694:5;29683:9;29680:20;29677:56;29667:66;;29092:659;;;;;:::o;35750:159::-;;;;;:::o;50318:311::-;50453:7;50473:16;13113:3;50499:19;:41;;50473:68;;13113:3;50567:31;50578:4;50584:2;50588:9;50567:10;:31::i;:::-;50559:40;;:62;;50552:69;;;50318:311;;;;;:::o;25210:450::-;25290:14;25458:16;25451:5;25447:28;25438:37;;25635:5;25621:11;25596:23;25592:41;25589:52;25582:5;25579:63;25569:73;;25210:450;;;;:::o;36574:158::-;;;;;:::o;18089:178::-;18150:7;11933:13;12071:2;18178:18;:25;18197:5;18178:25;;;;;;;;;;;;;;;;:50;;18177:82;18170:89;;18089:178;;;:::o;44841:112::-;44918:27;44928:2;44932:8;44918:27;;;;;;;;;;;;:9;:27::i;:::-;44841:112;;:::o;37172:716::-;37335:4;37381:2;37356:45;;;37402:19;:17;:19::i;:::-;37423:4;37429:7;37438:5;37356:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37352:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37656:1;37639:6;:13;:18;37635:235;;;37685:40;;;;;;;;;;;;;;37635:235;37828:6;37822:13;37813:6;37809:2;37805:15;37798:38;37352:529;37525:54;;;37515:64;;;:6;:64;;;;37508:71;;;37172:716;;;;;;:::o;54028:100::-;54080:13;54113:7;54106:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54028:100;:::o;51216:1745::-;51281:17;51715:4;51708;51702:11;51698:22;51807:1;51801:4;51794:15;51882:4;51879:1;51875:12;51868:19;;51964:1;51959:3;51952:14;52068:3;52307:5;52289:428;52315:1;52289:428;;;52355:1;52350:3;52346:11;52339:18;;52526:2;52520:4;52516:13;52512:2;52508:22;52503:3;52495:36;52620:2;52614:4;52610:13;52602:21;;52687:4;52677:25;;52695:5;;52677:25;52289:428;;;52293:21;52756:3;52751;52747:13;52871:4;52866:3;52862:14;52855:21;;52936:6;52931:3;52924:19;51320:1634;;;51216:1745;;;:::o;25762:324::-;25832:14;26065:1;26055:8;26052:15;26026:24;26022:46;26012:56;;25762:324;;;:::o;50019:147::-;50156:6;50019:147;;;;;:::o;44068:689::-;44199:19;44205:2;44209:8;44199:5;:19::i;:::-;44278:1;44260:2;:14;;;:19;44256:483;;44300:11;44314:13;;44300:27;;44346:13;44368:8;44362:3;:14;44346:30;;44395:233;44426:62;44465:1;44469:2;44473:7;;;;;;44482:5;44426:30;:62::i;:::-;44421:167;;44524:40;;;;;;;;;;;;;;44421:167;44623:3;44615:5;:11;44395:233;;44710:3;44693:13;;:20;44689:34;;44715:8;;;44689:34;44281:458;;44256:483;44068:689;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:323::-;4898:6;4947:2;4935:9;4926:7;4922:23;4918:32;4915:119;;;4953:79;;:::i;:::-;4915:119;5073:1;5098:50;5140:7;5131:6;5120:9;5116:22;5098:50;:::i;:::-;5088:60;;5044:114;4842:323;;;;:::o;5171:327::-;5229:6;5278:2;5266:9;5257:7;5253:23;5249:32;5246:119;;;5284:79;;:::i;:::-;5246:119;5404:1;5429:52;5473:7;5464:6;5453:9;5449:22;5429:52;:::i;:::-;5419:62;;5375:116;5171:327;;;;:::o;5504:349::-;5573:6;5622:2;5610:9;5601:7;5597:23;5593:32;5590:119;;;5628:79;;:::i;:::-;5590:119;5748:1;5773:63;5828:7;5819:6;5808:9;5804:22;5773:63;:::i;:::-;5763:73;;5719:127;5504:349;;;;:::o;5859:329::-;5918:6;5967:2;5955:9;5946:7;5942:23;5938:32;5935:119;;;5973:79;;:::i;:::-;5935:119;6093:1;6118:53;6163:7;6154:6;6143:9;6139:22;6118:53;:::i;:::-;6108:63;;6064:117;5859:329;;;;:::o;6194:118::-;6281:24;6299:5;6281:24;:::i;:::-;6276:3;6269:37;6194:118;;:::o;6318:109::-;6399:21;6414:5;6399:21;:::i;:::-;6394:3;6387:34;6318:109;;:::o;6433:360::-;6519:3;6547:38;6579:5;6547:38;:::i;:::-;6601:70;6664:6;6659:3;6601:70;:::i;:::-;6594:77;;6680:52;6725:6;6720:3;6713:4;6706:5;6702:16;6680:52;:::i;:::-;6757:29;6779:6;6757:29;:::i;:::-;6752:3;6748:39;6741:46;;6523:270;6433:360;;;;:::o;6799:364::-;6887:3;6915:39;6948:5;6915:39;:::i;:::-;6970:71;7034:6;7029:3;6970:71;:::i;:::-;6963:78;;7050:52;7095:6;7090:3;7083:4;7076:5;7072:16;7050:52;:::i;:::-;7127:29;7149:6;7127:29;:::i;:::-;7122:3;7118:39;7111:46;;6891:272;6799:364;;;;:::o;7169:377::-;7275:3;7303:39;7336:5;7303:39;:::i;:::-;7358:89;7440:6;7435:3;7358:89;:::i;:::-;7351:96;;7456:52;7501:6;7496:3;7489:4;7482:5;7478:16;7456:52;:::i;:::-;7533:6;7528:3;7524:16;7517:23;;7279:267;7169:377;;;;:::o;7552:366::-;7694:3;7715:67;7779:2;7774:3;7715:67;:::i;:::-;7708:74;;7791:93;7880:3;7791:93;:::i;:::-;7909:2;7904:3;7900:12;7893:19;;7552:366;;;:::o;7924:::-;8066:3;8087:67;8151:2;8146:3;8087:67;:::i;:::-;8080:74;;8163:93;8252:3;8163:93;:::i;:::-;8281:2;8276:3;8272:12;8265:19;;7924:366;;;:::o;8296:::-;8438:3;8459:67;8523:2;8518:3;8459:67;:::i;:::-;8452:74;;8535:93;8624:3;8535:93;:::i;:::-;8653:2;8648:3;8644:12;8637:19;;8296:366;;;:::o;8668:::-;8810:3;8831:67;8895:2;8890:3;8831:67;:::i;:::-;8824:74;;8907:93;8996:3;8907:93;:::i;:::-;9025:2;9020:3;9016:12;9009:19;;8668:366;;;:::o;9040:365::-;9182:3;9203:66;9267:1;9262:3;9203:66;:::i;:::-;9196:73;;9278:93;9367:3;9278:93;:::i;:::-;9396:2;9391:3;9387:12;9380:19;;9040:365;;;:::o;9411:366::-;9553:3;9574:67;9638:2;9633:3;9574:67;:::i;:::-;9567:74;;9650:93;9739:3;9650:93;:::i;:::-;9768:2;9763:3;9759:12;9752:19;;9411:366;;;:::o;9783:::-;9925:3;9946:67;10010:2;10005:3;9946:67;:::i;:::-;9939:74;;10022:93;10111:3;10022:93;:::i;:::-;10140:2;10135:3;10131:12;10124:19;;9783:366;;;:::o;10155:::-;10297:3;10318:67;10382:2;10377:3;10318:67;:::i;:::-;10311:74;;10394:93;10483:3;10394:93;:::i;:::-;10512:2;10507:3;10503:12;10496:19;;10155:366;;;:::o;10527:118::-;10614:24;10632:5;10614:24;:::i;:::-;10609:3;10602:37;10527:118;;:::o;10651:435::-;10831:3;10853:95;10944:3;10935:6;10853:95;:::i;:::-;10846:102;;10965:95;11056:3;11047:6;10965:95;:::i;:::-;10958:102;;11077:3;11070:10;;10651:435;;;;;:::o;11092:222::-;11185:4;11223:2;11212:9;11208:18;11200:26;;11236:71;11304:1;11293:9;11289:17;11280:6;11236:71;:::i;:::-;11092:222;;;;:::o;11320:640::-;11515:4;11553:3;11542:9;11538:19;11530:27;;11567:71;11635:1;11624:9;11620:17;11611:6;11567:71;:::i;:::-;11648:72;11716:2;11705:9;11701:18;11692:6;11648:72;:::i;:::-;11730;11798:2;11787:9;11783:18;11774:6;11730:72;:::i;:::-;11849:9;11843:4;11839:20;11834:2;11823:9;11819:18;11812:48;11877:76;11948:4;11939:6;11877:76;:::i;:::-;11869:84;;11320:640;;;;;;;:::o;11966:210::-;12053:4;12091:2;12080:9;12076:18;12068:26;;12104:65;12166:1;12155:9;12151:17;12142:6;12104:65;:::i;:::-;11966:210;;;;:::o;12182:313::-;12295:4;12333:2;12322:9;12318:18;12310:26;;12382:9;12376:4;12372:20;12368:1;12357:9;12353:17;12346:47;12410:78;12483:4;12474:6;12410:78;:::i;:::-;12402:86;;12182:313;;;;:::o;12501:419::-;12667:4;12705:2;12694:9;12690:18;12682:26;;12754:9;12748:4;12744:20;12740:1;12729:9;12725:17;12718:47;12782:131;12908:4;12782:131;:::i;:::-;12774:139;;12501:419;;;:::o;12926:::-;13092:4;13130:2;13119:9;13115:18;13107:26;;13179:9;13173:4;13169:20;13165:1;13154:9;13150:17;13143:47;13207:131;13333:4;13207:131;:::i;:::-;13199:139;;12926:419;;;:::o;13351:::-;13517:4;13555:2;13544:9;13540:18;13532:26;;13604:9;13598:4;13594:20;13590:1;13579:9;13575:17;13568:47;13632:131;13758:4;13632:131;:::i;:::-;13624:139;;13351:419;;;:::o;13776:::-;13942:4;13980:2;13969:9;13965:18;13957:26;;14029:9;14023:4;14019:20;14015:1;14004:9;14000:17;13993:47;14057:131;14183:4;14057:131;:::i;:::-;14049:139;;13776:419;;;:::o;14201:::-;14367:4;14405:2;14394:9;14390:18;14382:26;;14454:9;14448:4;14444:20;14440:1;14429:9;14425:17;14418:47;14482:131;14608:4;14482:131;:::i;:::-;14474:139;;14201:419;;;:::o;14626:::-;14792:4;14830:2;14819:9;14815:18;14807:26;;14879:9;14873:4;14869:20;14865:1;14854:9;14850:17;14843:47;14907:131;15033:4;14907:131;:::i;:::-;14899:139;;14626:419;;;:::o;15051:::-;15217:4;15255:2;15244:9;15240:18;15232:26;;15304:9;15298:4;15294:20;15290:1;15279:9;15275:17;15268:47;15332:131;15458:4;15332:131;:::i;:::-;15324:139;;15051:419;;;:::o;15476:::-;15642:4;15680:2;15669:9;15665:18;15657:26;;15729:9;15723:4;15719:20;15715:1;15704:9;15700:17;15693:47;15757:131;15883:4;15757:131;:::i;:::-;15749:139;;15476:419;;;:::o;15901:222::-;15994:4;16032:2;16021:9;16017:18;16009:26;;16045:71;16113:1;16102:9;16098:17;16089:6;16045:71;:::i;:::-;15901:222;;;;:::o;16129:129::-;16163:6;16190:20;;:::i;:::-;16180:30;;16219:33;16247:4;16239:6;16219:33;:::i;:::-;16129:129;;;:::o;16264:75::-;16297:6;16330:2;16324:9;16314:19;;16264:75;:::o;16345:307::-;16406:4;16496:18;16488:6;16485:30;16482:56;;;16518:18;;:::i;:::-;16482:56;16556:29;16578:6;16556:29;:::i;:::-;16548:37;;16640:4;16634;16630:15;16622:23;;16345:307;;;:::o;16658:98::-;16709:6;16743:5;16737:12;16727:22;;16658:98;;;:::o;16762:99::-;16814:6;16848:5;16842:12;16832:22;;16762:99;;;:::o;16867:168::-;16950:11;16984:6;16979:3;16972:19;17024:4;17019:3;17015:14;17000:29;;16867:168;;;;:::o;17041:169::-;17125:11;17159:6;17154:3;17147:19;17199:4;17194:3;17190:14;17175:29;;17041:169;;;;:::o;17216:148::-;17318:11;17355:3;17340:18;;17216:148;;;;:::o;17370:305::-;17410:3;17429:20;17447:1;17429:20;:::i;:::-;17424:25;;17463:20;17481:1;17463:20;:::i;:::-;17458:25;;17617:1;17549:66;17545:74;17542:1;17539:81;17536:107;;;17623:18;;:::i;:::-;17536:107;17667:1;17664;17660:9;17653:16;;17370:305;;;;:::o;17681:348::-;17721:7;17744:20;17762:1;17744:20;:::i;:::-;17739:25;;17778:20;17796:1;17778:20;:::i;:::-;17773:25;;17966:1;17898:66;17894:74;17891:1;17888:81;17883:1;17876:9;17869:17;17865:105;17862:131;;;17973:18;;:::i;:::-;17862:131;18021:1;18018;18014:9;18003:20;;17681:348;;;;:::o;18035:96::-;18072:7;18101:24;18119:5;18101:24;:::i;:::-;18090:35;;18035:96;;;:::o;18137:90::-;18171:7;18214:5;18207:13;18200:21;18189:32;;18137:90;;;:::o;18233:149::-;18269:7;18309:66;18302:5;18298:78;18287:89;;18233:149;;;:::o;18388:126::-;18425:7;18465:42;18458:5;18454:54;18443:65;;18388:126;;;:::o;18520:77::-;18557:7;18586:5;18575:16;;18520:77;;;:::o;18603:154::-;18687:6;18682:3;18677;18664:30;18749:1;18740:6;18735:3;18731:16;18724:27;18603:154;;;:::o;18763:307::-;18831:1;18841:113;18855:6;18852:1;18849:13;18841:113;;;18940:1;18935:3;18931:11;18925:18;18921:1;18916:3;18912:11;18905:39;18877:2;18874:1;18870:10;18865:15;;18841:113;;;18972:6;18969:1;18966:13;18963:101;;;19052:1;19043:6;19038:3;19034:16;19027:27;18963:101;18812:258;18763:307;;;:::o;19076:320::-;19120:6;19157:1;19151:4;19147:12;19137:22;;19204:1;19198:4;19194:12;19225:18;19215:81;;19281:4;19273:6;19269:17;19259:27;;19215:81;19343:2;19335:6;19332:14;19312:18;19309:38;19306:84;;;19362:18;;:::i;:::-;19306:84;19127:269;19076:320;;;:::o;19402:281::-;19485:27;19507:4;19485:27;:::i;:::-;19477:6;19473:40;19615:6;19603:10;19600:22;19579:18;19567:10;19564:34;19561:62;19558:88;;;19626:18;;:::i;:::-;19558:88;19666:10;19662:2;19655:22;19445:238;19402:281;;:::o;19689:180::-;19737:77;19734:1;19727:88;19834:4;19831:1;19824:15;19858:4;19855:1;19848:15;19875:180;19923:77;19920:1;19913:88;20020:4;20017:1;20010:15;20044:4;20041:1;20034:15;20061:180;20109:77;20106:1;20099:88;20206:4;20203:1;20196:15;20230:4;20227:1;20220:15;20247:117;20356:1;20353;20346:12;20370:117;20479:1;20476;20469:12;20493:117;20602:1;20599;20592:12;20616:117;20725:1;20722;20715:12;20739:102;20780:6;20831:2;20827:7;20822:2;20815:5;20811:14;20807:28;20797:38;;20739:102;;;:::o;20847:160::-;20987:12;20983:1;20975:6;20971:14;20964:36;20847:160;:::o;21013:162::-;21153:14;21149:1;21141:6;21137:14;21130:38;21013:162;:::o;21181:164::-;21321:16;21317:1;21309:6;21305:14;21298:40;21181:164;:::o;21351:162::-;21491:14;21487:1;21479:6;21475:14;21468:38;21351:162;:::o;21519:158::-;21659:10;21655:1;21647:6;21643:14;21636:34;21519:158;:::o;21683:165::-;21823:17;21819:1;21811:6;21807:14;21800:41;21683:165;:::o;21854:170::-;21994:22;21990:1;21982:6;21978:14;21971:46;21854:170;:::o;22030:167::-;22170:19;22166:1;22158:6;22154:14;22147:43;22030:167;:::o;22203:122::-;22276:24;22294:5;22276:24;:::i;:::-;22269:5;22266:35;22256:63;;22315:1;22312;22305:12;22256:63;22203:122;:::o;22331:116::-;22401:21;22416:5;22401:21;:::i;:::-;22394:5;22391:32;22381:60;;22437:1;22434;22427:12;22381:60;22331:116;:::o;22453:120::-;22525:23;22542:5;22525:23;:::i;:::-;22518:5;22515:34;22505:62;;22563:1;22560;22553:12;22505:62;22453:120;:::o;22579:122::-;22652:24;22670:5;22652:24;:::i;:::-;22645:5;22642:35;22632:63;;22691:1;22688;22681:12;22632:63;22579:122;:::o
Swarm Source
ipfs://52b545012a3d25e88000d3cdaba6bb0a83e8f631a620f8205f17e41f0e0cf0c2
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.