Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 431 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 19733288 | 128 days ago | IN | 0 ETH | 0.00138689 | ||||
Set Approval For... | 17138187 | 492 days ago | IN | 0 ETH | 0.00169651 | ||||
Transfer From | 17096798 | 498 days ago | IN | 0 ETH | 0.00297615 | ||||
Set Approval For... | 17068564 | 502 days ago | IN | 0 ETH | 0.001957 | ||||
Set Approval For... | 17068540 | 502 days ago | IN | 0 ETH | 0.00220996 | ||||
Set Approval For... | 17068504 | 502 days ago | IN | 0 ETH | 0.00254226 | ||||
Transfer From | 17068411 | 502 days ago | IN | 0 ETH | 0.00234221 | ||||
Transfer From | 16698906 | 554 days ago | IN | 0 ETH | 0.00194451 | ||||
Transfer From | 16638007 | 563 days ago | IN | 0 ETH | 0.00183426 | ||||
Transfer From | 16637979 | 563 days ago | IN | 0 ETH | 0.00282304 | ||||
Transfer From | 16635759 | 563 days ago | IN | 0 ETH | 0.00325415 | ||||
Set Approval For... | 16613997 | 566 days ago | IN | 0 ETH | 0.00081419 | ||||
Transfer From | 16613894 | 566 days ago | IN | 0 ETH | 0.00077546 | ||||
Transfer From | 16613893 | 566 days ago | IN | 0 ETH | 0.00069443 | ||||
Set Approval For... | 16569927 | 572 days ago | IN | 0 ETH | 0.00092272 | ||||
Transfer From | 16227013 | 620 days ago | IN | 0 ETH | 0.00118174 | ||||
Transfer From | 16226953 | 620 days ago | IN | 0 ETH | 0.00151 | ||||
Transfer From | 16226885 | 620 days ago | IN | 0 ETH | 0.00152631 | ||||
Transfer From | 16226847 | 620 days ago | IN | 0 ETH | 0.00334826 | ||||
Transfer From | 16226729 | 620 days ago | IN | 0 ETH | 0.00157565 | ||||
Transfer From | 16226650 | 620 days ago | IN | 0 ETH | 0.00137869 | ||||
Transfer From | 16226579 | 620 days ago | IN | 0 ETH | 0.00109102 | ||||
Update Vault | 16152486 | 631 days ago | IN | 0 ETH | 0.00040161 | ||||
Transfer From | 16148690 | 631 days ago | IN | 0 ETH | 0.00142867 | ||||
Mint | 16148668 | 631 days ago | IN | 1.4 ETH | 0.00331508 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16148668 | 631 days ago | 1.4 ETH | ||||
15667500 | 698 days ago | 5.6 ETH | ||||
15660792 | 699 days ago | 2.8 ETH | ||||
15653164 | 700 days ago | 1.4 ETH | ||||
15647215 | 701 days ago | 1.2 ETH | ||||
15645333 | 701 days ago | 1.2 ETH | ||||
15610835 | 706 days ago | 6 ETH | ||||
15606528 | 707 days ago | 1.2 ETH | ||||
15588917 | 709 days ago | 1.2 ETH | ||||
15567145 | 712 days ago | 1.2 ETH | ||||
15542382 | 716 days ago | 3.6 ETH | ||||
15519647 | 720 days ago | 2.4 ETH | ||||
15514720 | 720 days ago | 1.2 ETH | ||||
15447337 | 731 days ago | 1.2 ETH | ||||
15426301 | 735 days ago | 1.2 ETH | ||||
15422356 | 735 days ago | 1.2 ETH | ||||
15422307 | 735 days ago | 2.4 ETH | ||||
15396114 | 739 days ago | 1.2 ETH | ||||
15383229 | 741 days ago | 1.2 ETH | ||||
15383011 | 741 days ago | 1.2 ETH | ||||
15382037 | 742 days ago | 1.2 ETH | ||||
15378083 | 742 days ago | 1.2 ETH | ||||
15377795 | 742 days ago | 1.2 ETH | ||||
15377749 | 742 days ago | 1.2 ETH | ||||
15377176 | 742 days ago | 1.2 ETH |
Loading...
Loading
Contract Name:
ValiantDAO
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-11 */ // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: ValiantDAO.sol pragma solidity ^0.8.0; contract ValiantDAO is ERC721A,ERC721AQueryable,Ownable { string private baseTokenURI; uint256 public maxSupply; uint256 public price; uint256 public priceIncreaseValue; uint256 public priceIncreaseCondition; uint256 public lastPriceIncreaseSupply; mapping(address => bool) public whiteList; address payable public vault; modifier priceIncreaseMod() { _; priceIncreaseFun(); } constructor(uint256 maxSupply_, uint256 price_, uint256 priceIncreaseValue_, uint256 priceIncreaseCondition_, address payable vault_) ERC721A("ValiantDAO", "ValiantDAO") { maxSupply = maxSupply_; price = price_; priceIncreaseValue = priceIncreaseValue_; priceIncreaseCondition = priceIncreaseCondition_; require(vault_ != address(0), "A"); vault = vault_; } /* */ function mint(uint256 count_) public payable priceIncreaseMod { require(count_ > 0, "Amount to mint is 0"); require(totalSupply() + count_ <= maxSupply, "Sold out!"); if(!whiteList[msg.sender]){ require(msg.value >= count_ * price, "Send a enough amount of eth"); } _safeMint(msg.sender, count_); uint256 _balance = address(this).balance; if(_balance > 0){ vault.transfer(address(this).balance); } } /* */ function priceIncreaseFun() public { uint256 increaseNum = (totalSupply() - lastPriceIncreaseSupply) / priceIncreaseCondition; if(increaseNum > 0){ price += priceIncreaseValue * increaseNum; lastPriceIncreaseSupply = totalSupply(); } } /* */ function budgetPrice(uint256 count_) public view returns (uint256) { uint256 increaseNum = (totalSupply() + count_ - lastPriceIncreaseSupply) / priceIncreaseCondition; if(increaseNum > 0){ return priceIncreaseValue * increaseNum + price; }else{ return price; } } /* */ function updateMaxSupply(uint256 maxSupply_) external onlyOwner{ require(maxSupply_ >= totalSupply(), "A"); maxSupply = maxSupply_; } /* */ function updatePrice(uint256 price_) external onlyOwner{ price = price_; } /* */ function updatePriceIncreaseValue(uint256 priceIncreaseValue_) external onlyOwner{ priceIncreaseValue = priceIncreaseValue_; } /* */ function updatePriceIncreaseCondition(uint256 priceIncreaseCondition_) external onlyOwner priceIncreaseMod { priceIncreaseCondition = priceIncreaseCondition_; } /* */ function updateVault(address payable vault_) external onlyOwner{ require(vault_ != address(0), "A"); vault = vault_; } /* */ function batchAddWhiteList(address[] calldata whiteList_) external onlyOwner{ for(uint256 i; i<whiteList_.length; i++){ whiteList[whiteList_[i]] = true; } } /* */ function batchRmWhiteList(address[] calldata whiteList_) external onlyOwner{ for(uint256 i; i<whiteList_.length; i++){ delete whiteList[whiteList_[i]]; } } /* */ function setBaseURI(string calldata baseURI) external onlyOwner { baseTokenURI = baseURI; } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"},{"internalType":"uint256","name":"price_","type":"uint256"},{"internalType":"uint256","name":"priceIncreaseValue_","type":"uint256"},{"internalType":"uint256","name":"priceIncreaseCondition_","type":"uint256"},{"internalType":"address payable","name":"vault_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"whiteList_","type":"address[]"}],"name":"batchAddWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"whiteList_","type":"address[]"}],"name":"batchRmWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count_","type":"uint256"}],"name":"budgetPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPriceIncreaseSupply","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":"count_","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":[],"name":"priceIncreaseCondition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceIncreaseFun","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"priceIncreaseValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceIncreaseCondition_","type":"uint256"}],"name":"updatePriceIncreaseCondition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceIncreaseValue_","type":"uint256"}],"name":"updatePriceIncreaseValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"vault_","type":"address"}],"name":"updateVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620040aa380380620040aa833981810160405281019062000037919062000399565b6040518060400160405280600a81526020017f56616c69616e7444414f000000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f56616c69616e7444414f000000000000000000000000000000000000000000008152508160029080519060200190620000bb929190620002bb565b508060039080519060200190620000d4929190620002bb565b50620000e5620001e860201b60201c565b60008190555050506200010d62000101620001ed60201b60201c565b620001f560201b60201c565b84600a8190555083600b8190555082600c8190555081600d81905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200019c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001939062000448565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505062000580565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002c990620004b9565b90600052602060002090601f016020900481019282620002ed576000855562000339565b82601f106200030857805160ff191683800117855562000339565b8280016001018555821562000339579182015b82811115620003385782518255916020019190600101906200031b565b5b5090506200034891906200034c565b5090565b5b80821115620003675760008160009055506001016200034d565b5090565b6000815190506200037c816200054c565b92915050565b600081519050620003938162000566565b92915050565b600080600080600060a08688031215620003b857620003b76200051e565b5b6000620003c88882890162000382565b9550506020620003db8882890162000382565b9450506040620003ee8882890162000382565b9350506060620004018882890162000382565b925050608062000414888289016200036b565b9150509295509295909350565b6000620004306001836200046a565b91506200043d8262000523565b602082019050919050565b60006020820190508181036000830152620004638162000421565b9050919050565b600082825260208201905092915050565b600062000488826200048f565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006002820490506001821680620004d257607f821691505b60208210811415620004e957620004e8620004ef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f4100000000000000000000000000000000000000000000000000000000000000600082015250565b62000557816200047b565b81146200056357600080fd5b50565b6200057181620004af565b81146200057d57600080fd5b50565b613b1a80620005906000396000f3fe60806040526004361061022f5760003560e01c806385b7a4631161012e578063c87b56dd116100ab578063e985e9c51161006f578063e985e9c514610861578063eba35dc31461089e578063f103b433146108c9578063f2fde38b146108f2578063fbfa77cf1461091b5761022f565b8063c87b56dd1461077e578063c97310c0146107bb578063cd059237146107e4578063d5abeb011461080d578063e7563f3f146108385761022f565b8063a035b1fe116100f2578063a035b1fe146106a8578063a0712d68146106d3578063a22cb465146106ef578063b88d4fde14610718578063c23dc68f146107415761022f565b806385b7a463146105af5780638d6cc56d146105ec5780638da5cb5b1461061557806395d89b411461064057806399a2557a1461066b5761022f565b8063372c12b1116101bc5780635bbb2177116101805780635bbb2177146104a45780636352211e146104e157806370a082311461051e578063715018a61461055b5780638462151c146105725761022f565b8063372c12b1146103d357806341be14371461041057806342842e0e1461043b57806354e47b981461046457806355f804b31461047b5761022f565b8063081812fc11610203578063081812fc146102f0578063095ea7b31461032d57806318160ddd1461035657806323b872dd14610381578063300c1ad5146103aa5761022f565b80625642161461023457806301ffc9a71461025d578063023e22111461029a57806306fdde03146102c5575b600080fd5b34801561024057600080fd5b5061025b60048036038101906102569190612ea8565b610946565b005b34801561026957600080fd5b50610284600480360381019061027f9190612e01565b610960565b6040516102919190613351565b60405180910390f35b3480156102a657600080fd5b506102af6109f2565b6040516102bc9190613469565b60405180910390f35b3480156102d157600080fd5b506102da6109f8565b6040516102e7919061336c565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612ea8565b610a8a565b604051610324919061328b565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190612cd4565b610b09565b005b34801561036257600080fd5b5061036b610c4d565b6040516103789190613469565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190612bbe565b610c64565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190612d67565b610f89565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190612b24565b61102d565b6040516104079190613351565b60405180910390f35b34801561041c57600080fd5b5061042561104d565b6040516104329190613469565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190612bbe565b611053565b005b34801561047057600080fd5b50610479611073565b005b34801561048757600080fd5b506104a2600480360381019061049d9190612e5b565b6110da565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190612db4565b6110f8565b6040516104d8919061330d565b60405180910390f35b3480156104ed57600080fd5b5061050860048036038101906105039190612ea8565b6111bb565b604051610515919061328b565b60405180910390f35b34801561052a57600080fd5b5061054560048036038101906105409190612b24565b6111cd565b6040516105529190613469565b60405180910390f35b34801561056757600080fd5b50610570611286565b005b34801561057e57600080fd5b5061059960048036038101906105949190612b24565b61129a565b6040516105a6919061332f565b60405180910390f35b3480156105bb57600080fd5b506105d660048036038101906105d19190612ea8565b6113e4565b6040516105e39190613469565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190612ea8565b61144e565b005b34801561062157600080fd5b5061062a611460565b604051610637919061328b565b60405180910390f35b34801561064c57600080fd5b5061065561148a565b604051610662919061336c565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d9190612d14565b61151c565b60405161069f919061332f565b60405180910390f35b3480156106b457600080fd5b506106bd611730565b6040516106ca9190613469565b60405180910390f35b6106ed60048036038101906106e89190612ea8565b611736565b005b3480156106fb57600080fd5b5061071660048036038101906107119190612c94565b611900565b005b34801561072457600080fd5b5061073f600480360381019061073a9190612c11565b611a78565b005b34801561074d57600080fd5b5061076860048036038101906107639190612ea8565b611aeb565b604051610775919061344e565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190612ea8565b611b55565b6040516107b2919061336c565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd9190612ea8565b611bf4565b005b3480156107f057600080fd5b5061080b60048036038101906108069190612d67565b611c06565b005b34801561081957600080fd5b50610822611cb3565b60405161082f9190613469565b60405180910390f35b34801561084457600080fd5b5061085f600480360381019061085a9190612b51565b611cb9565b005b34801561086d57600080fd5b5061088860048036038101906108839190612b7e565b611d75565b6040516108959190613351565b60405180910390f35b3480156108aa57600080fd5b506108b3611e09565b6040516108c09190613469565b60405180910390f35b3480156108d557600080fd5b506108f060048036038101906108eb9190612ea8565b611e0f565b005b3480156108fe57600080fd5b5061091960048036038101906109149190612b24565b611e6b565b005b34801561092757600080fd5b50610930611eef565b60405161093d91906132a6565b60405180910390f35b61094e611f15565b80600d8190555061095d611073565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109bb57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109eb5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600c5481565b606060028054610a079061378f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a339061378f565b8015610a805780601f10610a5557610100808354040283529160200191610a80565b820191906000526020600020905b815481529060010190602001808311610a6357829003601f168201915b5050505050905090565b6000610a9582611f93565b610acb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b14826111bb565b90508073ffffffffffffffffffffffffffffffffffffffff16610b35611ff2565b73ffffffffffffffffffffffffffffffffffffffff1614610b9857610b6181610b5c611ff2565b611d75565b610b97576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c57611ffa565b6001546000540303905090565b6000610c6f82611fff565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cd6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ce2846120cd565b91509150610cf88187610cf3611ff2565b6120f4565b610d4457610d0d86610d08611ff2565b611d75565b610d43576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610dab576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db88686866001612138565b8015610dc357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e9185610e6d88888761213e565b7c020000000000000000000000000000000000000000000000000000000017612166565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f19576000600185019050600060046000838152602001908152602001600020541415610f17576000548114610f16578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f818686866001612191565b505050505050565b610f91611f15565b60005b8282905081101561102857600f6000848484818110610fb657610fb56138c8565b5b9050602002016020810190610fcb9190612b24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690558080611020906137f2565b915050610f94565b505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600e5481565b61106e83838360405180602001604052806000815250611a78565b505050565b6000600d54600e54611083610c4d565b61108d9190613670565b61109791906135e5565b905060008111156110d75780600c546110b09190613616565b600b60008282546110c1919061358f565b925050819055506110d0610c4d565b600e819055505b50565b6110e2611f15565b8181600991906110f3929190612842565b505050565b6060600083839050905060008167ffffffffffffffff81111561111e5761111d6138f7565b5b60405190808252806020026020018201604052801561115757816020015b6111446128c8565b81526020019060019003908161113c5790505b50905060005b8281146111af5761118686868381811061117a576111796138c8565b5b90506020020135611aeb565b828281518110611199576111986138c8565b5b602002602001018190525080600101905061115d565b50809250505092915050565b60006111c682611fff565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611235576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61128e611f15565b6112986000612197565b565b606060008060006112aa856111cd565b905060008167ffffffffffffffff8111156112c8576112c76138f7565b5b6040519080825280602002602001820160405280156112f65781602001602082028036833780820191505090505b5090506113016128c8565b600061130b611ffa565b90505b8386146113d65761131e8161225d565b915081604001511561132f576113cb565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461136f57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156113ca57808387806001019850815181106113bd576113bc6138c8565b5b6020026020010181815250505b5b80600101905061130e565b508195505050505050919050565b600080600d54600e54846113f6610c4d565b611400919061358f565b61140a9190613670565b61141491906135e5565b9050600081111561144257600b5481600c546114309190613616565b61143a919061358f565b915050611449565b600b549150505b919050565b611456611f15565b80600b8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546114999061378f565b80601f01602080910402602001604051908101604052809291908181526020018280546114c59061378f565b80156115125780601f106114e757610100808354040283529160200191611512565b820191906000526020600020905b8154815290600101906020018083116114f557829003601f168201915b5050505050905090565b6060818310611557576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611562612288565b905061156c611ffa565b85101561157e5761157b611ffa565b94505b8084111561158a578093505b6000611595876111cd565b9050848610156115b85760008686039050818110156115b2578091505b506115bd565b600090505b60008167ffffffffffffffff8111156115d9576115d86138f7565b5b6040519080825280602002602001820160405280156116075781602001602082028036833780820191505090505b509050600082141561161f5780945050505050611729565b600061162a88611aeb565b90506000816040015161163f57816000015190505b60008990505b8881141580156116555750848714155b1561171b576116638161225d565b925082604001511561167457611710565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146116b457826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561170f5780848880600101995081518110611702576117016138c8565b5b6020026020010181815250505b5b806001019050611645565b508583528296505050505050505b9392505050565b600b5481565b60008111611779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611770906133ee565b60405180910390fd5b600a5481611785610c4d565b61178f919061358f565b11156117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c79061342e565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661187257600b548161182f9190613616565b341015611871576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611868906133ae565b60405180910390fd5b5b61187c3382612291565b600047905060008111156118f457601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156118f2573d6000803e3d6000fd5b505b506118fd611073565b50565b611908611ff2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561196d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061197a611ff2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a27611ff2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a6c9190613351565b60405180910390a35050565b611a83848484610c64565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611ae557611aae848484846122af565b611ae4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611af36128c8565b611afb6128c8565b611b03611ffa565b831080611b175750611b13612288565b8310155b15611b255780915050611b50565b611b2e8361225d565b9050806040015115611b435780915050611b50565b611b4c8361240f565b9150505b919050565b6060611b6082611f93565b611b96576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ba061242f565b9050600081511415611bc15760405180602001604052806000815250611bec565b80611bcb846124c1565b604051602001611bdc929190613267565b6040516020818303038152906040525b915050919050565b611bfc611f15565b80600c8190555050565b611c0e611f15565b60005b82829050811015611cae576001600f6000858585818110611c3557611c346138c8565b5b9050602002016020810190611c4a9190612b24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611ca6906137f2565b915050611c11565b505050565b600a5481565b611cc1611f15565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d289061338e565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d5481565b611e17611f15565b611e1f610c4d565b811015611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e589061338e565b60405180910390fd5b80600a8190555050565b611e73611f15565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda906133ce565b60405180910390fd5b611eec81612197565b50565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f1d612511565b73ffffffffffffffffffffffffffffffffffffffff16611f3b611460565b73ffffffffffffffffffffffffffffffffffffffff1614611f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f889061340e565b60405180910390fd5b565b600081611f9e611ffa565b11158015611fad575060005482105b8015611feb575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000808290508061200e611ffa565b11612096576000548110156120955760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612093575b600081141561208957600460008360019003935083815260200190815260200160002054905061205e565b80925050506120c8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612155868684612519565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122656128c8565b6122816004600084815260200190815260200160002054612522565b9050919050565b60008054905090565b6122ab8282604051806020016040528060008152506125d8565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122d5611ff2565b8786866040518563ffffffff1660e01b81526004016122f794939291906132c1565b602060405180830381600087803b15801561231157600080fd5b505af192505050801561234257506040513d601f19601f8201168201806040525081019061233f9190612e2e565b60015b6123bc573d8060008114612372576040519150601f19603f3d011682016040523d82523d6000602084013e612377565b606091505b506000815114156123b4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6124176128c8565b61242861242383611fff565b612522565b9050919050565b60606009805461243e9061378f565b80601f016020809104026020016040519081016040528092919081815260200182805461246a9061378f565b80156124b75780601f1061248c576101008083540402835291602001916124b7565b820191906000526020600020905b81548152906001019060200180831161249a57829003601f168201915b5050505050905090565b606060806040510190508060405280825b6001156124fd57600183039250600a81066030018353600a81049050806124f8576124fd565b6124d2565b508181036020830392508083525050919050565b600033905090565b60009392505050565b61252a6128c8565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6125e28383612675565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461267057600080549050600083820390505b61262260008683806001019450866122af565b612658576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061260f57816000541461266d57600080fd5b50505b505050565b60008054905060008214156126b6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126c36000848385612138565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061273a8361272b600086600061213e565b61273485612832565b17612166565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146127db57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506127a0565b506000821415612817576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061282d6000848385612191565b505050565b60006001821460e11b9050919050565b82805461284e9061378f565b90600052602060002090601f01602090048101928261287057600085556128b7565b82601f1061288957803560ff19168380011785556128b7565b828001600101855582156128b7579182015b828111156128b657823582559160200191906001019061289b565b5b5090506128c49190612917565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612930576000816000905550600101612918565b5090565b6000612947612942846134a9565b613484565b90508281526020810184848401111561296357612962613935565b5b61296e84828561374d565b509392505050565b60008135905061298581613a71565b92915050565b60008135905061299a81613a88565b92915050565b60008083601f8401126129b6576129b561392b565b5b8235905067ffffffffffffffff8111156129d3576129d2613926565b5b6020830191508360208202830111156129ef576129ee613930565b5b9250929050565b60008083601f840112612a0c57612a0b61392b565b5b8235905067ffffffffffffffff811115612a2957612a28613926565b5b602083019150836020820283011115612a4557612a44613930565b5b9250929050565b600081359050612a5b81613a9f565b92915050565b600081359050612a7081613ab6565b92915050565b600081519050612a8581613ab6565b92915050565b600082601f830112612aa057612a9f61392b565b5b8135612ab0848260208601612934565b91505092915050565b60008083601f840112612acf57612ace61392b565b5b8235905067ffffffffffffffff811115612aec57612aeb613926565b5b602083019150836001820283011115612b0857612b07613930565b5b9250929050565b600081359050612b1e81613acd565b92915050565b600060208284031215612b3a57612b3961393f565b5b6000612b4884828501612976565b91505092915050565b600060208284031215612b6757612b6661393f565b5b6000612b758482850161298b565b91505092915050565b60008060408385031215612b9557612b9461393f565b5b6000612ba385828601612976565b9250506020612bb485828601612976565b9150509250929050565b600080600060608486031215612bd757612bd661393f565b5b6000612be586828701612976565b9350506020612bf686828701612976565b9250506040612c0786828701612b0f565b9150509250925092565b60008060008060808587031215612c2b57612c2a61393f565b5b6000612c3987828801612976565b9450506020612c4a87828801612976565b9350506040612c5b87828801612b0f565b925050606085013567ffffffffffffffff811115612c7c57612c7b61393a565b5b612c8887828801612a8b565b91505092959194509250565b60008060408385031215612cab57612caa61393f565b5b6000612cb985828601612976565b9250506020612cca85828601612a4c565b9150509250929050565b60008060408385031215612ceb57612cea61393f565b5b6000612cf985828601612976565b9250506020612d0a85828601612b0f565b9150509250929050565b600080600060608486031215612d2d57612d2c61393f565b5b6000612d3b86828701612976565b9350506020612d4c86828701612b0f565b9250506040612d5d86828701612b0f565b9150509250925092565b60008060208385031215612d7e57612d7d61393f565b5b600083013567ffffffffffffffff811115612d9c57612d9b61393a565b5b612da8858286016129a0565b92509250509250929050565b60008060208385031215612dcb57612dca61393f565b5b600083013567ffffffffffffffff811115612de957612de861393a565b5b612df5858286016129f6565b92509250509250929050565b600060208284031215612e1757612e1661393f565b5b6000612e2584828501612a61565b91505092915050565b600060208284031215612e4457612e4361393f565b5b6000612e5284828501612a76565b91505092915050565b60008060208385031215612e7257612e7161393f565b5b600083013567ffffffffffffffff811115612e9057612e8f61393a565b5b612e9c85828601612ab9565b92509250509250929050565b600060208284031215612ebe57612ebd61393f565b5b6000612ecc84828501612b0f565b91505092915050565b6000612ee18383613181565b60808301905092915050565b6000612ef9838361323a565b60208301905092915050565b612f0e816136b6565b82525050565b612f1d816136a4565b82525050565b612f2c816136a4565b82525050565b6000612f3d826134fa565b612f478185613540565b9350612f52836134da565b8060005b83811015612f83578151612f6a8882612ed5565b9750612f7583613526565b925050600181019050612f56565b5085935050505092915050565b6000612f9b82613505565b612fa58185613551565b9350612fb0836134ea565b8060005b83811015612fe1578151612fc88882612eed565b9750612fd383613533565b925050600181019050612fb4565b5085935050505092915050565b612ff7816136c8565b82525050565b613006816136c8565b82525050565b600061301782613510565b6130218185613562565b935061303181856020860161375c565b61303a81613944565b840191505092915050565b60006130508261351b565b61305a8185613573565b935061306a81856020860161375c565b61307381613944565b840191505092915050565b60006130898261351b565b6130938185613584565b93506130a381856020860161375c565b80840191505092915050565b60006130bc600183613573565b91506130c782613955565b602082019050919050565b60006130df601b83613573565b91506130ea8261397e565b602082019050919050565b6000613102602683613573565b915061310d826139a7565b604082019050919050565b6000613125601383613573565b9150613130826139f6565b602082019050919050565b6000613148602083613573565b915061315382613a1f565b602082019050919050565b600061316b600983613573565b915061317682613a48565b602082019050919050565b6080820160008201516131976000850182612f14565b5060208201516131aa6020850182613258565b5060408201516131bd6040850182612fee565b5060608201516131d0606085018261322b565b50505050565b6080820160008201516131ec6000850182612f14565b5060208201516131ff6020850182613258565b5060408201516132126040850182612fee565b506060820151613225606085018261322b565b50505050565b61323481613720565b82525050565b6132438161372f565b82525050565b6132528161372f565b82525050565b61326181613739565b82525050565b6000613273828561307e565b915061327f828461307e565b91508190509392505050565b60006020820190506132a06000830184612f23565b92915050565b60006020820190506132bb6000830184612f05565b92915050565b60006080820190506132d66000830187612f23565b6132e36020830186612f23565b6132f06040830185613249565b8181036060830152613302818461300c565b905095945050505050565b600060208201905081810360008301526133278184612f32565b905092915050565b600060208201905081810360008301526133498184612f90565b905092915050565b60006020820190506133666000830184612ffd565b92915050565b600060208201905081810360008301526133868184613045565b905092915050565b600060208201905081810360008301526133a7816130af565b9050919050565b600060208201905081810360008301526133c7816130d2565b9050919050565b600060208201905081810360008301526133e7816130f5565b9050919050565b6000602082019050818103600083015261340781613118565b9050919050565b600060208201905081810360008301526134278161313b565b9050919050565b600060208201905081810360008301526134478161315e565b9050919050565b600060808201905061346360008301846131d6565b92915050565b600060208201905061347e6000830184613249565b92915050565b600061348e61349f565b905061349a82826137c1565b919050565b6000604051905090565b600067ffffffffffffffff8211156134c4576134c36138f7565b5b6134cd82613944565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061359a8261372f565b91506135a58361372f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135da576135d961383b565b5b828201905092915050565b60006135f08261372f565b91506135fb8361372f565b92508261360b5761360a61386a565b5b828204905092915050565b60006136218261372f565b915061362c8361372f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136655761366461383b565b5b828202905092915050565b600061367b8261372f565b91506136868361372f565b9250828210156136995761369861383b565b5b828203905092915050565b60006136af82613700565b9050919050565b60006136c182613700565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561377a57808201518184015260208101905061375f565b83811115613789576000848401525b50505050565b600060028204905060018216806137a757607f821691505b602082108114156137bb576137ba613899565b5b50919050565b6137ca82613944565b810181811067ffffffffffffffff821117156137e9576137e86138f7565b5b80604052505050565b60006137fd8261372f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138305761382f61383b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4100000000000000000000000000000000000000000000000000000000000000600082015250565b7f53656e64206120656e6f75676820616d6f756e74206f66206574680000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e7420746f206d696e74206973203000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b613a7a816136a4565b8114613a8557600080fd5b50565b613a91816136b6565b8114613a9c57600080fd5b50565b613aa8816136c8565b8114613ab357600080fd5b50565b613abf816136d4565b8114613aca57600080fd5b50565b613ad68161372f565b8114613ae157600080fd5b5056fea26469706673582212200ad0b0a93c4c1e5e3025f9158f724577e986c66e8407dbad2f3438f31cf0eb4d64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000420b92ef216646b7509caa8440991fedaa78bddd
Deployed Bytecode
0x60806040526004361061022f5760003560e01c806385b7a4631161012e578063c87b56dd116100ab578063e985e9c51161006f578063e985e9c514610861578063eba35dc31461089e578063f103b433146108c9578063f2fde38b146108f2578063fbfa77cf1461091b5761022f565b8063c87b56dd1461077e578063c97310c0146107bb578063cd059237146107e4578063d5abeb011461080d578063e7563f3f146108385761022f565b8063a035b1fe116100f2578063a035b1fe146106a8578063a0712d68146106d3578063a22cb465146106ef578063b88d4fde14610718578063c23dc68f146107415761022f565b806385b7a463146105af5780638d6cc56d146105ec5780638da5cb5b1461061557806395d89b411461064057806399a2557a1461066b5761022f565b8063372c12b1116101bc5780635bbb2177116101805780635bbb2177146104a45780636352211e146104e157806370a082311461051e578063715018a61461055b5780638462151c146105725761022f565b8063372c12b1146103d357806341be14371461041057806342842e0e1461043b57806354e47b981461046457806355f804b31461047b5761022f565b8063081812fc11610203578063081812fc146102f0578063095ea7b31461032d57806318160ddd1461035657806323b872dd14610381578063300c1ad5146103aa5761022f565b80625642161461023457806301ffc9a71461025d578063023e22111461029a57806306fdde03146102c5575b600080fd5b34801561024057600080fd5b5061025b60048036038101906102569190612ea8565b610946565b005b34801561026957600080fd5b50610284600480360381019061027f9190612e01565b610960565b6040516102919190613351565b60405180910390f35b3480156102a657600080fd5b506102af6109f2565b6040516102bc9190613469565b60405180910390f35b3480156102d157600080fd5b506102da6109f8565b6040516102e7919061336c565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612ea8565b610a8a565b604051610324919061328b565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190612cd4565b610b09565b005b34801561036257600080fd5b5061036b610c4d565b6040516103789190613469565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190612bbe565b610c64565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190612d67565b610f89565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190612b24565b61102d565b6040516104079190613351565b60405180910390f35b34801561041c57600080fd5b5061042561104d565b6040516104329190613469565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190612bbe565b611053565b005b34801561047057600080fd5b50610479611073565b005b34801561048757600080fd5b506104a2600480360381019061049d9190612e5b565b6110da565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190612db4565b6110f8565b6040516104d8919061330d565b60405180910390f35b3480156104ed57600080fd5b5061050860048036038101906105039190612ea8565b6111bb565b604051610515919061328b565b60405180910390f35b34801561052a57600080fd5b5061054560048036038101906105409190612b24565b6111cd565b6040516105529190613469565b60405180910390f35b34801561056757600080fd5b50610570611286565b005b34801561057e57600080fd5b5061059960048036038101906105949190612b24565b61129a565b6040516105a6919061332f565b60405180910390f35b3480156105bb57600080fd5b506105d660048036038101906105d19190612ea8565b6113e4565b6040516105e39190613469565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190612ea8565b61144e565b005b34801561062157600080fd5b5061062a611460565b604051610637919061328b565b60405180910390f35b34801561064c57600080fd5b5061065561148a565b604051610662919061336c565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d9190612d14565b61151c565b60405161069f919061332f565b60405180910390f35b3480156106b457600080fd5b506106bd611730565b6040516106ca9190613469565b60405180910390f35b6106ed60048036038101906106e89190612ea8565b611736565b005b3480156106fb57600080fd5b5061071660048036038101906107119190612c94565b611900565b005b34801561072457600080fd5b5061073f600480360381019061073a9190612c11565b611a78565b005b34801561074d57600080fd5b5061076860048036038101906107639190612ea8565b611aeb565b604051610775919061344e565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190612ea8565b611b55565b6040516107b2919061336c565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd9190612ea8565b611bf4565b005b3480156107f057600080fd5b5061080b60048036038101906108069190612d67565b611c06565b005b34801561081957600080fd5b50610822611cb3565b60405161082f9190613469565b60405180910390f35b34801561084457600080fd5b5061085f600480360381019061085a9190612b51565b611cb9565b005b34801561086d57600080fd5b5061088860048036038101906108839190612b7e565b611d75565b6040516108959190613351565b60405180910390f35b3480156108aa57600080fd5b506108b3611e09565b6040516108c09190613469565b60405180910390f35b3480156108d557600080fd5b506108f060048036038101906108eb9190612ea8565b611e0f565b005b3480156108fe57600080fd5b5061091960048036038101906109149190612b24565b611e6b565b005b34801561092757600080fd5b50610930611eef565b60405161093d91906132a6565b60405180910390f35b61094e611f15565b80600d8190555061095d611073565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109bb57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109eb5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600c5481565b606060028054610a079061378f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a339061378f565b8015610a805780601f10610a5557610100808354040283529160200191610a80565b820191906000526020600020905b815481529060010190602001808311610a6357829003601f168201915b5050505050905090565b6000610a9582611f93565b610acb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b14826111bb565b90508073ffffffffffffffffffffffffffffffffffffffff16610b35611ff2565b73ffffffffffffffffffffffffffffffffffffffff1614610b9857610b6181610b5c611ff2565b611d75565b610b97576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c57611ffa565b6001546000540303905090565b6000610c6f82611fff565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cd6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ce2846120cd565b91509150610cf88187610cf3611ff2565b6120f4565b610d4457610d0d86610d08611ff2565b611d75565b610d43576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610dab576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db88686866001612138565b8015610dc357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e9185610e6d88888761213e565b7c020000000000000000000000000000000000000000000000000000000017612166565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f19576000600185019050600060046000838152602001908152602001600020541415610f17576000548114610f16578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f818686866001612191565b505050505050565b610f91611f15565b60005b8282905081101561102857600f6000848484818110610fb657610fb56138c8565b5b9050602002016020810190610fcb9190612b24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690558080611020906137f2565b915050610f94565b505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600e5481565b61106e83838360405180602001604052806000815250611a78565b505050565b6000600d54600e54611083610c4d565b61108d9190613670565b61109791906135e5565b905060008111156110d75780600c546110b09190613616565b600b60008282546110c1919061358f565b925050819055506110d0610c4d565b600e819055505b50565b6110e2611f15565b8181600991906110f3929190612842565b505050565b6060600083839050905060008167ffffffffffffffff81111561111e5761111d6138f7565b5b60405190808252806020026020018201604052801561115757816020015b6111446128c8565b81526020019060019003908161113c5790505b50905060005b8281146111af5761118686868381811061117a576111796138c8565b5b90506020020135611aeb565b828281518110611199576111986138c8565b5b602002602001018190525080600101905061115d565b50809250505092915050565b60006111c682611fff565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611235576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61128e611f15565b6112986000612197565b565b606060008060006112aa856111cd565b905060008167ffffffffffffffff8111156112c8576112c76138f7565b5b6040519080825280602002602001820160405280156112f65781602001602082028036833780820191505090505b5090506113016128c8565b600061130b611ffa565b90505b8386146113d65761131e8161225d565b915081604001511561132f576113cb565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461136f57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156113ca57808387806001019850815181106113bd576113bc6138c8565b5b6020026020010181815250505b5b80600101905061130e565b508195505050505050919050565b600080600d54600e54846113f6610c4d565b611400919061358f565b61140a9190613670565b61141491906135e5565b9050600081111561144257600b5481600c546114309190613616565b61143a919061358f565b915050611449565b600b549150505b919050565b611456611f15565b80600b8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546114999061378f565b80601f01602080910402602001604051908101604052809291908181526020018280546114c59061378f565b80156115125780601f106114e757610100808354040283529160200191611512565b820191906000526020600020905b8154815290600101906020018083116114f557829003601f168201915b5050505050905090565b6060818310611557576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611562612288565b905061156c611ffa565b85101561157e5761157b611ffa565b94505b8084111561158a578093505b6000611595876111cd565b9050848610156115b85760008686039050818110156115b2578091505b506115bd565b600090505b60008167ffffffffffffffff8111156115d9576115d86138f7565b5b6040519080825280602002602001820160405280156116075781602001602082028036833780820191505090505b509050600082141561161f5780945050505050611729565b600061162a88611aeb565b90506000816040015161163f57816000015190505b60008990505b8881141580156116555750848714155b1561171b576116638161225d565b925082604001511561167457611710565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146116b457826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561170f5780848880600101995081518110611702576117016138c8565b5b6020026020010181815250505b5b806001019050611645565b508583528296505050505050505b9392505050565b600b5481565b60008111611779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611770906133ee565b60405180910390fd5b600a5481611785610c4d565b61178f919061358f565b11156117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c79061342e565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661187257600b548161182f9190613616565b341015611871576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611868906133ae565b60405180910390fd5b5b61187c3382612291565b600047905060008111156118f457601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156118f2573d6000803e3d6000fd5b505b506118fd611073565b50565b611908611ff2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561196d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061197a611ff2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a27611ff2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a6c9190613351565b60405180910390a35050565b611a83848484610c64565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611ae557611aae848484846122af565b611ae4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611af36128c8565b611afb6128c8565b611b03611ffa565b831080611b175750611b13612288565b8310155b15611b255780915050611b50565b611b2e8361225d565b9050806040015115611b435780915050611b50565b611b4c8361240f565b9150505b919050565b6060611b6082611f93565b611b96576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ba061242f565b9050600081511415611bc15760405180602001604052806000815250611bec565b80611bcb846124c1565b604051602001611bdc929190613267565b6040516020818303038152906040525b915050919050565b611bfc611f15565b80600c8190555050565b611c0e611f15565b60005b82829050811015611cae576001600f6000858585818110611c3557611c346138c8565b5b9050602002016020810190611c4a9190612b24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611ca6906137f2565b915050611c11565b505050565b600a5481565b611cc1611f15565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d289061338e565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d5481565b611e17611f15565b611e1f610c4d565b811015611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e589061338e565b60405180910390fd5b80600a8190555050565b611e73611f15565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda906133ce565b60405180910390fd5b611eec81612197565b50565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f1d612511565b73ffffffffffffffffffffffffffffffffffffffff16611f3b611460565b73ffffffffffffffffffffffffffffffffffffffff1614611f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f889061340e565b60405180910390fd5b565b600081611f9e611ffa565b11158015611fad575060005482105b8015611feb575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000808290508061200e611ffa565b11612096576000548110156120955760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612093575b600081141561208957600460008360019003935083815260200190815260200160002054905061205e565b80925050506120c8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612155868684612519565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122656128c8565b6122816004600084815260200190815260200160002054612522565b9050919050565b60008054905090565b6122ab8282604051806020016040528060008152506125d8565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122d5611ff2565b8786866040518563ffffffff1660e01b81526004016122f794939291906132c1565b602060405180830381600087803b15801561231157600080fd5b505af192505050801561234257506040513d601f19601f8201168201806040525081019061233f9190612e2e565b60015b6123bc573d8060008114612372576040519150601f19603f3d011682016040523d82523d6000602084013e612377565b606091505b506000815114156123b4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6124176128c8565b61242861242383611fff565b612522565b9050919050565b60606009805461243e9061378f565b80601f016020809104026020016040519081016040528092919081815260200182805461246a9061378f565b80156124b75780601f1061248c576101008083540402835291602001916124b7565b820191906000526020600020905b81548152906001019060200180831161249a57829003601f168201915b5050505050905090565b606060806040510190508060405280825b6001156124fd57600183039250600a81066030018353600a81049050806124f8576124fd565b6124d2565b508181036020830392508083525050919050565b600033905090565b60009392505050565b61252a6128c8565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6125e28383612675565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461267057600080549050600083820390505b61262260008683806001019450866122af565b612658576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061260f57816000541461266d57600080fd5b50505b505050565b60008054905060008214156126b6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126c36000848385612138565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061273a8361272b600086600061213e565b61273485612832565b17612166565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146127db57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506127a0565b506000821415612817576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061282d6000848385612191565b505050565b60006001821460e11b9050919050565b82805461284e9061378f565b90600052602060002090601f01602090048101928261287057600085556128b7565b82601f1061288957803560ff19168380011785556128b7565b828001600101855582156128b7579182015b828111156128b657823582559160200191906001019061289b565b5b5090506128c49190612917565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612930576000816000905550600101612918565b5090565b6000612947612942846134a9565b613484565b90508281526020810184848401111561296357612962613935565b5b61296e84828561374d565b509392505050565b60008135905061298581613a71565b92915050565b60008135905061299a81613a88565b92915050565b60008083601f8401126129b6576129b561392b565b5b8235905067ffffffffffffffff8111156129d3576129d2613926565b5b6020830191508360208202830111156129ef576129ee613930565b5b9250929050565b60008083601f840112612a0c57612a0b61392b565b5b8235905067ffffffffffffffff811115612a2957612a28613926565b5b602083019150836020820283011115612a4557612a44613930565b5b9250929050565b600081359050612a5b81613a9f565b92915050565b600081359050612a7081613ab6565b92915050565b600081519050612a8581613ab6565b92915050565b600082601f830112612aa057612a9f61392b565b5b8135612ab0848260208601612934565b91505092915050565b60008083601f840112612acf57612ace61392b565b5b8235905067ffffffffffffffff811115612aec57612aeb613926565b5b602083019150836001820283011115612b0857612b07613930565b5b9250929050565b600081359050612b1e81613acd565b92915050565b600060208284031215612b3a57612b3961393f565b5b6000612b4884828501612976565b91505092915050565b600060208284031215612b6757612b6661393f565b5b6000612b758482850161298b565b91505092915050565b60008060408385031215612b9557612b9461393f565b5b6000612ba385828601612976565b9250506020612bb485828601612976565b9150509250929050565b600080600060608486031215612bd757612bd661393f565b5b6000612be586828701612976565b9350506020612bf686828701612976565b9250506040612c0786828701612b0f565b9150509250925092565b60008060008060808587031215612c2b57612c2a61393f565b5b6000612c3987828801612976565b9450506020612c4a87828801612976565b9350506040612c5b87828801612b0f565b925050606085013567ffffffffffffffff811115612c7c57612c7b61393a565b5b612c8887828801612a8b565b91505092959194509250565b60008060408385031215612cab57612caa61393f565b5b6000612cb985828601612976565b9250506020612cca85828601612a4c565b9150509250929050565b60008060408385031215612ceb57612cea61393f565b5b6000612cf985828601612976565b9250506020612d0a85828601612b0f565b9150509250929050565b600080600060608486031215612d2d57612d2c61393f565b5b6000612d3b86828701612976565b9350506020612d4c86828701612b0f565b9250506040612d5d86828701612b0f565b9150509250925092565b60008060208385031215612d7e57612d7d61393f565b5b600083013567ffffffffffffffff811115612d9c57612d9b61393a565b5b612da8858286016129a0565b92509250509250929050565b60008060208385031215612dcb57612dca61393f565b5b600083013567ffffffffffffffff811115612de957612de861393a565b5b612df5858286016129f6565b92509250509250929050565b600060208284031215612e1757612e1661393f565b5b6000612e2584828501612a61565b91505092915050565b600060208284031215612e4457612e4361393f565b5b6000612e5284828501612a76565b91505092915050565b60008060208385031215612e7257612e7161393f565b5b600083013567ffffffffffffffff811115612e9057612e8f61393a565b5b612e9c85828601612ab9565b92509250509250929050565b600060208284031215612ebe57612ebd61393f565b5b6000612ecc84828501612b0f565b91505092915050565b6000612ee18383613181565b60808301905092915050565b6000612ef9838361323a565b60208301905092915050565b612f0e816136b6565b82525050565b612f1d816136a4565b82525050565b612f2c816136a4565b82525050565b6000612f3d826134fa565b612f478185613540565b9350612f52836134da565b8060005b83811015612f83578151612f6a8882612ed5565b9750612f7583613526565b925050600181019050612f56565b5085935050505092915050565b6000612f9b82613505565b612fa58185613551565b9350612fb0836134ea565b8060005b83811015612fe1578151612fc88882612eed565b9750612fd383613533565b925050600181019050612fb4565b5085935050505092915050565b612ff7816136c8565b82525050565b613006816136c8565b82525050565b600061301782613510565b6130218185613562565b935061303181856020860161375c565b61303a81613944565b840191505092915050565b60006130508261351b565b61305a8185613573565b935061306a81856020860161375c565b61307381613944565b840191505092915050565b60006130898261351b565b6130938185613584565b93506130a381856020860161375c565b80840191505092915050565b60006130bc600183613573565b91506130c782613955565b602082019050919050565b60006130df601b83613573565b91506130ea8261397e565b602082019050919050565b6000613102602683613573565b915061310d826139a7565b604082019050919050565b6000613125601383613573565b9150613130826139f6565b602082019050919050565b6000613148602083613573565b915061315382613a1f565b602082019050919050565b600061316b600983613573565b915061317682613a48565b602082019050919050565b6080820160008201516131976000850182612f14565b5060208201516131aa6020850182613258565b5060408201516131bd6040850182612fee565b5060608201516131d0606085018261322b565b50505050565b6080820160008201516131ec6000850182612f14565b5060208201516131ff6020850182613258565b5060408201516132126040850182612fee565b506060820151613225606085018261322b565b50505050565b61323481613720565b82525050565b6132438161372f565b82525050565b6132528161372f565b82525050565b61326181613739565b82525050565b6000613273828561307e565b915061327f828461307e565b91508190509392505050565b60006020820190506132a06000830184612f23565b92915050565b60006020820190506132bb6000830184612f05565b92915050565b60006080820190506132d66000830187612f23565b6132e36020830186612f23565b6132f06040830185613249565b8181036060830152613302818461300c565b905095945050505050565b600060208201905081810360008301526133278184612f32565b905092915050565b600060208201905081810360008301526133498184612f90565b905092915050565b60006020820190506133666000830184612ffd565b92915050565b600060208201905081810360008301526133868184613045565b905092915050565b600060208201905081810360008301526133a7816130af565b9050919050565b600060208201905081810360008301526133c7816130d2565b9050919050565b600060208201905081810360008301526133e7816130f5565b9050919050565b6000602082019050818103600083015261340781613118565b9050919050565b600060208201905081810360008301526134278161313b565b9050919050565b600060208201905081810360008301526134478161315e565b9050919050565b600060808201905061346360008301846131d6565b92915050565b600060208201905061347e6000830184613249565b92915050565b600061348e61349f565b905061349a82826137c1565b919050565b6000604051905090565b600067ffffffffffffffff8211156134c4576134c36138f7565b5b6134cd82613944565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061359a8261372f565b91506135a58361372f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135da576135d961383b565b5b828201905092915050565b60006135f08261372f565b91506135fb8361372f565b92508261360b5761360a61386a565b5b828204905092915050565b60006136218261372f565b915061362c8361372f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136655761366461383b565b5b828202905092915050565b600061367b8261372f565b91506136868361372f565b9250828210156136995761369861383b565b5b828203905092915050565b60006136af82613700565b9050919050565b60006136c182613700565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561377a57808201518184015260208101905061375f565b83811115613789576000848401525b50505050565b600060028204905060018216806137a757607f821691505b602082108114156137bb576137ba613899565b5b50919050565b6137ca82613944565b810181811067ffffffffffffffff821117156137e9576137e86138f7565b5b80604052505050565b60006137fd8261372f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138305761382f61383b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4100000000000000000000000000000000000000000000000000000000000000600082015250565b7f53656e64206120656e6f75676820616d6f756e74206f66206574680000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e7420746f206d696e74206973203000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b613a7a816136a4565b8114613a8557600080fd5b50565b613a91816136b6565b8114613a9c57600080fd5b50565b613aa8816136c8565b8114613ab357600080fd5b50565b613abf816136d4565b8114613aca57600080fd5b50565b613ad68161372f565b8114613ae157600080fd5b5056fea26469706673582212200ad0b0a93c4c1e5e3025f9158f724577e986c66e8407dbad2f3438f31cf0eb4d64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000420b92ef216646b7509caa8440991fedaa78bddd
-----Decoded View---------------
Arg [0] : maxSupply_ (uint256): 10000
Arg [1] : price_ (uint256): 1000000000000000000
Arg [2] : priceIncreaseValue_ (uint256): 200000000000000000
Arg [3] : priceIncreaseCondition_ (uint256): 500
Arg [4] : vault_ (address): 0x420b92ef216646B7509cAa8440991feDAA78BDdD
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [1] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [2] : 00000000000000000000000000000000000000000000000002c68af0bb140000
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [4] : 000000000000000000000000420b92ef216646b7509caa8440991fedaa78bddd
Deployed Bytecode Sourcemap
63491:3594:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66054:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24587:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63650:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25489:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31972:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31413:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21240:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35679:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66636:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63779:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63734:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38592:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64923:293;;;;;;;;;;;;;:::i;:::-;;66852:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58646:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26882:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22424:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2811:103;;;;;;;;;;;;;:::i;:::-;;62522:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65241:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65776:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2163:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25665:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59562:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63623:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64394:502;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32530:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39375:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58059:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25875:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65889:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66419:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63592:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66253:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32995:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63690:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65595:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3069:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63829:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66054:174;2049:13;:11;:13::i;:::-;66197:23:::2;66172:22;:48;;;;63917:18:::1;:16;:18::i;:::-;66054:174:::0;:::o;24587:639::-;24672:4;25011:10;24996:25;;:11;:25;;;;:102;;;;25088:10;25073:25;;:11;:25;;;;24996:102;:179;;;;25165:10;25150:25;;:11;:25;;;;24996:179;24976:199;;24587:639;;;:::o;63650:33::-;;;;:::o;25489:100::-;25543:13;25576:5;25569:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25489:100;:::o;31972:218::-;32048:7;32073:16;32081:7;32073;:16::i;:::-;32068:64;;32098:34;;;;;;;;;;;;;;32068:64;32152:15;:24;32168:7;32152:24;;;;;;;;;;;:30;;;;;;;;;;;;32145:37;;31972:218;;;:::o;31413:400::-;31494:13;31510:16;31518:7;31510;:16::i;:::-;31494:32;;31566:5;31543:28;;:19;:17;:19::i;:::-;:28;;;31539:175;;31591:44;31608:5;31615:19;:17;:19::i;:::-;31591:16;:44::i;:::-;31586:128;;31663:35;;;;;;;;;;;;;;31586:128;31539:175;31759:2;31726:15;:24;31742:7;31726:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;31797:7;31793:2;31777:28;;31786:5;31777:28;;;;;;;;;;;;31483:330;31413:400;;:::o;21240:323::-;21301:7;21529:15;:13;:15::i;:::-;21514:12;;21498:13;;:28;:46;21491:53;;21240:323;:::o;35679:2817::-;35813:27;35843;35862:7;35843:18;:27::i;:::-;35813:57;;35928:4;35887:45;;35903:19;35887:45;;;35883:86;;35941:28;;;;;;;;;;;;;;35883:86;35983:27;36012:23;36039:35;36066:7;36039:26;:35::i;:::-;35982:92;;;;36174:68;36199:15;36216:4;36222:19;:17;:19::i;:::-;36174:24;:68::i;:::-;36169:180;;36262:43;36279:4;36285:19;:17;:19::i;:::-;36262:16;:43::i;:::-;36257:92;;36314:35;;;;;;;;;;;;;;36257:92;36169:180;36380:1;36366:16;;:2;:16;;;36362:52;;;36391:23;;;;;;;;;;;;;;36362:52;36427:43;36449:4;36455:2;36459:7;36468:1;36427:21;:43::i;:::-;36563:15;36560:160;;;36703:1;36682:19;36675:30;36560:160;37100:18;:24;37119:4;37100:24;;;;;;;;;;;;;;;;37098:26;;;;;;;;;;;;37169:18;:22;37188:2;37169:22;;;;;;;;;;;;;;;;37167:24;;;;;;;;;;;37491:146;37528:2;37577:45;37592:4;37598:2;37602:19;37577:14;:45::i;:::-;17639:8;37549:73;37491:18;:146::i;:::-;37462:17;:26;37480:7;37462:26;;;;;;;;;;;:175;;;;37808:1;17639:8;37757:19;:47;:52;37753:627;;;37830:19;37862:1;37852:7;:11;37830:33;;38019:1;37985:17;:30;38003:11;37985:30;;;;;;;;;;;;:35;37981:384;;;38123:13;;38108:11;:28;38104:242;;38303:19;38270:17;:30;38288:11;38270:30;;;;;;;;;;;:52;;;;38104:242;37981:384;37811:569;37753:627;38427:7;38423:2;38408:27;;38417:4;38408:27;;;;;;;;;;;;38446:42;38467:4;38473:2;38477:7;38486:1;38446:20;:42::i;:::-;35802:2694;;;35679:2817;;;:::o;66636:191::-;2049:13;:11;:13::i;:::-;66726:9:::1;66722:98;66739:10;;:17;;66737:1;:19;66722:98;;;66784:9;:24;66794:10;;66805:1;66794:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;66784:24;;;;;;;;;;;;;;;;66777:31;;;;;;;;;;;66758:3;;;;;:::i;:::-;;;;66722:98;;;;66636:191:::0;;:::o;63779:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;63734:38::-;;;;:::o;38592:185::-;38730:39;38747:4;38753:2;38757:7;38730:39;;;;;;;;;;;;:16;:39::i;:::-;38592:185;;;:::o;64923:293::-;64969:19;65035:22;;65008:23;;64992:13;:11;:13::i;:::-;:39;;;;:::i;:::-;64991:66;;;;:::i;:::-;64969:88;;65085:1;65071:11;:15;65068:141;;;65132:11;65111:18;;:32;;;;:::i;:::-;65102:5;;:41;;;;;;;:::i;:::-;;;;;;;;65184:13;:11;:13::i;:::-;65158:23;:39;;;;65068:141;64958:258;64923:293::o;66852:105::-;2049:13;:11;:13::i;:::-;66942:7:::1;;66927:12;:22;;;;;;;:::i;:::-;;66852:105:::0;;:::o;58646:528::-;58790:23;58856:22;58881:8;;:15;;58856:40;;58911:34;58969:14;58948:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;58911:73;;59004:9;58999:125;59020:14;59015:1;:19;58999:125;;59076:32;59096:8;;59105:1;59096:11;;;;;;;:::i;:::-;;;;;;;;59076:19;:32::i;:::-;59060:10;59071:1;59060:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;59036:3;;;;;58999:125;;;;59145:10;59138:17;;;;58646:528;;;;:::o;26882:152::-;26954:7;26997:27;27016:7;26997:18;:27::i;:::-;26974:52;;26882:152;;;:::o;22424:233::-;22496:7;22537:1;22520:19;;:5;:19;;;22516:60;;;22548:28;;;;;;;;;;;;;;22516:60;16583:13;22594:18;:25;22613:5;22594:25;;;;;;;;;;;;;;;;:55;22587:62;;22424:233;;;:::o;2811:103::-;2049:13;:11;:13::i;:::-;2876:30:::1;2903:1;2876:18;:30::i;:::-;2811:103::o:0;62522:900::-;62600:16;62654:19;62688:25;62728:22;62753:16;62763:5;62753:9;:16::i;:::-;62728:41;;62784:25;62826:14;62812:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62784:57;;62856:31;;:::i;:::-;62907:9;62919:15;:13;:15::i;:::-;62907:27;;62902:472;62951:14;62936:11;:29;62902:472;;63003:15;63016:1;63003:12;:15::i;:::-;62991:27;;63041:9;:16;;;63037:73;;;63082:8;;63037:73;63158:1;63132:28;;:9;:14;;;:28;;;63128:111;;63205:9;:14;;;63185:34;;63128:111;63282:5;63261:26;;:17;:26;;;63257:102;;;63338:1;63312:8;63321:13;;;;;;63312:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;63257:102;62902:472;62967:3;;;;;62902:472;;;;63395:8;63388:15;;;;;;;62522:900;;;:::o;65241:329::-;65299:7;65319:19;65394:22;;65367:23;;65358:6;65342:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:48;;;;:::i;:::-;65341:75;;;;:::i;:::-;65319:97;;65444:1;65430:11;:15;65427:136;;;65503:5;;65489:11;65468:18;;:32;;;;:::i;:::-;:40;;;;:::i;:::-;65461:47;;;;;65427:136;65546:5;;65539:12;;;65241:329;;;;:::o;65776:88::-;2049:13;:11;:13::i;:::-;65850:6:::1;65842:5;:14;;;;65776:88:::0;:::o;2163:87::-;2209:7;2236:6;;;;;;;;;;;2229:13;;2163:87;:::o;25665:104::-;25721:13;25754:7;25747:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25665:104;:::o;59562:2513::-;59705:16;59772:4;59763:5;:13;59759:45;;59785:19;;;;;;;;;;;;;;59759:45;59819:19;59853:17;59873:14;:12;:14::i;:::-;59853:34;;59973:15;:13;:15::i;:::-;59965:5;:23;59961:87;;;60017:15;:13;:15::i;:::-;60009:23;;59961:87;60124:9;60117:4;:16;60113:73;;;60161:9;60154:16;;60113:73;60200:25;60228:16;60238:5;60228:9;:16::i;:::-;60200:44;;60422:4;60414:5;:12;60410:278;;;60447:19;60476:5;60469:4;:12;60447:34;;60518:17;60504:11;:31;60500:111;;;60580:11;60560:31;;60500:111;60428:198;60410:278;;;60671:1;60651:21;;60410:278;60702:25;60744:17;60730:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60702:60;;60802:1;60781:17;:22;60777:78;;;60831:8;60824:15;;;;;;;;60777:78;60999:31;61033:26;61053:5;61033:19;:26::i;:::-;60999:60;;61074:25;61319:9;:16;;;61314:92;;61376:9;:14;;;61356:34;;61314:92;61425:9;61437:5;61425:17;;61420:478;61449:4;61444:1;:9;;:45;;;;;61472:17;61457:11;:32;;61444:45;61420:478;;;61527:15;61540:1;61527:12;:15::i;:::-;61515:27;;61565:9;:16;;;61561:73;;;61606:8;;61561:73;61682:1;61656:28;;:9;:14;;;:28;;;61652:111;;61729:9;:14;;;61709:34;;61652:111;61806:5;61785:26;;:17;:26;;;61781:102;;;61862:1;61836:8;61845:13;;;;;;61836:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;61781:102;61420:478;61491:3;;;;;61420:478;;;;62000:11;61990:8;61983:29;62048:8;62041:15;;;;;;;;59562:2513;;;;;;:::o;63623:20::-;;;;:::o;64394:502::-;64484:1:::1;64475:6;:10;64467:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;64554:9;;64544:6;64528:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;64520:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;64592:9;:21;64602:10;64592:21;;;;;;;;;;;;;;;;;;;;;;;;;64588:120;;64659:5;;64650:6;:14;;;;:::i;:::-;64637:9;:27;;64629:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;64588:120;64718:29;64728:10;64740:6;64718:9;:29::i;:::-;64758:16;64777:21;64758:40;;64823:1;64812:8;:12;64809:80;;;64840:5;;;;;;;;;;;:14;;:37;64855:21;64840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;64809:80;64456:440;63917:18:::0;:16;:18::i;:::-;64394:502;:::o;32530:308::-;32641:19;:17;:19::i;:::-;32629:31;;:8;:31;;;32625:61;;;32669:17;;;;;;;;;;;;;;32625:61;32751:8;32699:18;:39;32718:19;:17;:19::i;:::-;32699:39;;;;;;;;;;;;;;;:49;32739:8;32699:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;32811:8;32775:55;;32790:19;:17;:19::i;:::-;32775:55;;;32821:8;32775:55;;;;;;:::i;:::-;;;;;;;;32530:308;;:::o;39375:399::-;39542:31;39555:4;39561:2;39565:7;39542:12;:31::i;:::-;39606:1;39588:2;:14;;;:19;39584:183;;39627:56;39658:4;39664:2;39668:7;39677:5;39627:30;:56::i;:::-;39622:145;;39711:40;;;;;;;;;;;;;;39622:145;39584:183;39375:399;;;;:::o;58059:428::-;58143:21;;:::i;:::-;58177:31;;:::i;:::-;58233:15;:13;:15::i;:::-;58223:7;:25;:54;;;;58263:14;:12;:14::i;:::-;58252:7;:25;;58223:54;58219:103;;;58301:9;58294:16;;;;;58219:103;58344:21;58357:7;58344:12;:21::i;:::-;58332:33;;58380:9;:16;;;58376:65;;;58420:9;58413:16;;;;;58376:65;58458:21;58471:7;58458:12;:21::i;:::-;58451:28;;;58059:428;;;;:::o;25875:318::-;25948:13;25979:16;25987:7;25979;:16::i;:::-;25974:59;;26004:29;;;;;;;;;;;;;;25974:59;26046:21;26070:10;:8;:10::i;:::-;26046:34;;26123:1;26104:7;26098:21;:26;;:87;;;;;;;;;;;;;;;;;26151:7;26160:18;26170:7;26160:9;:18::i;:::-;26134:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26098:87;26091:94;;;25875:318;;;:::o;65889:140::-;2049:13;:11;:13::i;:::-;66002:19:::1;65981:18;:40;;;;65889:140:::0;:::o;66419:192::-;2049:13;:11;:13::i;:::-;66510:9:::1;66506:98;66523:10;;:17;;66521:1;:19;66506:98;;;66588:4;66561:9;:24;66571:10;;66582:1;66571:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;66561:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;66542:3;;;;;:::i;:::-;;;;66506:98;;;;66419:192:::0;;:::o;63592:24::-;;;;:::o;66253:141::-;2049:13;:11;:13::i;:::-;66353:1:::1;66335:20;;:6;:20;;;;66327:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;66380:6;66372:5;;:14;;;;;;;;;;;;;;;;;;66253:141:::0;:::o;32995:164::-;33092:4;33116:18;:25;33135:5;33116:25;;;;;;;;;;;;;;;:35;33142:8;33116:35;;;;;;;;;;;;;;;;;;;;;;;;;33109:42;;32995:164;;;;:::o;63690:37::-;;;;:::o;65595:156::-;2049:13;:11;:13::i;:::-;65691::::1;:11;:13::i;:::-;65677:10;:27;;65669:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;65733:10;65721:9;:22;;;;65595:156:::0;:::o;3069:201::-;2049:13;:11;:13::i;:::-;3178:1:::1;3158:22;;:8;:22;;;;3150:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3234:28;3253:8;3234:18;:28::i;:::-;3069:201:::0;:::o;63829:28::-;;;;;;;;;;;;;:::o;2328:132::-;2403:12;:10;:12::i;:::-;2392:23;;:7;:5;:7::i;:::-;:23;;;2384:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2328:132::o;33417:282::-;33482:4;33538:7;33519:15;:13;:15::i;:::-;:26;;:66;;;;;33572:13;;33562:7;:23;33519:66;:153;;;;;33671:1;17359:8;33623:17;:26;33641:7;33623:26;;;;;;;;;;;;:44;:49;33519:153;33499:173;;33417:282;;;:::o;55183:105::-;55243:7;55270:10;55263:17;;55183:105;:::o;20756:92::-;20812:7;20756:92;:::o;28037:1275::-;28104:7;28124:12;28139:7;28124:22;;28207:4;28188:15;:13;:15::i;:::-;:23;28184:1061;;28241:13;;28234:4;:20;28230:1015;;;28279:14;28296:17;:23;28314:4;28296:23;;;;;;;;;;;;28279:40;;28413:1;17359:8;28385:6;:24;:29;28381:845;;;29050:113;29067:1;29057:6;:11;29050:113;;;29110:17;:25;29128:6;;;;;;;29110:25;;;;;;;;;;;;29101:34;;29050:113;;;29196:6;29189:13;;;;;;28381:845;28256:989;28230:1015;28184:1061;29273:31;;;;;;;;;;;;;;28037:1275;;;;:::o;34580:479::-;34682:27;34711:23;34752:38;34793:15;:24;34809:7;34793:24;;;;;;;;;;;34752:65;;34964:18;34941:41;;35021:19;35015:26;34996:45;;34926:126;34580:479;;;:::o;33808:659::-;33957:11;34122:16;34115:5;34111:28;34102:37;;34282:16;34271:9;34267:32;34254:45;;34432:15;34421:9;34418:30;34410:5;34399:9;34396:20;34393:56;34383:66;;33808:659;;;;;:::o;40436:159::-;;;;;:::o;54492:311::-;54627:7;54647:16;17763:3;54673:19;:41;;54647:68;;17763:3;54741:31;54752:4;54758:2;54762:9;54741:10;:31::i;:::-;54733:40;;:62;;54726:69;;;54492:311;;;;;:::o;29860:450::-;29940:14;30108:16;30101:5;30097:28;30088:37;;30285:5;30271:11;30246:23;30242:41;30239:52;30232:5;30229:63;30219:73;;29860:450;;;;:::o;41260:158::-;;;;;:::o;3430:191::-;3504:16;3523:6;;;;;;;;;;;3504:25;;3549:8;3540:6;;:17;;;;;;;;;;;;;;;;;;3604:8;3573:40;;3594:8;3573:40;;;;;;;;;;;;3493:128;3430:191;:::o;27485:161::-;27553:21;;:::i;:::-;27594:44;27613:17;:24;27631:5;27613:24;;;;;;;;;;;;27594:18;:44::i;:::-;27587:51;;27485:161;;;:::o;20927:103::-;20982:7;21009:13;;21002:20;;20927:103;:::o;49015:112::-;49092:27;49102:2;49106:8;49092:27;;;;;;;;;;;;:9;:27::i;:::-;49015:112;;:::o;41858:716::-;42021:4;42067:2;42042:45;;;42088:19;:17;:19::i;:::-;42109:4;42115:7;42124:5;42042:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42038:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42342:1;42325:6;:13;:18;42321:235;;;42371:40;;;;;;;;;;;;;;42321:235;42514:6;42508:13;42499:6;42495:2;42491:15;42484:38;42038:529;42211:54;;;42201:64;;;:6;:64;;;;42194:71;;;41858:716;;;;;;:::o;27223:166::-;27293:21;;:::i;:::-;27334:47;27353:27;27372:7;27353:18;:27::i;:::-;27334:18;:47::i;:::-;27327:54;;27223:166;;;:::o;66965:113::-;67025:13;67058:12;67051:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66965:113;:::o;55390:1581::-;55455:17;55880:4;55873;55867:11;55863:22;55856:29;;55972:3;55966:4;55959:17;56078:3;56317:5;56299:428;56325:1;56299:428;;;56365:1;56360:3;56356:11;56349:18;;56536:2;56530:4;56526:13;56522:2;56518:22;56513:3;56505:36;56630:2;56624:4;56620:13;56612:21;;56697:4;56687:25;;56705:5;;56687:25;56299:428;;;56303:21;56766:3;56761;56757:13;56881:4;56876:3;56872:14;56865:21;;56946:6;56941:3;56934:19;55494:1470;;55390:1581;;;:::o;714:98::-;767:7;794:10;787:17;;714:98;:::o;54193:147::-;54330:6;54193:147;;;;;:::o;29411:366::-;29477:31;;:::i;:::-;29554:6;29521:9;:14;;:41;;;;;;;;;;;17242:3;29607:6;:33;;29573:9;:24;;:68;;;;;;;;;;;29699:1;17359:8;29671:6;:24;:29;;29652:9;:16;;:48;;;;;;;;;;;17763:3;29740:6;:28;;29711:9;:19;;:58;;;;;;;;;;;29411:366;;;:::o;48242:689::-;48373:19;48379:2;48383:8;48373:5;:19::i;:::-;48452:1;48434:2;:14;;;:19;48430:483;;48474:11;48488:13;;48474:27;;48520:13;48542:8;48536:3;:14;48520:30;;48569:233;48600:62;48639:1;48643:2;48647:7;;;;;;48656:5;48600:30;:62::i;:::-;48595:167;;48698:40;;;;;;;;;;;;;;48595:167;48797:3;48789:5;:11;48569:233;;48884:3;48867:13;;:20;48863:34;;48889:8;;;48863:34;48455:458;;48430:483;48242:689;;;:::o;43036:2454::-;43109:20;43132:13;;43109:36;;43172:1;43160:8;:13;43156:44;;;43182:18;;;;;;;;;;;;;;43156:44;43213:61;43243:1;43247:2;43251:12;43265:8;43213:21;:61::i;:::-;43757:1;16721:2;43727:1;:26;;43726:32;43714:8;:45;43688:18;:22;43707:2;43688:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;44036:139;44073:2;44127:33;44150:1;44154:2;44158:1;44127:14;:33::i;:::-;44094:30;44115:8;44094:20;:30::i;:::-;:66;44036:18;:139::i;:::-;44002:17;:31;44020:12;44002:31;;;;;;;;;;;:173;;;;44192:16;44223:11;44252:8;44237:12;:23;44223:37;;44507:16;44503:2;44499:25;44487:37;;44879:12;44839:8;44798:1;44736:25;44677:1;44616;44589:335;45004:1;44990:12;44986:20;44944:346;45045:3;45036:7;45033:16;44944:346;;45263:7;45253:8;45250:1;45223:25;45220:1;45217;45212:59;45098:1;45089:7;45085:15;45074:26;;44944:346;;;44948:77;45335:1;45323:8;:13;45319:45;;;45345:19;;;;;;;;;;;;;;45319:45;45397:3;45381:13;:19;;;;43462:1950;;45422:60;45451:1;45455:2;45459:12;45473:8;45422:20;:60::i;:::-;43098:2392;43036:2454;;:::o;30412:324::-;30482:14;30715:1;30705:8;30702:15;30676:24;30672:46;30662:56;;30412:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:155::-;622:5;660:6;647:20;638:29;;676:41;711:5;676:41;:::i;:::-;568:155;;;;:::o;746:568::-;819:8;829:6;879:3;872:4;864:6;860:17;856:27;846:122;;887:79;;:::i;:::-;846:122;1000:6;987:20;977:30;;1030:18;1022:6;1019:30;1016:117;;;1052:79;;:::i;:::-;1016:117;1166:4;1158:6;1154:17;1142:29;;1220:3;1212:4;1204:6;1200:17;1190:8;1186:32;1183:41;1180:128;;;1227:79;;:::i;:::-;1180:128;746:568;;;;;:::o;1337:::-;1410:8;1420:6;1470:3;1463:4;1455:6;1451:17;1447:27;1437:122;;1478:79;;:::i;:::-;1437:122;1591:6;1578:20;1568:30;;1621:18;1613:6;1610:30;1607:117;;;1643:79;;:::i;:::-;1607:117;1757:4;1749:6;1745:17;1733:29;;1811:3;1803:4;1795:6;1791:17;1781:8;1777:32;1774:41;1771:128;;;1818:79;;:::i;:::-;1771:128;1337:568;;;;;:::o;1911:133::-;1954:5;1992:6;1979:20;1970:29;;2008:30;2032:5;2008:30;:::i;:::-;1911:133;;;;:::o;2050:137::-;2095:5;2133:6;2120:20;2111:29;;2149:32;2175:5;2149:32;:::i;:::-;2050:137;;;;:::o;2193:141::-;2249:5;2280:6;2274:13;2265:22;;2296:32;2322:5;2296:32;:::i;:::-;2193:141;;;;:::o;2353:338::-;2408:5;2457:3;2450:4;2442:6;2438:17;2434:27;2424:122;;2465:79;;:::i;:::-;2424:122;2582:6;2569:20;2607:78;2681:3;2673:6;2666:4;2658:6;2654:17;2607:78;:::i;:::-;2598:87;;2414:277;2353:338;;;;:::o;2711:553::-;2769:8;2779:6;2829:3;2822:4;2814:6;2810:17;2806:27;2796:122;;2837:79;;:::i;:::-;2796:122;2950:6;2937:20;2927:30;;2980:18;2972:6;2969:30;2966:117;;;3002:79;;:::i;:::-;2966:117;3116:4;3108:6;3104:17;3092:29;;3170:3;3162:4;3154:6;3150:17;3140:8;3136:32;3133:41;3130:128;;;3177:79;;:::i;:::-;3130:128;2711:553;;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:345::-;3817:6;3866:2;3854:9;3845:7;3841:23;3837:32;3834:119;;;3872:79;;:::i;:::-;3834:119;3992:1;4017:61;4070:7;4061:6;4050:9;4046:22;4017:61;:::i;:::-;4007:71;;3963:125;3750:345;;;;:::o;4101:474::-;4169:6;4177;4226:2;4214:9;4205:7;4201:23;4197:32;4194:119;;;4232:79;;:::i;:::-;4194:119;4352:1;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4323:117;4479:2;4505:53;4550:7;4541:6;4530:9;4526:22;4505:53;:::i;:::-;4495:63;;4450:118;4101:474;;;;;:::o;4581:619::-;4658:6;4666;4674;4723:2;4711:9;4702:7;4698:23;4694:32;4691:119;;;4729:79;;:::i;:::-;4691:119;4849:1;4874:53;4919:7;4910:6;4899:9;4895:22;4874:53;:::i;:::-;4864:63;;4820:117;4976:2;5002:53;5047:7;5038:6;5027:9;5023:22;5002:53;:::i;:::-;4992:63;;4947:118;5104:2;5130:53;5175:7;5166:6;5155:9;5151:22;5130:53;:::i;:::-;5120:63;;5075:118;4581:619;;;;;:::o;5206:943::-;5301:6;5309;5317;5325;5374:3;5362:9;5353:7;5349:23;5345:33;5342:120;;;5381:79;;:::i;:::-;5342:120;5501:1;5526:53;5571:7;5562:6;5551:9;5547:22;5526:53;:::i;:::-;5516:63;;5472:117;5628:2;5654:53;5699:7;5690:6;5679:9;5675:22;5654:53;:::i;:::-;5644:63;;5599:118;5756:2;5782:53;5827:7;5818:6;5807:9;5803:22;5782:53;:::i;:::-;5772:63;;5727:118;5912:2;5901:9;5897:18;5884:32;5943:18;5935:6;5932:30;5929:117;;;5965:79;;:::i;:::-;5929:117;6070:62;6124:7;6115:6;6104:9;6100:22;6070:62;:::i;:::-;6060:72;;5855:287;5206:943;;;;;;;:::o;6155:468::-;6220:6;6228;6277:2;6265:9;6256:7;6252:23;6248:32;6245:119;;;6283:79;;:::i;:::-;6245:119;6403:1;6428:53;6473:7;6464:6;6453:9;6449:22;6428:53;:::i;:::-;6418:63;;6374:117;6530:2;6556:50;6598:7;6589:6;6578:9;6574:22;6556:50;:::i;:::-;6546:60;;6501:115;6155:468;;;;;:::o;6629:474::-;6697:6;6705;6754:2;6742:9;6733:7;6729:23;6725:32;6722:119;;;6760:79;;:::i;:::-;6722:119;6880:1;6905:53;6950:7;6941:6;6930:9;6926:22;6905:53;:::i;:::-;6895:63;;6851:117;7007:2;7033:53;7078:7;7069:6;7058:9;7054:22;7033:53;:::i;:::-;7023:63;;6978:118;6629:474;;;;;:::o;7109:619::-;7186:6;7194;7202;7251:2;7239:9;7230:7;7226:23;7222:32;7219:119;;;7257:79;;:::i;:::-;7219:119;7377:1;7402:53;7447:7;7438:6;7427:9;7423:22;7402:53;:::i;:::-;7392:63;;7348:117;7504:2;7530:53;7575:7;7566:6;7555:9;7551:22;7530:53;:::i;:::-;7520:63;;7475:118;7632:2;7658:53;7703:7;7694:6;7683:9;7679:22;7658:53;:::i;:::-;7648:63;;7603:118;7109:619;;;;;:::o;7734:559::-;7820:6;7828;7877:2;7865:9;7856:7;7852:23;7848:32;7845:119;;;7883:79;;:::i;:::-;7845:119;8031:1;8020:9;8016:17;8003:31;8061:18;8053:6;8050:30;8047:117;;;8083:79;;:::i;:::-;8047:117;8196:80;8268:7;8259:6;8248:9;8244:22;8196:80;:::i;:::-;8178:98;;;;7974:312;7734:559;;;;;:::o;8299:::-;8385:6;8393;8442:2;8430:9;8421:7;8417:23;8413:32;8410:119;;;8448:79;;:::i;:::-;8410:119;8596:1;8585:9;8581:17;8568:31;8626:18;8618:6;8615:30;8612:117;;;8648:79;;:::i;:::-;8612:117;8761:80;8833:7;8824:6;8813:9;8809:22;8761:80;:::i;:::-;8743:98;;;;8539:312;8299:559;;;;;:::o;8864:327::-;8922:6;8971:2;8959:9;8950:7;8946:23;8942:32;8939:119;;;8977:79;;:::i;:::-;8939:119;9097:1;9122:52;9166:7;9157:6;9146:9;9142:22;9122:52;:::i;:::-;9112:62;;9068:116;8864:327;;;;:::o;9197:349::-;9266:6;9315:2;9303:9;9294:7;9290:23;9286:32;9283:119;;;9321:79;;:::i;:::-;9283:119;9441:1;9466:63;9521:7;9512:6;9501:9;9497:22;9466:63;:::i;:::-;9456:73;;9412:127;9197:349;;;;:::o;9552:529::-;9623:6;9631;9680:2;9668:9;9659:7;9655:23;9651:32;9648:119;;;9686:79;;:::i;:::-;9648:119;9834:1;9823:9;9819:17;9806:31;9864:18;9856:6;9853:30;9850:117;;;9886:79;;:::i;:::-;9850:117;9999:65;10056:7;10047:6;10036:9;10032:22;9999:65;:::i;:::-;9981:83;;;;9777:297;9552:529;;;;;:::o;10087:329::-;10146:6;10195:2;10183:9;10174:7;10170:23;10166:32;10163:119;;;10201:79;;:::i;:::-;10163:119;10321:1;10346:53;10391:7;10382:6;10371:9;10367:22;10346:53;:::i;:::-;10336:63;;10292:117;10087:329;;;;:::o;10422:303::-;10553:10;10574:108;10678:3;10670:6;10574:108;:::i;:::-;10714:4;10709:3;10705:14;10691:28;;10422:303;;;;:::o;10731:179::-;10800:10;10821:46;10863:3;10855:6;10821:46;:::i;:::-;10899:4;10894:3;10890:14;10876:28;;10731:179;;;;:::o;10916:142::-;11019:32;11045:5;11019:32;:::i;:::-;11014:3;11007:45;10916:142;;:::o;11064:108::-;11141:24;11159:5;11141:24;:::i;:::-;11136:3;11129:37;11064:108;;:::o;11178:118::-;11265:24;11283:5;11265:24;:::i;:::-;11260:3;11253:37;11178:118;;:::o;11378:980::-;11559:3;11588:85;11667:5;11588:85;:::i;:::-;11689:117;11799:6;11794:3;11689:117;:::i;:::-;11682:124;;11830:87;11911:5;11830:87;:::i;:::-;11940:7;11971:1;11956:377;11981:6;11978:1;11975:13;11956:377;;;12057:6;12051:13;12084:125;12205:3;12190:13;12084:125;:::i;:::-;12077:132;;12232:91;12316:6;12232:91;:::i;:::-;12222:101;;12016:317;12003:1;12000;11996:9;11991:14;;11956:377;;;11960:14;12349:3;12342:10;;11564:794;;;11378:980;;;;:::o;12394:732::-;12513:3;12542:54;12590:5;12542:54;:::i;:::-;12612:86;12691:6;12686:3;12612:86;:::i;:::-;12605:93;;12722:56;12772:5;12722:56;:::i;:::-;12801:7;12832:1;12817:284;12842:6;12839:1;12836:13;12817:284;;;12918:6;12912:13;12945:63;13004:3;12989:13;12945:63;:::i;:::-;12938:70;;13031:60;13084:6;13031:60;:::i;:::-;13021:70;;12877:224;12864:1;12861;12857:9;12852:14;;12817:284;;;12821:14;13117:3;13110:10;;12518:608;;;12394:732;;;;:::o;13132:99::-;13203:21;13218:5;13203:21;:::i;:::-;13198:3;13191:34;13132:99;;:::o;13237:109::-;13318:21;13333:5;13318:21;:::i;:::-;13313:3;13306:34;13237:109;;:::o;13352:360::-;13438:3;13466:38;13498:5;13466:38;:::i;:::-;13520:70;13583:6;13578:3;13520:70;:::i;:::-;13513:77;;13599:52;13644:6;13639:3;13632:4;13625:5;13621:16;13599:52;:::i;:::-;13676:29;13698:6;13676:29;:::i;:::-;13671:3;13667:39;13660:46;;13442:270;13352:360;;;;:::o;13718:364::-;13806:3;13834:39;13867:5;13834:39;:::i;:::-;13889:71;13953:6;13948:3;13889:71;:::i;:::-;13882:78;;13969:52;14014:6;14009:3;14002:4;13995:5;13991:16;13969:52;:::i;:::-;14046:29;14068:6;14046:29;:::i;:::-;14041:3;14037:39;14030:46;;13810:272;13718:364;;;;:::o;14088:377::-;14194:3;14222:39;14255:5;14222:39;:::i;:::-;14277:89;14359:6;14354:3;14277:89;:::i;:::-;14270:96;;14375:52;14420:6;14415:3;14408:4;14401:5;14397:16;14375:52;:::i;:::-;14452:6;14447:3;14443:16;14436:23;;14198:267;14088:377;;;;:::o;14471:365::-;14613:3;14634:66;14698:1;14693:3;14634:66;:::i;:::-;14627:73;;14709:93;14798:3;14709:93;:::i;:::-;14827:2;14822:3;14818:12;14811:19;;14471:365;;;:::o;14842:366::-;14984:3;15005:67;15069:2;15064:3;15005:67;:::i;:::-;14998:74;;15081:93;15170:3;15081:93;:::i;:::-;15199:2;15194:3;15190:12;15183:19;;14842:366;;;:::o;15214:::-;15356:3;15377:67;15441:2;15436:3;15377:67;:::i;:::-;15370:74;;15453:93;15542:3;15453:93;:::i;:::-;15571:2;15566:3;15562:12;15555:19;;15214:366;;;:::o;15586:::-;15728:3;15749:67;15813:2;15808:3;15749:67;:::i;:::-;15742:74;;15825:93;15914:3;15825:93;:::i;:::-;15943:2;15938:3;15934:12;15927:19;;15586:366;;;:::o;15958:::-;16100:3;16121:67;16185:2;16180:3;16121:67;:::i;:::-;16114:74;;16197:93;16286:3;16197:93;:::i;:::-;16315:2;16310:3;16306:12;16299:19;;15958:366;;;:::o;16330:365::-;16472:3;16493:66;16557:1;16552:3;16493:66;:::i;:::-;16486:73;;16568:93;16657:3;16568:93;:::i;:::-;16686:2;16681:3;16677:12;16670:19;;16330:365;;;:::o;16773:864::-;16922:4;16917:3;16913:14;17009:4;17002:5;16998:16;16992:23;17028:63;17085:4;17080:3;17076:14;17062:12;17028:63;:::i;:::-;16937:164;17193:4;17186:5;17182:16;17176:23;17212:61;17267:4;17262:3;17258:14;17244:12;17212:61;:::i;:::-;17111:172;17367:4;17360:5;17356:16;17350:23;17386:57;17437:4;17432:3;17428:14;17414:12;17386:57;:::i;:::-;17293:160;17540:4;17533:5;17529:16;17523:23;17559:61;17614:4;17609:3;17605:14;17591:12;17559:61;:::i;:::-;17463:167;16891:746;16773:864;;:::o;17715:874::-;17874:4;17869:3;17865:14;17961:4;17954:5;17950:16;17944:23;17980:63;18037:4;18032:3;18028:14;18014:12;17980:63;:::i;:::-;17889:164;18145:4;18138:5;18134:16;18128:23;18164:61;18219:4;18214:3;18210:14;18196:12;18164:61;:::i;:::-;18063:172;18319:4;18312:5;18308:16;18302:23;18338:57;18389:4;18384:3;18380:14;18366:12;18338:57;:::i;:::-;18245:160;18492:4;18485:5;18481:16;18475:23;18511:61;18566:4;18561:3;18557:14;18543:12;18511:61;:::i;:::-;18415:167;17843:746;17715:874;;:::o;18595:105::-;18670:23;18687:5;18670:23;:::i;:::-;18665:3;18658:36;18595:105;;:::o;18706:108::-;18783:24;18801:5;18783:24;:::i;:::-;18778:3;18771:37;18706:108;;:::o;18820:118::-;18907:24;18925:5;18907:24;:::i;:::-;18902:3;18895:37;18820:118;;:::o;18944:105::-;19019:23;19036:5;19019:23;:::i;:::-;19014:3;19007:36;18944:105;;:::o;19055:435::-;19235:3;19257:95;19348:3;19339:6;19257:95;:::i;:::-;19250:102;;19369:95;19460:3;19451:6;19369:95;:::i;:::-;19362:102;;19481:3;19474:10;;19055:435;;;;;:::o;19496:222::-;19589:4;19627:2;19616:9;19612:18;19604:26;;19640:71;19708:1;19697:9;19693:17;19684:6;19640:71;:::i;:::-;19496:222;;;;:::o;19724:254::-;19833:4;19871:2;19860:9;19856:18;19848:26;;19884:87;19968:1;19957:9;19953:17;19944:6;19884:87;:::i;:::-;19724:254;;;;:::o;19984:640::-;20179:4;20217:3;20206:9;20202:19;20194:27;;20231:71;20299:1;20288:9;20284:17;20275:6;20231:71;:::i;:::-;20312:72;20380:2;20369:9;20365:18;20356:6;20312:72;:::i;:::-;20394;20462:2;20451:9;20447:18;20438:6;20394:72;:::i;:::-;20513:9;20507:4;20503:20;20498:2;20487:9;20483:18;20476:48;20541:76;20612:4;20603:6;20541:76;:::i;:::-;20533:84;;19984:640;;;;;;;:::o;20630:497::-;20835:4;20873:2;20862:9;20858:18;20850:26;;20922:9;20916:4;20912:20;20908:1;20897:9;20893:17;20886:47;20950:170;21115:4;21106:6;20950:170;:::i;:::-;20942:178;;20630:497;;;;:::o;21133:373::-;21276:4;21314:2;21303:9;21299:18;21291:26;;21363:9;21357:4;21353:20;21349:1;21338:9;21334:17;21327:47;21391:108;21494:4;21485:6;21391:108;:::i;:::-;21383:116;;21133:373;;;;:::o;21512:210::-;21599:4;21637:2;21626:9;21622:18;21614:26;;21650:65;21712:1;21701:9;21697:17;21688:6;21650:65;:::i;:::-;21512:210;;;;:::o;21728:313::-;21841:4;21879:2;21868:9;21864:18;21856:26;;21928:9;21922:4;21918:20;21914:1;21903:9;21899:17;21892:47;21956:78;22029:4;22020:6;21956:78;:::i;:::-;21948:86;;21728:313;;;;:::o;22047:419::-;22213:4;22251:2;22240:9;22236:18;22228:26;;22300:9;22294:4;22290:20;22286:1;22275:9;22271:17;22264:47;22328:131;22454:4;22328:131;:::i;:::-;22320:139;;22047:419;;;:::o;22472:::-;22638:4;22676:2;22665:9;22661:18;22653:26;;22725:9;22719:4;22715:20;22711:1;22700:9;22696:17;22689:47;22753:131;22879:4;22753:131;:::i;:::-;22745:139;;22472:419;;;:::o;22897:::-;23063:4;23101:2;23090:9;23086:18;23078:26;;23150:9;23144:4;23140:20;23136:1;23125:9;23121:17;23114:47;23178:131;23304:4;23178:131;:::i;:::-;23170:139;;22897:419;;;:::o;23322:::-;23488:4;23526:2;23515:9;23511:18;23503:26;;23575:9;23569:4;23565:20;23561:1;23550:9;23546:17;23539:47;23603:131;23729:4;23603:131;:::i;:::-;23595:139;;23322:419;;;:::o;23747:::-;23913:4;23951:2;23940:9;23936:18;23928:26;;24000:9;23994:4;23990:20;23986:1;23975:9;23971:17;23964:47;24028:131;24154:4;24028:131;:::i;:::-;24020:139;;23747:419;;;:::o;24172:::-;24338:4;24376:2;24365:9;24361:18;24353:26;;24425:9;24419:4;24415:20;24411:1;24400:9;24396:17;24389:47;24453:131;24579:4;24453:131;:::i;:::-;24445:139;;24172:419;;;:::o;24597:347::-;24752:4;24790:3;24779:9;24775:19;24767:27;;24804:133;24934:1;24923:9;24919:17;24910:6;24804:133;:::i;:::-;24597:347;;;;:::o;24950:222::-;25043:4;25081:2;25070:9;25066:18;25058:26;;25094:71;25162:1;25151:9;25147:17;25138:6;25094:71;:::i;:::-;24950:222;;;;:::o;25178:129::-;25212:6;25239:20;;:::i;:::-;25229:30;;25268:33;25296:4;25288:6;25268:33;:::i;:::-;25178:129;;;:::o;25313:75::-;25346:6;25379:2;25373:9;25363:19;;25313:75;:::o;25394:307::-;25455:4;25545:18;25537:6;25534:30;25531:56;;;25567:18;;:::i;:::-;25531:56;25605:29;25627:6;25605:29;:::i;:::-;25597:37;;25689:4;25683;25679:15;25671:23;;25394:307;;;:::o;25707:163::-;25805:4;25828:3;25820:11;;25858:4;25853:3;25849:14;25841:22;;25707:163;;;:::o;25876:132::-;25943:4;25966:3;25958:11;;25996:4;25991:3;25987:14;25979:22;;25876:132;;;:::o;26014:145::-;26112:6;26146:5;26140:12;26130:22;;26014:145;;;:::o;26165:114::-;26232:6;26266:5;26260:12;26250:22;;26165:114;;;:::o;26285:98::-;26336:6;26370:5;26364:12;26354:22;;26285:98;;;:::o;26389:99::-;26441:6;26475:5;26469:12;26459:22;;26389:99;;;:::o;26494:144::-;26595:4;26627;26622:3;26618:14;26610:22;;26494:144;;;:::o;26644:113::-;26714:4;26746;26741:3;26737:14;26729:22;;26644:113;;;:::o;26763:215::-;26893:11;26927:6;26922:3;26915:19;26967:4;26962:3;26958:14;26943:29;;26763:215;;;;:::o;26984:184::-;27083:11;27117:6;27112:3;27105:19;27157:4;27152:3;27148:14;27133:29;;26984:184;;;;:::o;27174:168::-;27257:11;27291:6;27286:3;27279:19;27331:4;27326:3;27322:14;27307:29;;27174:168;;;;:::o;27348:169::-;27432:11;27466:6;27461:3;27454:19;27506:4;27501:3;27497:14;27482:29;;27348:169;;;;:::o;27523:148::-;27625:11;27662:3;27647:18;;27523:148;;;;:::o;27677:305::-;27717:3;27736:20;27754:1;27736:20;:::i;:::-;27731:25;;27770:20;27788:1;27770:20;:::i;:::-;27765:25;;27924:1;27856:66;27852:74;27849:1;27846:81;27843:107;;;27930:18;;:::i;:::-;27843:107;27974:1;27971;27967:9;27960:16;;27677:305;;;;:::o;27988:185::-;28028:1;28045:20;28063:1;28045:20;:::i;:::-;28040:25;;28079:20;28097:1;28079:20;:::i;:::-;28074:25;;28118:1;28108:35;;28123:18;;:::i;:::-;28108:35;28165:1;28162;28158:9;28153:14;;27988:185;;;;:::o;28179:348::-;28219:7;28242:20;28260:1;28242:20;:::i;:::-;28237:25;;28276:20;28294:1;28276:20;:::i;:::-;28271:25;;28464:1;28396:66;28392:74;28389:1;28386:81;28381:1;28374:9;28367:17;28363:105;28360:131;;;28471:18;;:::i;:::-;28360:131;28519:1;28516;28512:9;28501:20;;28179:348;;;;:::o;28533:191::-;28573:4;28593:20;28611:1;28593:20;:::i;:::-;28588:25;;28627:20;28645:1;28627:20;:::i;:::-;28622:25;;28666:1;28663;28660:8;28657:34;;;28671:18;;:::i;:::-;28657:34;28716:1;28713;28709:9;28701:17;;28533:191;;;;:::o;28730:96::-;28767:7;28796:24;28814:5;28796:24;:::i;:::-;28785:35;;28730:96;;;:::o;28832:104::-;28877:7;28906:24;28924:5;28906:24;:::i;:::-;28895:35;;28832:104;;;:::o;28942:90::-;28976:7;29019:5;29012:13;29005:21;28994:32;;28942:90;;;:::o;29038:149::-;29074:7;29114:66;29107:5;29103:78;29092:89;;29038:149;;;:::o;29193:126::-;29230:7;29270:42;29263:5;29259:54;29248:65;;29193:126;;;:::o;29325:91::-;29361:7;29401:8;29394:5;29390:20;29379:31;;29325:91;;;:::o;29422:77::-;29459:7;29488:5;29477:16;;29422:77;;;:::o;29505:101::-;29541:7;29581:18;29574:5;29570:30;29559:41;;29505:101;;;:::o;29612:154::-;29696:6;29691:3;29686;29673:30;29758:1;29749:6;29744:3;29740:16;29733:27;29612:154;;;:::o;29772:307::-;29840:1;29850:113;29864:6;29861:1;29858:13;29850:113;;;29949:1;29944:3;29940:11;29934:18;29930:1;29925:3;29921:11;29914:39;29886:2;29883:1;29879:10;29874:15;;29850:113;;;29981:6;29978:1;29975:13;29972:101;;;30061:1;30052:6;30047:3;30043:16;30036:27;29972:101;29821:258;29772:307;;;:::o;30085:320::-;30129:6;30166:1;30160:4;30156:12;30146:22;;30213:1;30207:4;30203:12;30234:18;30224:81;;30290:4;30282:6;30278:17;30268:27;;30224:81;30352:2;30344:6;30341:14;30321:18;30318:38;30315:84;;;30371:18;;:::i;:::-;30315:84;30136:269;30085:320;;;:::o;30411:281::-;30494:27;30516:4;30494:27;:::i;:::-;30486:6;30482:40;30624:6;30612:10;30609:22;30588:18;30576:10;30573:34;30570:62;30567:88;;;30635:18;;:::i;:::-;30567:88;30675:10;30671:2;30664:22;30454:238;30411:281;;:::o;30698:233::-;30737:3;30760:24;30778:5;30760:24;:::i;:::-;30751:33;;30806:66;30799:5;30796:77;30793:103;;;30876:18;;:::i;:::-;30793:103;30923:1;30916:5;30912:13;30905:20;;30698:233;;;:::o;30937:180::-;30985:77;30982:1;30975:88;31082:4;31079:1;31072:15;31106:4;31103:1;31096:15;31123:180;31171:77;31168:1;31161:88;31268:4;31265:1;31258:15;31292:4;31289:1;31282:15;31309:180;31357:77;31354:1;31347:88;31454:4;31451:1;31444:15;31478:4;31475:1;31468:15;31495:180;31543:77;31540:1;31533:88;31640:4;31637:1;31630:15;31664:4;31661:1;31654:15;31681:180;31729:77;31726:1;31719:88;31826:4;31823:1;31816:15;31850:4;31847:1;31840:15;31867:117;31976:1;31973;31966:12;31990:117;32099:1;32096;32089:12;32113:117;32222:1;32219;32212:12;32236:117;32345:1;32342;32335:12;32359:117;32468:1;32465;32458:12;32482:117;32591:1;32588;32581:12;32605:102;32646:6;32697:2;32693:7;32688:2;32681:5;32677:14;32673:28;32663:38;;32605:102;;;:::o;32713:151::-;32853:3;32849:1;32841:6;32837:14;32830:27;32713:151;:::o;32870:177::-;33010:29;33006:1;32998:6;32994:14;32987:53;32870:177;:::o;33053:225::-;33193:34;33189:1;33181:6;33177:14;33170:58;33262:8;33257:2;33249:6;33245:15;33238:33;33053:225;:::o;33284:169::-;33424:21;33420:1;33412:6;33408:14;33401:45;33284:169;:::o;33459:182::-;33599:34;33595:1;33587:6;33583:14;33576:58;33459:182;:::o;33647:159::-;33787:11;33783:1;33775:6;33771:14;33764:35;33647:159;:::o;33812:122::-;33885:24;33903:5;33885:24;:::i;:::-;33878:5;33875:35;33865:63;;33924:1;33921;33914:12;33865:63;33812:122;:::o;33940:138::-;34021:32;34047:5;34021:32;:::i;:::-;34014:5;34011:43;34001:71;;34068:1;34065;34058:12;34001:71;33940:138;:::o;34084:116::-;34154:21;34169:5;34154:21;:::i;:::-;34147:5;34144:32;34134:60;;34190:1;34187;34180:12;34134:60;34084:116;:::o;34206:120::-;34278:23;34295:5;34278:23;:::i;:::-;34271:5;34268:34;34258:62;;34316:1;34313;34306:12;34258:62;34206:120;:::o;34332:122::-;34405:24;34423:5;34405:24;:::i;:::-;34398:5;34395:35;34385:63;;34444:1;34441;34434:12;34385:63;34332:122;:::o
Swarm Source
ipfs://0ad0b0a93c4c1e5e3025f9158f724577e986c66e8407dbad2f3438f31cf0eb4d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.