Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
5,555 TOONIES
Holders
2,236
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 TOONIESLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Toonies
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-05 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @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 ) external; /** * @dev Transfers `tokenId` token 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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 calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @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); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: erc721a/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). * * Assumes that an owner cannot have more than the 2**128 (max value of uint128) of supply */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal _nextTokenId; // 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 ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _nextTokenId = 1; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _nextTokenId - 1; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), 'ERC721A: global index out of bounds'); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), 'ERC721A: owner index out of bounds'); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert('ERC721A: unable to get token of owner by index'); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), 'ERC721A: balance query for the zero address'); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require(owner != address(0), 'ERC721A: number minted query for the zero address'); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), 'ERC721A: owner query for nonexistent token'); for (uint256 curr = tokenId; ; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert('ERC721A: unable to determine the owner of token'); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @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, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, 'ERC721A: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721A: approve caller is not owner nor approved for all' ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), 'ERC721A: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), 'ERC721A: approve to caller'); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } /** * @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 (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < _nextTokenId; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _nextTokenId; require(to != address(0), 'ERC721A: mint to the zero address'); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), 'ERC721A: token already minted'); require(quantity > 0, 'ERC721A: quantity must be greater 0'); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); updatedIndex++; } _nextTokenId = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved'); require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner'); require(to != address(0), 'ERC721A: transfer to the zero address'); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; } _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership(prevOwnership.addr, prevOwnership.startTimestamp); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert('ERC721A: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * 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`. */ 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. * * 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` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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); } } pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } pragma solidity ^0.8.0; contract Toonies is ERC721A, Ownable { using Strings for uint256; address public contractOwner; uint256 public mintPrice = 0.0055 ether; uint256 public presalePrice = 0.0 ether; uint256 public supply = 5555; uint256 public freeMintAmount = 1000; string private baseURI = "ipfs://bafybeibzld7p63uzauuufwybzquzdkxd6yrjfbd7gfmhnexvuf7vyejroi/"; bytes32 public presaleMerkleRoot; uint8 public phase = 1; uint8 public maxBuy = 5; uint8 public presaleMaxBuy = 1; mapping(address => uint8) public walletBuys; constructor() ERC721A("Toonies Social Club", "TOONIES") { contractOwner = msg.sender; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : ""; } function mintForAddress(address[] calldata _addresses, uint256 quantity) public onlyOwner { for (uint i=0; i<_addresses.length; i++) { _safeMint(_addresses[i], quantity); } } function mint(uint8 _mintAmount) external payable { require(phase >= 2, "This sale has not started"); require(totalSupply() + _mintAmount <= supply, "You can't mint more then the total supply"); if(walletBuys[msg.sender] < 1 && totalSupply() < freeMintAmount) { require(totalSupply() + 1 <= supply, "You can't mint more then the total supply"); if(_mintAmount > 1) { require(walletBuys[msg.sender] + (_mintAmount - 1) <= maxBuy, "Buy limit reached"); require(msg.value >= mintPrice * (_mintAmount - 1), "Insufficient funds"); } //Free mint presaleMaxBuy walletBuys[msg.sender] += _mintAmount; _safeMint(msg.sender, _mintAmount); } else { //Mint up to maxBuy require(walletBuys[msg.sender] + _mintAmount <= maxBuy, "Buy limit reached"); require(msg.value >= mintPrice * _mintAmount, "Insufficient funds"); walletBuys[msg.sender] += _mintAmount; _safeMint(msg.sender, _mintAmount); } } function wlMint(uint8 _mintAmount, bytes32[] calldata _merkleProof) external payable { require(phase >= 1, "This sale has not started"); require(totalSupply() + _mintAmount <= supply, "You can't mint more then the total supply"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_merkleProof, presaleMerkleRoot, leaf), "Invalid proof!"); if(walletBuys[msg.sender] < 1 && totalSupply() < freeMintAmount) { require(totalSupply() + 1 <= supply, "You can't mint more then the total supply"); if(_mintAmount > 1) { require(walletBuys[msg.sender] + (_mintAmount - 1) <= maxBuy, "Buy limit reached"); require(msg.value >= mintPrice * (_mintAmount - 1), "Insufficient funds"); } //Free mint + presaleMaxBuy walletBuys[msg.sender] += _mintAmount; _safeMint(msg.sender, _mintAmount); } else { //Mint up to maxBuy require(walletBuys[msg.sender] + _mintAmount <= maxBuy, "Buy limit reached"); require(msg.value >= mintPrice * _mintAmount, "Insufficient funds"); walletBuys[msg.sender] += _mintAmount; _safeMint(msg.sender, _mintAmount); } } function getBaseURI() public view returns (string memory) { return baseURI; } function _baseURI() internal view override returns (string memory) { return baseURI; } function setBaseURI(string memory baseURI_) external onlyOwner { baseURI = baseURI_; } function setMintPrice (uint256 _newPrice) external onlyOwner { mintPrice = _newPrice; } function setPhase(uint8 _phase) public onlyOwner { phase = _phase; } function setMaxBuy(uint8 _maxBuy) external onlyOwner { maxBuy = _maxBuy; } function setPresaleMaxBuy(uint8 _maxBuy) external onlyOwner { presaleMaxBuy = _maxBuy; } function changePresaleRootHash(bytes32 _rootHash) external onlyOwner { presaleMerkleRoot = _rootHash; } function updateSupply(uint256 _supply) external onlyOwner { supply = _supply; } function updateFreeMintAmount(uint256 _amount) external onlyOwner { freeMintAmount = _amount; } function getContractBalance () external view onlyOwner returns (uint256) { return address(this).balance; } function changeTreasury(address payable _newWallet) external onlyOwner { contractOwner = _newWallet; } function withdraw() external payable onlyOwner { (bool os, ) = payable(contractOwner).call{value: address(this).balance}(""); require(os); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":"bytes32","name":"_rootHash","type":"bytes32"}],"name":"changePresaleRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newWallet","type":"address"}],"name":"changeTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxBuy","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"phase","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMaxBuy","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","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":"uint8","name":"_maxBuy","type":"uint8"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_phase","type":"uint8"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxBuy","type":"uint8"}],"name":"setPresaleMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateFreeMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"updateSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletBuys","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"wlMint","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
66138a388a43c0006009556000600a556115b3600b556103e8600c55610100604052604360808181529062002e2a60a03980516200004691600d916020909101906200015d565b50600f805462ffffff1916620105011790553480156200006557600080fd5b50604080518082018252601381527f546f6f6e69657320536f6369616c20436c756200000000000000000000000000602080830191825283518085019094526007845266544f4f4e49455360c81b908401528151919291620000ca916001916200015d565b508051620000e09060029060208401906200015d565b5050600160005550620000f3336200010b565b600880546001600160a01b0319163317905562000240565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200016b9062000203565b90600052602060002090601f0160209004810192826200018f5760008555620001da565b82601f10620001aa57805160ff1916838001178555620001da565b82800160010185558215620001da579182015b82811115620001da578251825591602001919060010190620001bd565b50620001e8929150620001ec565b5090565b5b80821115620001e85760008155600101620001ed565b600181811c908216806200021857607f821691505b602082108114156200023a57634e487b7160e01b600052602260045260246000fd5b50919050565b612bda80620002506000396000f3fe6080604052600436106102665760003560e01c806370a0823111610144578063c03afb59116100b6578063dea96c981161007a578063dea96c98146106e5578063dfcf15b014610715578063e985e9c514610735578063f2fde38b1461077e578063f4a0a5281461079e578063fc0ab6e2146107be57600080fd5b8063c03afb5914610645578063c87b56dd14610665578063ce606ee014610685578063d7795b46146106a5578063dbdf2dc0146106c557600080fd5b806395d89b411161010857806395d89b4114610596578063a22cb465146105ab578063ad0b4cc3146105cb578063b14f2a39146105eb578063b1c9fe6e1461060b578063b88d4fde1461062557600080fd5b806370a082311461050f57806370db69d61461052f578063714c53981461054e578063715018a6146105635780638da5cb5b1461057857600080fd5b80633a467e3d116101dd57806355f804b3116101a157806355f804b3146104715780636352211e146104915780636817c76c146104b15780636bd08049146104c75780636ecd2306146104e75780636f9fb98a146104fa57600080fd5b80633a467e3d146103f35780633c4201d2146104095780633ccfd60b1461042957806342842e0e146104315780634f6ccce71461045157600080fd5b8063095ea7b31161022f578063095ea7b31461033457806318160ddd1461035657806322212e2b1461036b57806323b872dd146103815780632f745c59146103a15780633a3f716a146103c157600080fd5b80620e7fa81461026b57806301ffc9a714610294578063047fc9aa146102c457806306fdde03146102da578063081812fc146102fc575b600080fd5b34801561027757600080fd5b50610281600a5481565b6040519081526020015b60405180910390f35b3480156102a057600080fd5b506102b46102af36600461238f565b6107d1565b604051901515815260200161028b565b3480156102d057600080fd5b50610281600b5481565b3480156102e657600080fd5b506102ef61083e565b60405161028b919061240b565b34801561030857600080fd5b5061031c61031736600461241e565b6108d0565b6040516001600160a01b03909116815260200161028b565b34801561034057600080fd5b5061035461034f36600461244c565b610960565b005b34801561036257600080fd5b50610281610a78565b34801561037757600080fd5b50610281600e5481565b34801561038d57600080fd5b5061035461039c366004612478565b610a8e565b3480156103ad57600080fd5b506102816103bc36600461244c565b610a99565b3480156103cd57600080fd5b50600f546103e19062010000900460ff1681565b60405160ff909116815260200161028b565b3480156103ff57600080fd5b50610281600c5481565b34801561041557600080fd5b5061035461042436600461241e565b610c11565b610354610c40565b34801561043d57600080fd5b5061035461044c366004612478565b610ccd565b34801561045d57600080fd5b5061028161046c36600461241e565b610ce8565b34801561047d57600080fd5b5061035461048c366004612545565b610d50565b34801561049d57600080fd5b5061031c6104ac36600461241e565b610d91565b3480156104bd57600080fd5b5061028160095481565b3480156104d357600080fd5b506103546104e236600461241e565b610da3565b6103546104f53660046125a4565b610dd2565b34801561050657600080fd5b50610281610fff565b34801561051b57600080fd5b5061028161052a3660046125bf565b611031565b34801561053b57600080fd5b50600f546103e190610100900460ff1681565b34801561055a57600080fd5b506102ef6110c2565b34801561056f57600080fd5b506103546110d1565b34801561058457600080fd5b506007546001600160a01b031661031c565b3480156105a257600080fd5b506102ef611107565b3480156105b757600080fd5b506103546105c63660046125dc565b611116565b3480156105d757600080fd5b506103546105e63660046125a4565b6111db565b3480156105f757600080fd5b506103546106063660046125bf565b611223565b34801561061757600080fd5b50600f546103e19060ff1681565b34801561063157600080fd5b5061035461064036600461261a565b61126f565b34801561065157600080fd5b506103546106603660046125a4565b6112a8565b34801561067157600080fd5b506102ef61068036600461241e565b6112e8565b34801561069157600080fd5b5060085461031c906001600160a01b031681565b3480156106b157600080fd5b506103546106c036600461241e565b6113b5565b3480156106d157600080fd5b506103546106e03660046125a4565b6113e4565b3480156106f157600080fd5b506103e16107003660046125bf565b60106020526000908152604090205460ff1681565b34801561072157600080fd5b506103546107303660046126e6565b61142a565b34801561074157600080fd5b506102b4610750366004612732565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561078a57600080fd5b506103546107993660046125bf565b6114a1565b3480156107aa57600080fd5b506103546107b936600461241e565b611539565b6103546107cc366004612760565b611568565b60006001600160e01b031982166380ac58cd60e01b148061080257506001600160e01b03198216635b5e139f60e01b145b8061081d57506001600160e01b0319821663780e9d6360e01b145b8061083857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461084d906127b3565b80601f0160208091040260200160405190810160405280929190818152602001828054610879906127b3565b80156108c65780601f1061089b576101008083540402835291602001916108c6565b820191906000526020600020905b8154815290600101906020018083116108a957829003601f168201915b5050505050905090565b60006108dd826000541190565b6109445760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061096b82610d91565b9050806001600160a01b0316836001600160a01b031614156109da5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161093b565b336001600160a01b03821614806109f657506109f68133610750565b610a685760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161093b565b610a738383836118b7565b505050565b60006001600054610a899190612804565b905090565b610a73838383611913565b6000610aa483611031565b8210610afd5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161093b565b6000610b07610a78565b905060008060005b83811015610bb1576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610b6257805192505b876001600160a01b0316836001600160a01b03161415610b9e5786841415610b905750935061083892505050565b83610b9a8161281b565b9450505b5080610ba98161281b565b915050610b0f565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161093b565b6007546001600160a01b03163314610c3b5760405162461bcd60e51b815260040161093b90612836565b600e55565b6007546001600160a01b03163314610c6a5760405162461bcd60e51b815260040161093b90612836565b6008546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610cb7576040519150601f19603f3d011682016040523d82523d6000602084013e610cbc565b606091505b5050905080610cca57600080fd5b50565b610a738383836040518060200160405280600081525061126f565b6000610cf2610a78565b8210610d4c5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161093b565b5090565b6007546001600160a01b03163314610d7a5760405162461bcd60e51b815260040161093b90612836565b8051610d8d90600d9060208401906122e9565b5050565b6000610d9c82611c5a565b5192915050565b6007546001600160a01b03163314610dcd5760405162461bcd60e51b815260040161093b90612836565b600b55565b600f54600260ff9091161015610e265760405162461bcd60e51b8152602060048201526019602482015278151a1a5cc81cd85b19481a185cc81b9bdd081cdd185c9d1959603a1b604482015260640161093b565b600b548160ff16610e35610a78565b610e3f919061286b565b1115610e5d5760405162461bcd60e51b815260040161093b90612883565b33600090815260106020526040902054600160ff909116108015610e895750600c54610e87610a78565b105b15610fa357600b54610e99610a78565b610ea490600161286b565b1115610ec25760405162461bcd60e51b815260040161093b90612883565b60018160ff161115610f5c57600f54610100900460ff16610ee46001836128cc565b33600090815260106020526040902054610f01919060ff166128ef565b60ff161115610f225760405162461bcd60e51b815260040161093b90612914565b610f2d6001826128cc565b60ff16600954610f3d919061293f565b341015610f5c5760405162461bcd60e51b815260040161093b9061295e565b3360009081526010602052604081208054839290610f7e90849060ff166128ef565b92506101000a81548160ff021916908360ff160217905550610cca338260ff16611d3a565b600f543360009081526010602052604090205460ff610100909204821691610fcd918491166128ef565b60ff161115610fee5760405162461bcd60e51b815260040161093b90612914565b8060ff16600954610f3d919061293f565b6007546000906001600160a01b0316331461102c5760405162461bcd60e51b815260040161093b90612836565b504790565b60006001600160a01b03821661109d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161093b565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6060600d805461084d906127b3565b6007546001600160a01b031633146110fb5760405162461bcd60e51b815260040161093b90612836565b6111056000611d54565b565b60606002805461084d906127b3565b6001600160a01b03821633141561116f5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161093b565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146112055760405162461bcd60e51b815260040161093b90612836565b600f805460ff909216620100000262ff000019909216919091179055565b6007546001600160a01b0316331461124d5760405162461bcd60e51b815260040161093b90612836565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b61127a848484611913565b61128684848484611da6565b6112a25760405162461bcd60e51b815260040161093b9061298a565b50505050565b6007546001600160a01b031633146112d25760405162461bcd60e51b815260040161093b90612836565b600f805460ff191660ff92909216919091179055565b60606112f5826000541190565b6113595760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161093b565b6000600d8054611368906127b3565b9050116113845760405180602001604052806000815250610838565b600d61138f83611ea5565b6040516020016113a09291906129f9565b60405160208183030381529060405292915050565b6007546001600160a01b031633146113df5760405162461bcd60e51b815260040161093b90612836565b600c55565b6007546001600160a01b0316331461140e5760405162461bcd60e51b815260040161093b90612836565b600f805460ff9092166101000261ff0019909216919091179055565b6007546001600160a01b031633146114545760405162461bcd60e51b815260040161093b90612836565b60005b828110156112a25761148f84848381811061147457611474612ab4565b905060200201602081019061148991906125bf565b83611d3a565b806114998161281b565b915050611457565b6007546001600160a01b031633146114cb5760405162461bcd60e51b815260040161093b90612836565b6001600160a01b0381166115305760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161093b565b610cca81611d54565b6007546001600160a01b031633146115635760405162461bcd60e51b815260040161093b90612836565b600955565b600f54600160ff90911610156115bc5760405162461bcd60e51b8152602060048201526019602482015278151a1a5cc81cd85b19481a185cc81b9bdd081cdd185c9d1959603a1b604482015260640161093b565b600b548360ff166115cb610a78565b6115d5919061286b565b11156115f35760405162461bcd60e51b815260040161093b90612883565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061166d83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050611fa3565b6116aa5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b604482015260640161093b565b33600090815260106020526040902054600160ff9091161080156116d65750600c546116d4610a78565b105b156117f557600b546116e6610a78565b6116f190600161286b565b111561170f5760405162461bcd60e51b815260040161093b90612883565b60018460ff1611156117a957600f54610100900460ff166117316001866128cc565b3360009081526010602052604090205461174e919060ff166128ef565b60ff16111561176f5760405162461bcd60e51b815260040161093b90612914565b61177a6001856128cc565b60ff1660095461178a919061293f565b3410156117a95760405162461bcd60e51b815260040161093b9061295e565b33600090815260106020526040812080548692906117cb90849060ff166128ef565b92506101000a81548160ff021916908360ff1602179055506117f0338560ff16611d3a565b6112a2565b600f543360009081526010602052604090205460ff61010090920482169161181f918791166128ef565b60ff1611156118405760405162461bcd60e51b815260040161093b90612914565b8360ff16600954611851919061293f565b3410156118705760405162461bcd60e51b815260040161093b9061295e565b336000908152601060205260408120805486929061189290849060ff166128ef565b92506101000a81548160ff021916908360ff1602179055506112a2338560ff16611d3a565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061191e82611c5a565b80519091506000906001600160a01b0316336001600160a01b0316148061195557503361194a846108d0565b6001600160a01b0316145b80611967575081516119679033610750565b9050806119d15760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161093b565b846001600160a01b031682600001516001600160a01b031614611a455760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161093b565b6001600160a01b038416611aa95760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161093b565b611ab960008484600001516118b7565b6001600160a01b03858116600090815260046020908152604080832080546fffffffffffffffffffffffffffffffff198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255825180840184529182524267ffffffffffffffff9081168386019081528a8752600390955292852091518254945196166001600160e01b031990941693909317600160a01b95909216949094021790925590611b7e90859061286b565b6000818152600360205260409020549091506001600160a01b0316611c1057611ba8816000541190565b15611c105760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611c79826000541190565b611cd85760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161093b565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611d27579392505050565b5080611d3281612aca565b915050611cda565b610d8d828260405180602001604052806000815250611fb9565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15611e9957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611dea903390899088908890600401612ae1565b6020604051808303816000875af1925050508015611e25575060408051601f3d908101601f19168201909252611e2291810190612b1e565b60015b611e7f573d808015611e53576040519150601f19603f3d011682016040523d82523d6000602084013e611e58565b606091505b508051611e775760405162461bcd60e51b815260040161093b9061298a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e9d565b5060015b949350505050565b606081611ec95750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ef35780611edd8161281b565b9150611eec9050600a83612b51565b9150611ecd565b60008167ffffffffffffffff811115611f0e57611f0e6124b9565b6040519080825280601f01601f191660200182016040528015611f38576020820181803683370190505b5090505b8415611e9d57611f4d600183612804565b9150611f5a600a86612b65565b611f6590603061286b565b60f81b818381518110611f7a57611f7a612ab4565b60200101906001600160f81b031916908160001a905350611f9c600a86612b51565b9450611f3c565b600082611fb08584612275565b14949350505050565b6000546001600160a01b03841661201c5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161093b565b612027816000541190565b156120745760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161093b565b600083116120d05760405162461bcd60e51b815260206004820152602360248201527f455243373231413a207175616e74697479206d7573742062652067726561746560448201526207220360ec1b606482015260840161093b565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b909104169181019190915281518083019092528051909190819061212c908790612b79565b6001600160801b0316815260200185836020015161214a9190612b79565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561226a5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461222e6000888488611da6565b61224a5760405162461bcd60e51b815260040161093b9061298a565b816122548161281b565b92505080806122629061281b565b9150506121e1565b506000819055611c52565b600081815b84518110156122e157600085828151811061229757612297612ab4565b602002602001015190508083116122bd57600083815260208290526040902092506122ce565b600081815260208490526040902092505b50806122d98161281b565b91505061227a565b509392505050565b8280546122f5906127b3565b90600052602060002090601f016020900481019282612317576000855561235d565b82601f1061233057805160ff191683800117855561235d565b8280016001018555821561235d579182015b8281111561235d578251825591602001919060010190612342565b50610d4c9291505b80821115610d4c5760008155600101612365565b6001600160e01b031981168114610cca57600080fd5b6000602082840312156123a157600080fd5b81356123ac81612379565b9392505050565b60005b838110156123ce5781810151838201526020016123b6565b838111156112a25750506000910152565b600081518084526123f78160208601602086016123b3565b601f01601f19169290920160200192915050565b6020815260006123ac60208301846123df565b60006020828403121561243057600080fd5b5035919050565b6001600160a01b0381168114610cca57600080fd5b6000806040838503121561245f57600080fd5b823561246a81612437565b946020939093013593505050565b60008060006060848603121561248d57600080fd5b833561249881612437565b925060208401356124a881612437565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156124ea576124ea6124b9565b604051601f8501601f19908116603f01168101908282118183101715612512576125126124b9565b8160405280935085815286868601111561252b57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561255757600080fd5b813567ffffffffffffffff81111561256e57600080fd5b8201601f8101841361257f57600080fd5b611e9d848235602084016124cf565b803560ff8116811461259f57600080fd5b919050565b6000602082840312156125b657600080fd5b6123ac8261258e565b6000602082840312156125d157600080fd5b81356123ac81612437565b600080604083850312156125ef57600080fd5b82356125fa81612437565b91506020830135801515811461260f57600080fd5b809150509250929050565b6000806000806080858703121561263057600080fd5b843561263b81612437565b9350602085013561264b81612437565b925060408501359150606085013567ffffffffffffffff81111561266e57600080fd5b8501601f8101871361267f57600080fd5b61268e878235602084016124cf565b91505092959194509250565b60008083601f8401126126ac57600080fd5b50813567ffffffffffffffff8111156126c457600080fd5b6020830191508360208260051b85010111156126df57600080fd5b9250929050565b6000806000604084860312156126fb57600080fd5b833567ffffffffffffffff81111561271257600080fd5b61271e8682870161269a565b909790965060209590950135949350505050565b6000806040838503121561274557600080fd5b823561275081612437565b9150602083013561260f81612437565b60008060006040848603121561277557600080fd5b61277e8461258e565b9250602084013567ffffffffffffffff81111561279a57600080fd5b6127a68682870161269a565b9497909650939450505050565b600181811c908216806127c757607f821691505b602082108114156127e857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612816576128166127ee565b500390565b600060001982141561282f5761282f6127ee565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561287e5761287e6127ee565b500190565b60208082526029908201527f596f752063616e2774206d696e74206d6f7265207468656e2074686520746f74604082015268616c20737570706c7960b81b606082015260800190565b600060ff821660ff8416808210156128e6576128e66127ee565b90039392505050565b600060ff821660ff84168060ff0382111561290c5761290c6127ee565b019392505050565b602080825260119082015270109d5e481b1a5b5a5d081c995858da1959607a1b604082015260600190565b6000816000190483118215151615612959576129596127ee565b500290565b602080825260129082015271496e73756666696369656e742066756e647360701b604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600081516129ef8185602086016123b3565b9290920192915050565b600080845481600182811c915080831680612a1557607f831692505b6020808410821415612a3557634e487b7160e01b86526022600452602486fd5b818015612a495760018114612a5a57612a87565b60ff19861689528489019650612a87565b60008b81526020902060005b86811015612a7f5781548b820152908501908301612a66565b505084890196505b505050505050612aab612a9a82866129dd565b64173539b7b760d91b815260050190565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b600081612ad957612ad96127ee565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b14908301846123df565b9695505050505050565b600060208284031215612b3057600080fd5b81516123ac81612379565b634e487b7160e01b600052601260045260246000fd5b600082612b6057612b60612b3b565b500490565b600082612b7457612b74612b3b565b500690565b60006001600160801b03808316818516808303821115612b9b57612b9b6127ee565b0194935050505056fea2646970667358221220c7860a4fea92bc34440d8ab18d1bcd2130890f3c8849105b38374b1580ae209764736f6c634300080c0033697066733a2f2f62616679626569627a6c6437703633757a61757575667779627a71757a646b78643679726a6662643767666d686e6578767566377679656a726f692f
Deployed Bytecode
0x6080604052600436106102665760003560e01c806370a0823111610144578063c03afb59116100b6578063dea96c981161007a578063dea96c98146106e5578063dfcf15b014610715578063e985e9c514610735578063f2fde38b1461077e578063f4a0a5281461079e578063fc0ab6e2146107be57600080fd5b8063c03afb5914610645578063c87b56dd14610665578063ce606ee014610685578063d7795b46146106a5578063dbdf2dc0146106c557600080fd5b806395d89b411161010857806395d89b4114610596578063a22cb465146105ab578063ad0b4cc3146105cb578063b14f2a39146105eb578063b1c9fe6e1461060b578063b88d4fde1461062557600080fd5b806370a082311461050f57806370db69d61461052f578063714c53981461054e578063715018a6146105635780638da5cb5b1461057857600080fd5b80633a467e3d116101dd57806355f804b3116101a157806355f804b3146104715780636352211e146104915780636817c76c146104b15780636bd08049146104c75780636ecd2306146104e75780636f9fb98a146104fa57600080fd5b80633a467e3d146103f35780633c4201d2146104095780633ccfd60b1461042957806342842e0e146104315780634f6ccce71461045157600080fd5b8063095ea7b31161022f578063095ea7b31461033457806318160ddd1461035657806322212e2b1461036b57806323b872dd146103815780632f745c59146103a15780633a3f716a146103c157600080fd5b80620e7fa81461026b57806301ffc9a714610294578063047fc9aa146102c457806306fdde03146102da578063081812fc146102fc575b600080fd5b34801561027757600080fd5b50610281600a5481565b6040519081526020015b60405180910390f35b3480156102a057600080fd5b506102b46102af36600461238f565b6107d1565b604051901515815260200161028b565b3480156102d057600080fd5b50610281600b5481565b3480156102e657600080fd5b506102ef61083e565b60405161028b919061240b565b34801561030857600080fd5b5061031c61031736600461241e565b6108d0565b6040516001600160a01b03909116815260200161028b565b34801561034057600080fd5b5061035461034f36600461244c565b610960565b005b34801561036257600080fd5b50610281610a78565b34801561037757600080fd5b50610281600e5481565b34801561038d57600080fd5b5061035461039c366004612478565b610a8e565b3480156103ad57600080fd5b506102816103bc36600461244c565b610a99565b3480156103cd57600080fd5b50600f546103e19062010000900460ff1681565b60405160ff909116815260200161028b565b3480156103ff57600080fd5b50610281600c5481565b34801561041557600080fd5b5061035461042436600461241e565b610c11565b610354610c40565b34801561043d57600080fd5b5061035461044c366004612478565b610ccd565b34801561045d57600080fd5b5061028161046c36600461241e565b610ce8565b34801561047d57600080fd5b5061035461048c366004612545565b610d50565b34801561049d57600080fd5b5061031c6104ac36600461241e565b610d91565b3480156104bd57600080fd5b5061028160095481565b3480156104d357600080fd5b506103546104e236600461241e565b610da3565b6103546104f53660046125a4565b610dd2565b34801561050657600080fd5b50610281610fff565b34801561051b57600080fd5b5061028161052a3660046125bf565b611031565b34801561053b57600080fd5b50600f546103e190610100900460ff1681565b34801561055a57600080fd5b506102ef6110c2565b34801561056f57600080fd5b506103546110d1565b34801561058457600080fd5b506007546001600160a01b031661031c565b3480156105a257600080fd5b506102ef611107565b3480156105b757600080fd5b506103546105c63660046125dc565b611116565b3480156105d757600080fd5b506103546105e63660046125a4565b6111db565b3480156105f757600080fd5b506103546106063660046125bf565b611223565b34801561061757600080fd5b50600f546103e19060ff1681565b34801561063157600080fd5b5061035461064036600461261a565b61126f565b34801561065157600080fd5b506103546106603660046125a4565b6112a8565b34801561067157600080fd5b506102ef61068036600461241e565b6112e8565b34801561069157600080fd5b5060085461031c906001600160a01b031681565b3480156106b157600080fd5b506103546106c036600461241e565b6113b5565b3480156106d157600080fd5b506103546106e03660046125a4565b6113e4565b3480156106f157600080fd5b506103e16107003660046125bf565b60106020526000908152604090205460ff1681565b34801561072157600080fd5b506103546107303660046126e6565b61142a565b34801561074157600080fd5b506102b4610750366004612732565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561078a57600080fd5b506103546107993660046125bf565b6114a1565b3480156107aa57600080fd5b506103546107b936600461241e565b611539565b6103546107cc366004612760565b611568565b60006001600160e01b031982166380ac58cd60e01b148061080257506001600160e01b03198216635b5e139f60e01b145b8061081d57506001600160e01b0319821663780e9d6360e01b145b8061083857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461084d906127b3565b80601f0160208091040260200160405190810160405280929190818152602001828054610879906127b3565b80156108c65780601f1061089b576101008083540402835291602001916108c6565b820191906000526020600020905b8154815290600101906020018083116108a957829003601f168201915b5050505050905090565b60006108dd826000541190565b6109445760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061096b82610d91565b9050806001600160a01b0316836001600160a01b031614156109da5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161093b565b336001600160a01b03821614806109f657506109f68133610750565b610a685760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161093b565b610a738383836118b7565b505050565b60006001600054610a899190612804565b905090565b610a73838383611913565b6000610aa483611031565b8210610afd5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161093b565b6000610b07610a78565b905060008060005b83811015610bb1576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610b6257805192505b876001600160a01b0316836001600160a01b03161415610b9e5786841415610b905750935061083892505050565b83610b9a8161281b565b9450505b5080610ba98161281b565b915050610b0f565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161093b565b6007546001600160a01b03163314610c3b5760405162461bcd60e51b815260040161093b90612836565b600e55565b6007546001600160a01b03163314610c6a5760405162461bcd60e51b815260040161093b90612836565b6008546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610cb7576040519150601f19603f3d011682016040523d82523d6000602084013e610cbc565b606091505b5050905080610cca57600080fd5b50565b610a738383836040518060200160405280600081525061126f565b6000610cf2610a78565b8210610d4c5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161093b565b5090565b6007546001600160a01b03163314610d7a5760405162461bcd60e51b815260040161093b90612836565b8051610d8d90600d9060208401906122e9565b5050565b6000610d9c82611c5a565b5192915050565b6007546001600160a01b03163314610dcd5760405162461bcd60e51b815260040161093b90612836565b600b55565b600f54600260ff9091161015610e265760405162461bcd60e51b8152602060048201526019602482015278151a1a5cc81cd85b19481a185cc81b9bdd081cdd185c9d1959603a1b604482015260640161093b565b600b548160ff16610e35610a78565b610e3f919061286b565b1115610e5d5760405162461bcd60e51b815260040161093b90612883565b33600090815260106020526040902054600160ff909116108015610e895750600c54610e87610a78565b105b15610fa357600b54610e99610a78565b610ea490600161286b565b1115610ec25760405162461bcd60e51b815260040161093b90612883565b60018160ff161115610f5c57600f54610100900460ff16610ee46001836128cc565b33600090815260106020526040902054610f01919060ff166128ef565b60ff161115610f225760405162461bcd60e51b815260040161093b90612914565b610f2d6001826128cc565b60ff16600954610f3d919061293f565b341015610f5c5760405162461bcd60e51b815260040161093b9061295e565b3360009081526010602052604081208054839290610f7e90849060ff166128ef565b92506101000a81548160ff021916908360ff160217905550610cca338260ff16611d3a565b600f543360009081526010602052604090205460ff610100909204821691610fcd918491166128ef565b60ff161115610fee5760405162461bcd60e51b815260040161093b90612914565b8060ff16600954610f3d919061293f565b6007546000906001600160a01b0316331461102c5760405162461bcd60e51b815260040161093b90612836565b504790565b60006001600160a01b03821661109d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161093b565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6060600d805461084d906127b3565b6007546001600160a01b031633146110fb5760405162461bcd60e51b815260040161093b90612836565b6111056000611d54565b565b60606002805461084d906127b3565b6001600160a01b03821633141561116f5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161093b565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146112055760405162461bcd60e51b815260040161093b90612836565b600f805460ff909216620100000262ff000019909216919091179055565b6007546001600160a01b0316331461124d5760405162461bcd60e51b815260040161093b90612836565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b61127a848484611913565b61128684848484611da6565b6112a25760405162461bcd60e51b815260040161093b9061298a565b50505050565b6007546001600160a01b031633146112d25760405162461bcd60e51b815260040161093b90612836565b600f805460ff191660ff92909216919091179055565b60606112f5826000541190565b6113595760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161093b565b6000600d8054611368906127b3565b9050116113845760405180602001604052806000815250610838565b600d61138f83611ea5565b6040516020016113a09291906129f9565b60405160208183030381529060405292915050565b6007546001600160a01b031633146113df5760405162461bcd60e51b815260040161093b90612836565b600c55565b6007546001600160a01b0316331461140e5760405162461bcd60e51b815260040161093b90612836565b600f805460ff9092166101000261ff0019909216919091179055565b6007546001600160a01b031633146114545760405162461bcd60e51b815260040161093b90612836565b60005b828110156112a25761148f84848381811061147457611474612ab4565b905060200201602081019061148991906125bf565b83611d3a565b806114998161281b565b915050611457565b6007546001600160a01b031633146114cb5760405162461bcd60e51b815260040161093b90612836565b6001600160a01b0381166115305760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161093b565b610cca81611d54565b6007546001600160a01b031633146115635760405162461bcd60e51b815260040161093b90612836565b600955565b600f54600160ff90911610156115bc5760405162461bcd60e51b8152602060048201526019602482015278151a1a5cc81cd85b19481a185cc81b9bdd081cdd185c9d1959603a1b604482015260640161093b565b600b548360ff166115cb610a78565b6115d5919061286b565b11156115f35760405162461bcd60e51b815260040161093b90612883565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061166d83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050611fa3565b6116aa5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b604482015260640161093b565b33600090815260106020526040902054600160ff9091161080156116d65750600c546116d4610a78565b105b156117f557600b546116e6610a78565b6116f190600161286b565b111561170f5760405162461bcd60e51b815260040161093b90612883565b60018460ff1611156117a957600f54610100900460ff166117316001866128cc565b3360009081526010602052604090205461174e919060ff166128ef565b60ff16111561176f5760405162461bcd60e51b815260040161093b90612914565b61177a6001856128cc565b60ff1660095461178a919061293f565b3410156117a95760405162461bcd60e51b815260040161093b9061295e565b33600090815260106020526040812080548692906117cb90849060ff166128ef565b92506101000a81548160ff021916908360ff1602179055506117f0338560ff16611d3a565b6112a2565b600f543360009081526010602052604090205460ff61010090920482169161181f918791166128ef565b60ff1611156118405760405162461bcd60e51b815260040161093b90612914565b8360ff16600954611851919061293f565b3410156118705760405162461bcd60e51b815260040161093b9061295e565b336000908152601060205260408120805486929061189290849060ff166128ef565b92506101000a81548160ff021916908360ff1602179055506112a2338560ff16611d3a565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061191e82611c5a565b80519091506000906001600160a01b0316336001600160a01b0316148061195557503361194a846108d0565b6001600160a01b0316145b80611967575081516119679033610750565b9050806119d15760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161093b565b846001600160a01b031682600001516001600160a01b031614611a455760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161093b565b6001600160a01b038416611aa95760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161093b565b611ab960008484600001516118b7565b6001600160a01b03858116600090815260046020908152604080832080546fffffffffffffffffffffffffffffffff198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255825180840184529182524267ffffffffffffffff9081168386019081528a8752600390955292852091518254945196166001600160e01b031990941693909317600160a01b95909216949094021790925590611b7e90859061286b565b6000818152600360205260409020549091506001600160a01b0316611c1057611ba8816000541190565b15611c105760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611c79826000541190565b611cd85760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161093b565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611d27579392505050565b5080611d3281612aca565b915050611cda565b610d8d828260405180602001604052806000815250611fb9565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15611e9957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611dea903390899088908890600401612ae1565b6020604051808303816000875af1925050508015611e25575060408051601f3d908101601f19168201909252611e2291810190612b1e565b60015b611e7f573d808015611e53576040519150601f19603f3d011682016040523d82523d6000602084013e611e58565b606091505b508051611e775760405162461bcd60e51b815260040161093b9061298a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e9d565b5060015b949350505050565b606081611ec95750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ef35780611edd8161281b565b9150611eec9050600a83612b51565b9150611ecd565b60008167ffffffffffffffff811115611f0e57611f0e6124b9565b6040519080825280601f01601f191660200182016040528015611f38576020820181803683370190505b5090505b8415611e9d57611f4d600183612804565b9150611f5a600a86612b65565b611f6590603061286b565b60f81b818381518110611f7a57611f7a612ab4565b60200101906001600160f81b031916908160001a905350611f9c600a86612b51565b9450611f3c565b600082611fb08584612275565b14949350505050565b6000546001600160a01b03841661201c5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161093b565b612027816000541190565b156120745760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161093b565b600083116120d05760405162461bcd60e51b815260206004820152602360248201527f455243373231413a207175616e74697479206d7573742062652067726561746560448201526207220360ec1b606482015260840161093b565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b909104169181019190915281518083019092528051909190819061212c908790612b79565b6001600160801b0316815260200185836020015161214a9190612b79565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561226a5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461222e6000888488611da6565b61224a5760405162461bcd60e51b815260040161093b9061298a565b816122548161281b565b92505080806122629061281b565b9150506121e1565b506000819055611c52565b600081815b84518110156122e157600085828151811061229757612297612ab4565b602002602001015190508083116122bd57600083815260208290526040902092506122ce565b600081815260208490526040902092505b50806122d98161281b565b91505061227a565b509392505050565b8280546122f5906127b3565b90600052602060002090601f016020900481019282612317576000855561235d565b82601f1061233057805160ff191683800117855561235d565b8280016001018555821561235d579182015b8281111561235d578251825591602001919060010190612342565b50610d4c9291505b80821115610d4c5760008155600101612365565b6001600160e01b031981168114610cca57600080fd5b6000602082840312156123a157600080fd5b81356123ac81612379565b9392505050565b60005b838110156123ce5781810151838201526020016123b6565b838111156112a25750506000910152565b600081518084526123f78160208601602086016123b3565b601f01601f19169290920160200192915050565b6020815260006123ac60208301846123df565b60006020828403121561243057600080fd5b5035919050565b6001600160a01b0381168114610cca57600080fd5b6000806040838503121561245f57600080fd5b823561246a81612437565b946020939093013593505050565b60008060006060848603121561248d57600080fd5b833561249881612437565b925060208401356124a881612437565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156124ea576124ea6124b9565b604051601f8501601f19908116603f01168101908282118183101715612512576125126124b9565b8160405280935085815286868601111561252b57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561255757600080fd5b813567ffffffffffffffff81111561256e57600080fd5b8201601f8101841361257f57600080fd5b611e9d848235602084016124cf565b803560ff8116811461259f57600080fd5b919050565b6000602082840312156125b657600080fd5b6123ac8261258e565b6000602082840312156125d157600080fd5b81356123ac81612437565b600080604083850312156125ef57600080fd5b82356125fa81612437565b91506020830135801515811461260f57600080fd5b809150509250929050565b6000806000806080858703121561263057600080fd5b843561263b81612437565b9350602085013561264b81612437565b925060408501359150606085013567ffffffffffffffff81111561266e57600080fd5b8501601f8101871361267f57600080fd5b61268e878235602084016124cf565b91505092959194509250565b60008083601f8401126126ac57600080fd5b50813567ffffffffffffffff8111156126c457600080fd5b6020830191508360208260051b85010111156126df57600080fd5b9250929050565b6000806000604084860312156126fb57600080fd5b833567ffffffffffffffff81111561271257600080fd5b61271e8682870161269a565b909790965060209590950135949350505050565b6000806040838503121561274557600080fd5b823561275081612437565b9150602083013561260f81612437565b60008060006040848603121561277557600080fd5b61277e8461258e565b9250602084013567ffffffffffffffff81111561279a57600080fd5b6127a68682870161269a565b9497909650939450505050565b600181811c908216806127c757607f821691505b602082108114156127e857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612816576128166127ee565b500390565b600060001982141561282f5761282f6127ee565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561287e5761287e6127ee565b500190565b60208082526029908201527f596f752063616e2774206d696e74206d6f7265207468656e2074686520746f74604082015268616c20737570706c7960b81b606082015260800190565b600060ff821660ff8416808210156128e6576128e66127ee565b90039392505050565b600060ff821660ff84168060ff0382111561290c5761290c6127ee565b019392505050565b602080825260119082015270109d5e481b1a5b5a5d081c995858da1959607a1b604082015260600190565b6000816000190483118215151615612959576129596127ee565b500290565b602080825260129082015271496e73756666696369656e742066756e647360701b604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600081516129ef8185602086016123b3565b9290920192915050565b600080845481600182811c915080831680612a1557607f831692505b6020808410821415612a3557634e487b7160e01b86526022600452602486fd5b818015612a495760018114612a5a57612a87565b60ff19861689528489019650612a87565b60008b81526020902060005b86811015612a7f5781548b820152908501908301612a66565b505084890196505b505050505050612aab612a9a82866129dd565b64173539b7b760d91b815260050190565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b600081612ad957612ad96127ee565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b14908301846123df565b9695505050505050565b600060208284031215612b3057600080fd5b81516123ac81612379565b634e487b7160e01b600052601260045260246000fd5b600082612b6057612b60612b3b565b500490565b600082612b7457612b74612b3b565b500690565b60006001600160801b03808316818516808303821115612b9b57612b9b6127ee565b0194935050505056fea2646970667358221220c7860a4fea92bc34440d8ab18d1bcd2130890f3c8849105b38374b1580ae209764736f6c634300080c0033
Deployed Bytecode Sourcemap
41404:4835:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41553:39;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;41553:39:0;;;;;;;;24333:372;;;;;;;;;;-1:-1:-1;24333:372:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;24333:372:0;582:187:1;41597:28:0;;;;;;;;;;;;;;;;25960:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27521:214::-;;;;;;;;;;-1:-1:-1;27521:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1896:32:1;;;1878:51;;1866:2;1851:18;27521:214:0;1732:203:1;27042:413:0;;;;;;;;;;-1:-1:-1;27042:413:0;;;;;:::i;:::-;;:::i;:::-;;22770:104;;;;;;;;;;;;;:::i;41770:32::-;;;;;;;;;;;;;;;;28397:162;;;;;;;;;;-1:-1:-1;28397:162:0;;;;;:::i;:::-;;:::i;23438:823::-;;;;;;;;;;-1:-1:-1;23438:823:0;;;;;:::i;:::-;;:::i;41862:30::-;;;;;;;;;;-1:-1:-1;41862:30:0;;;;;;;;;;;;;;3211:4:1;3199:17;;;3181:36;;3169:2;3154:18;41862:30:0;3039:184:1;41630:36:0;;;;;;;;;;;;;;;;45522:111;;;;;;;;;;-1:-1:-1;45522:111:0;;;;;:::i;:::-;;:::i;46081:153::-;;;:::i;28630:177::-;;;;;;;;;;-1:-1:-1;28630:177:0;;;;;:::i;:::-;;:::i;22951:187::-;;;;;;;;;;-1:-1:-1;22951:187:0;;;;;:::i;:::-;;:::i;45045:94::-;;;;;;;;;;-1:-1:-1;45045:94:0;;;;;:::i;:::-;;:::i;25769:124::-;;;;;;;;;;-1:-1:-1;25769:124:0;;;;;:::i;:::-;;:::i;41509:39::-;;;;;;;;;;;;;;;;45639:89;;;;;;;;;;-1:-1:-1;45639:89:0;;;;;:::i;:::-;;:::i;42545:1053::-;;;;;;:::i;:::-;;:::i;45845:114::-;;;;;;;;;;;;;:::i;24769:221::-;;;;;;;;;;-1:-1:-1;24769:221:0;;;;;:::i;:::-;;:::i;41834:23::-;;;;;;;;;;-1:-1:-1;41834:23:0;;;;;;;;;;;44854:85;;;;;;;;;;;;;:::i;38034:103::-;;;;;;;;;;;;;:::i;37383:87::-;;;;;;;;;;-1:-1:-1;37456:6:0;;-1:-1:-1;;;;;37456:6:0;37383:87;;26129:104;;;;;;;;;;;;;:::i;27807:288::-;;;;;;;;;;-1:-1:-1;27807:288:0;;;;;:::i;:::-;;:::i;45418:98::-;;;;;;;;;;-1:-1:-1;45418:98:0;;;;;:::i;:::-;;:::i;45965:110::-;;;;;;;;;;-1:-1:-1;45965:110:0;;;;;:::i;:::-;;:::i;41807:22::-;;;;;;;;;;-1:-1:-1;41807:22:0;;;;;;;;28878:355;;;;;;;;;;-1:-1:-1;28878:355:0;;;;;:::i;:::-;;:::i;45246:76::-;;;;;;;;;;-1:-1:-1;45246:76:0;;;;;:::i;:::-;;:::i;42051:288::-;;;;;;;;;;-1:-1:-1;42051:288:0;;;;;:::i;:::-;;:::i;41476:28::-;;;;;;;;;;-1:-1:-1;41476:28:0;;;;-1:-1:-1;;;;;41476:28:0;;;45734:105;;;;;;;;;;-1:-1:-1;45734:105:0;;;;;:::i;:::-;;:::i;45328:84::-;;;;;;;;;;-1:-1:-1;45328:84:0;;;;;:::i;:::-;;:::i;41899:44::-;;;;;;;;;;-1:-1:-1;41899:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42345:194;;;;;;;;;;-1:-1:-1;42345:194:0;;;;;:::i;:::-;;:::i;28166:164::-;;;;;;;;;;-1:-1:-1;28166:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;28287:25:0;;;28263:4;28287:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28166:164;38292:201;;;;;;;;;;-1:-1:-1;38292:201:0;;;;;:::i;:::-;;:::i;45145:95::-;;;;;;;;;;-1:-1:-1;45145:95:0;;;;;:::i;:::-;;:::i;43604:1244::-;;;;;;:::i;:::-;;:::i;24333:372::-;24435:4;-1:-1:-1;;;;;;24472:40:0;;-1:-1:-1;;;24472:40:0;;:105;;-1:-1:-1;;;;;;;24529:48:0;;-1:-1:-1;;;24529:48:0;24472:105;:172;;;-1:-1:-1;;;;;;;24594:50:0;;-1:-1:-1;;;24594:50:0;24472:172;:225;;;-1:-1:-1;;;;;;;;;;13230:40:0;;;24661:36;24452:245;24333:372;-1:-1:-1;;24333:372:0:o;25960:100::-;26014:13;26047:5;26040:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25960:100;:::o;27521:214::-;27589:7;27617:16;27625:7;29545:4;29579:12;-1:-1:-1;29569:22:0;29488:111;27617:16;27609:74;;;;-1:-1:-1;;;27609:74:0;;9093:2:1;27609:74:0;;;9075:21:1;9132:2;9112:18;;;9105:30;9171:34;9151:18;;;9144:62;-1:-1:-1;;;9222:18:1;;;9215:43;9275:19;;27609:74:0;;;;;;;;;-1:-1:-1;27703:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27703:24:0;;27521:214::o;27042:413::-;27115:13;27131:24;27147:7;27131:15;:24::i;:::-;27115:40;;27180:5;-1:-1:-1;;;;;27174:11:0;:2;-1:-1:-1;;;;;27174:11:0;;;27166:58;;;;-1:-1:-1;;;27166:58:0;;9507:2:1;27166:58:0;;;9489:21:1;9546:2;9526:18;;;9519:30;9585:34;9565:18;;;9558:62;-1:-1:-1;;;9636:18:1;;;9629:32;9678:19;;27166:58:0;9305:398:1;27166:58:0;20792:10;-1:-1:-1;;;;;27259:21:0;;;;:62;;-1:-1:-1;27284:37:0;27301:5;20792:10;28166:164;:::i;27284:37::-;27237:169;;;;-1:-1:-1;;;27237:169:0;;9910:2:1;27237:169:0;;;9892:21:1;9949:2;9929:18;;;9922:30;9988:34;9968:18;;;9961:62;10059:27;10039:18;;;10032:55;10104:19;;27237:169:0;9708:421:1;27237:169:0;27419:28;27428:2;27432:7;27441:5;27419:8;:28::i;:::-;27104:351;27042:413;;:::o;22770:104::-;22823:7;22865:1;22850:12;;:16;;;;:::i;:::-;22843:23;;22770:104;:::o;28397:162::-;28523:28;28533:4;28539:2;28543:7;28523:9;:28::i;23438:823::-;23527:7;23563:16;23573:5;23563:9;:16::i;:::-;23555:5;:24;23547:71;;;;-1:-1:-1;;;23547:71:0;;10598:2:1;23547:71:0;;;10580:21:1;10637:2;10617:18;;;10610:30;10676:34;10656:18;;;10649:62;-1:-1:-1;;;10727:18:1;;;10720:32;10769:19;;23547:71:0;10396:398:1;23547:71:0;23629:22;23654:13;:11;:13::i;:::-;23629:38;;23678:19;23712:25;23766:9;23761:426;23785:14;23781:1;:18;23761:426;;;23821:31;23855:14;;;:11;:14;;;;;;;;;23821:48;;;;;;;;;-1:-1:-1;;;;;23821:48:0;;;;;-1:-1:-1;;;23821:48:0;;;;;;;;;;;;23888:28;23884:103;;23957:14;;;-1:-1:-1;23884:103:0;24026:5;-1:-1:-1;;;;;24005:26:0;:17;-1:-1:-1;;;;;24005:26:0;;24001:175;;;24071:5;24056:11;:20;24052:77;;;-1:-1:-1;24108:1:0;-1:-1:-1;24101:8:0;;-1:-1:-1;;;24101:8:0;24052:77;24147:13;;;;:::i;:::-;;;;24001:175;-1:-1:-1;23801:3:0;;;;:::i;:::-;;;;23761:426;;;-1:-1:-1;24197:56:0;;-1:-1:-1;;;24197:56:0;;11141:2:1;24197:56:0;;;11123:21:1;11180:2;11160:18;;;11153:30;11219:34;11199:18;;;11192:62;-1:-1:-1;;;11270:18:1;;;11263:44;11324:19;;24197:56:0;10939:410:1;45522:111:0;37456:6;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;45598:17:::1;:29:::0;45522:111::o;46081:153::-;37456:6;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;46157:13:::1;::::0;46149:61:::1;::::0;46136:7:::1;::::0;-1:-1:-1;;;;;46157:13:0::1;::::0;46184:21:::1;::::0;46136:7;46149:61;46136:7;46149:61;46184:21;46157:13;46149:61:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46135:75;;;46225:2;46217:11;;;::::0;::::1;;46128:106;46081:153::o:0;28630:177::-;28760:39;28777:4;28783:2;28787:7;28760:39;;;;;;;;;;;;:16;:39::i;22951:187::-;23018:7;23054:13;:11;:13::i;:::-;23046:5;:21;23038:69;;;;-1:-1:-1;;;23038:69:0;;12127:2:1;23038:69:0;;;12109:21:1;12166:2;12146:18;;;12139:30;12205:34;12185:18;;;12178:62;-1:-1:-1;;;12256:18:1;;;12249:33;12299:19;;23038:69:0;11925:399:1;23038:69:0;-1:-1:-1;23125:5:0;22951:187::o;45045:94::-;37456:6;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;45115:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;45045:94:::0;:::o;25769:124::-;25833:7;25860:20;25872:7;25860:11;:20::i;:::-;:25;;25769:124;-1:-1:-1;;25769:124:0:o;45639:89::-;37456:6;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;45706:6:::1;:16:::0;45639:89::o;42545:1053::-;42610:5;;42619:1;42610:5;;;;:10;;42602:48;;;;-1:-1:-1;;;42602:48:0;;12531:2:1;42602:48:0;;;12513:21:1;12570:2;12550:18;;;12543:30;-1:-1:-1;;;12589:18:1;;;12582:55;12654:18;;42602:48:0;12329:349:1;42602:48:0;42696:6;;42681:11;42665:27;;:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:37;;42657:91;;;;-1:-1:-1;;;42657:91:0;;;;;;;:::i;:::-;42771:10;42760:22;;;;:10;:22;;;;;;42785:1;42760:22;;;;:26;:60;;;;;42806:14;;42790:13;:11;:13::i;:::-;:30;42760:60;42757:830;;;42862:6;;42841:13;:11;:13::i;:::-;:17;;42857:1;42841:17;:::i;:::-;:27;;42833:81;;;;-1:-1:-1;;;42833:81:0;;;;;;;:::i;:::-;42944:1;42930:11;:15;;;42927:220;;;43016:6;;;;;;;42996:15;43016:6;42996:11;:15;:::i;:::-;42981:10;42970:22;;;;:10;:22;;;;;;:42;;;:22;;:42;:::i;:::-;:52;;;;42962:82;;;;-1:-1:-1;;;42962:82:0;;;;;;;:::i;:::-;43093:15;43107:1;43093:11;:15;:::i;:::-;43080:29;;:9;;:29;;;;:::i;:::-;43067:9;:42;;43059:73;;;;-1:-1:-1;;;43059:73:0;;;;;;;:::i;:::-;43205:10;43194:22;;;;:10;:22;;;;;:37;;43220:11;;43194:22;:37;;43220:11;;43194:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;43242:34;43252:10;43264:11;43242:34;;:9;:34::i;42757:830::-;43378:6;;43349:10;43338:22;;;;:10;:22;;;;;;43378:6;;;;;;;;43338:36;;43363:11;;43338:22;:36;:::i;:::-;:46;;;;43330:76;;;;-1:-1:-1;;;43330:76:0;;;;;;;:::i;:::-;43450:11;43438:23;;:9;;:23;;;;:::i;45845:114::-;37456:6;;45909:7;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;-1:-1:-1;45932:21:0::1;45845:114:::0;:::o;24769:221::-;24833:7;-1:-1:-1;;;;;24861:19:0;;24853:75;;;;-1:-1:-1;;;24853:75:0;;14703:2:1;24853:75:0;;;14685:21:1;14742:2;14722:18;;;14715:30;14781:34;14761:18;;;14754:62;-1:-1:-1;;;14832:18:1;;;14825:41;14883:19;;24853:75:0;14501:407:1;24853:75:0;-1:-1:-1;;;;;;24954:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;24954:27:0;;24769:221::o;44854:85::-;44897:13;44926:7;44919:14;;;;;:::i;38034:103::-;37456:6;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;38099:30:::1;38126:1;38099:18;:30::i;:::-;38034:103::o:0;26129:104::-;26185:13;26218:7;26211:14;;;;;:::i;27807:288::-;-1:-1:-1;;;;;27902:24:0;;20792:10;27902:24;;27894:63;;;;-1:-1:-1;;;27894:63:0;;15115:2:1;27894:63:0;;;15097:21:1;15154:2;15134:18;;;15127:30;15193:28;15173:18;;;15166:56;15239:18;;27894:63:0;14913:350:1;27894:63:0;20792:10;27970:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27970:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27970:53:0;;;;;;;;;;28039:48;;722:41:1;;;27970:42:0;;20792:10;28039:48;;695:18:1;28039:48:0;;;;;;;27807:288;;:::o;45418:98::-;37456:6;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;45487:13:::1;:23:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;45487:23:0;;::::1;::::0;;;::::1;::::0;;45418:98::o;45965:110::-;37456:6;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;46043:13:::1;:26:::0;;-1:-1:-1;;;;;;46043:26:0::1;-1:-1:-1::0;;;;;46043:26:0;;;::::1;::::0;;;::::1;::::0;;45965:110::o;28878:355::-;29037:28;29047:4;29053:2;29057:7;29037:9;:28::i;:::-;29098:48;29121:4;29127:2;29131:7;29140:5;29098:22;:48::i;:::-;29076:149;;;;-1:-1:-1;;;29076:149:0;;;;;;;:::i;:::-;28878:355;;;;:::o;45246:76::-;37456:6;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;45302:5:::1;:14:::0;;-1:-1:-1;;45302:14:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;45246:76::o;42051:288::-;42124:13;42154:16;42162:7;29545:4;29579:12;-1:-1:-1;29569:22:0;29488:111;42154:16;42146:76;;;;-1:-1:-1;;;42146:76:0;;15890:2:1;42146:76:0;;;15872:21:1;15929:2;15909:18;;;15902:30;15968:34;15948:18;;;15941:62;-1:-1:-1;;;16019:18:1;;;16012:45;16074:19;;42146:76:0;15688:411:1;42146:76:0;42262:1;42244:7;42238:21;;;;;:::i;:::-;;;:25;:95;;;;;;;;;;;;;;;;;42290:7;42299:18;:7;:16;:18::i;:::-;42273:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42231:102;42051:288;-1:-1:-1;;42051:288:0:o;45734:105::-;37456:6;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;45809:14:::1;:24:::0;45734:105::o;45328:84::-;37456:6;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;45390:6:::1;:16:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;45390:16:0;;::::1;::::0;;;::::1;::::0;;45328:84::o;42345:194::-;37456:6;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;42447:6:::1;42442:92;42457:19:::0;;::::1;42442:92;;;42492:34;42502:10;;42513:1;42502:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;42517:8;42492:9;:34::i;:::-;42478:3:::0;::::1;::::0;::::1;:::i;:::-;;;;42442:92;;38292:201:::0;37456:6;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38381:22:0;::::1;38373:73;;;::::0;-1:-1:-1;;;38373:73:0;;18178:2:1;38373:73:0::1;::::0;::::1;18160:21:1::0;18217:2;18197:18;;;18190:30;18256:34;18236:18;;;18229:62;-1:-1:-1;;;18307:18:1;;;18300:36;18353:19;;38373:73:0::1;17976:402:1::0;38373:73:0::1;38457:28;38476:8;38457:18;:28::i;45145:95::-:0;37456:6;;-1:-1:-1;;;;;37456:6:0;20792:10;37603:23;37595:68;;;;-1:-1:-1;;;37595:68:0;;;;;;;:::i;:::-;45213:9:::1;:21:::0;45145:95::o;43604:1244::-;43704:5;;43713:1;43704:5;;;;:10;;43696:48;;;;-1:-1:-1;;;43696:48:0;;12531:2:1;43696:48:0;;;12513:21:1;12570:2;12550:18;;;12543:30;-1:-1:-1;;;12589:18:1;;;12582:55;12654:18;;43696:48:0;12329:349:1;43696:48:0;43790:6;;43775:11;43759:27;;:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:37;;43751:91;;;;-1:-1:-1;;;43751:91:0;;;;;;;:::i;:::-;43876:28;;-1:-1:-1;;43893:10:0;18532:2:1;18528:15;18524:53;43876:28:0;;;18512:66:1;43851:12:0;;18594::1;;43876:28:0;;;;;;;;;;;;43866:39;;;;;;43851:54;;43920:57;43939:12;;43920:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43953:17:0;;;-1:-1:-1;43972:4:0;;-1:-1:-1;43920:18:0;:57::i;:::-;43912:84;;;;-1:-1:-1;;;43912:84:0;;18819:2:1;43912:84:0;;;18801:21:1;18858:2;18838:18;;;18831:30;-1:-1:-1;;;18877:18:1;;;18870:44;18931:18;;43912:84:0;18617:338:1;43912:84:0;44019:10;44008:22;;;;:10;:22;;;;;;44033:1;44008:22;;;;:26;:60;;;;;44054:14;;44038:13;:11;:13::i;:::-;:30;44008:60;44005:832;;;44110:6;;44089:13;:11;:13::i;:::-;:17;;44105:1;44089:17;:::i;:::-;:27;;44081:81;;;;-1:-1:-1;;;44081:81:0;;;;;;;:::i;:::-;44192:1;44178:11;:15;;;44175:220;;;44264:6;;;;;;;44244:15;44264:6;44244:11;:15;:::i;:::-;44229:10;44218:22;;;;:10;:22;;;;;;:42;;;:22;;:42;:::i;:::-;:52;;;;44210:82;;;;-1:-1:-1;;;44210:82:0;;;;;;;:::i;:::-;44341:15;44355:1;44341:11;:15;:::i;:::-;44328:29;;:9;;:29;;;;:::i;:::-;44315:9;:42;;44307:73;;;;-1:-1:-1;;;44307:73:0;;;;;;;:::i;:::-;44455:10;44444:22;;;;:10;:22;;;;;:37;;44470:11;;44444:22;:37;;44470:11;;44444:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44492:34;44502:10;44514:11;44492:34;;:9;:34::i;:::-;44005:832;;;44628:6;;44599:10;44588:22;;;;:10;:22;;;;;;44628:6;;;;;;;;44588:36;;44613:11;;44588:22;:36;:::i;:::-;:46;;;;44580:76;;;;-1:-1:-1;;;44580:76:0;;;;;;;:::i;:::-;44700:11;44688:23;;:9;;:23;;;;:::i;:::-;44675:9;:36;;44667:67;;;;-1:-1:-1;;;44667:67:0;;;;;;;:::i;:::-;44758:10;44747:22;;;;:10;:22;;;;;:37;;44773:11;;44747:22;:37;;44773:11;;44747:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44795:34;44805:10;44817:11;44795:34;;:9;:34::i;33532:196::-;33647:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;33647:29:0;-1:-1:-1;;;;;33647:29:0;;;;;;;;;33692:28;;33647:24;;33692:28;;;;;;;33532:196;;;:::o;31631:1783::-;31746:35;31784:20;31796:7;31784:11;:20::i;:::-;31859:18;;31746:58;;-1:-1:-1;31817:22:0;;-1:-1:-1;;;;;31843:34:0;20792:10;-1:-1:-1;;;;;31843:34:0;;:87;;;-1:-1:-1;20792:10:0;31894:20;31906:7;31894:11;:20::i;:::-;-1:-1:-1;;;;;31894:36:0;;31843:87;:154;;;-1:-1:-1;31964:18:0;;31947:50;;20792:10;28166:164;:::i;31947:50::-;31817:181;;32019:17;32011:80;;;;-1:-1:-1;;;32011:80:0;;19162:2:1;32011:80:0;;;19144:21:1;19201:2;19181:18;;;19174:30;19240:34;19220:18;;;19213:62;-1:-1:-1;;;19291:18:1;;;19284:48;19349:19;;32011:80:0;18960:414:1;32011:80:0;32134:4;-1:-1:-1;;;;;32112:26:0;:13;:18;;;-1:-1:-1;;;;;32112:26:0;;32104:77;;;;-1:-1:-1;;;32104:77:0;;19581:2:1;32104:77:0;;;19563:21:1;19620:2;19600:18;;;19593:30;19659:34;19639:18;;;19632:62;-1:-1:-1;;;19710:18:1;;;19703:36;19756:19;;32104:77:0;19379:402:1;32104:77:0;-1:-1:-1;;;;;32200:16:0;;32192:66;;;;-1:-1:-1;;;32192:66:0;;19988:2:1;32192:66:0;;;19970:21:1;20027:2;20007:18;;;20000:30;20066:34;20046:18;;;20039:62;-1:-1:-1;;;20117:18:1;;;20110:35;20162:19;;32192:66:0;19786:401:1;32192:66:0;32379:49;32396:1;32400:7;32409:13;:18;;;32379:8;:49::i;:::-;-1:-1:-1;;;;;32633:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;32633:31:0;;;-1:-1:-1;;;;;32633:31:0;;;-1:-1:-1;;32633:31:0;;;;;;;32679:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;32679:29:0;;;;;;;;;;;;;32755:43;;;;;;;;;;32781:15;32755:43;;;;;;;;;;32732:20;;;:11;:20;;;;;;:66;;;;;;;;-1:-1:-1;;;;;;32732:66:0;;;;;;;-1:-1:-1;;;32732:66:0;;;;;;;;;;;;32633:18;33060:11;;32732:20;;33060:11;:::i;:::-;33127:1;33086:24;;;:11;:24;;;;;:29;33038:33;;-1:-1:-1;;;;;;33086:29:0;33082:227;;33150:20;33158:11;29545:4;29579:12;-1:-1:-1;29569:22:0;29488:111;33150:20;33146:152;;;33218:64;;;;;;;;33233:18;;-1:-1:-1;;;;;33218:64:0;;;;;;33253:28;;;;33218:64;;;;;;;;;;-1:-1:-1;33191:24:0;;;:11;:24;;;;;;;:91;;;;;;;;;-1:-1:-1;;;33191:91:0;-1:-1:-1;;;;;;33191:91:0;;;;;;;;;;;;33146:152;33345:7;33341:2;-1:-1:-1;;;;;33326:27:0;33335:4;-1:-1:-1;;;;;33326:27:0;;;;;;;;;;;33364:42;31735:1679;;;31631:1783;;;:::o;25235:472::-;-1:-1:-1;;;;;;;;;;;;;;;;;25338:16:0;25346:7;29545:4;29579:12;-1:-1:-1;29569:22:0;29488:111;25338:16;25330:71;;;;-1:-1:-1;;;25330:71:0;;20394:2:1;25330:71:0;;;20376:21:1;20433:2;20413:18;;;20406:30;20472:34;20452:18;;;20445:62;-1:-1:-1;;;20523:18:1;;;20516:40;20573:19;;25330:71:0;20192:406:1;25330:71:0;25434:7;25414:216;25468:31;25502:17;;;:11;:17;;;;;;;;;25468:51;;;;;;;;;-1:-1:-1;;;;;25468:51:0;;;;;-1:-1:-1;;;25468:51:0;;;;;;;;;;;;25538:28;25534:85;;25594:9;25235:472;-1:-1:-1;;;25235:472:0:o;25534:85::-;-1:-1:-1;25445:6:0;;;;:::i;:::-;;;;25414:216;;29607:104;29676:27;29686:2;29690:8;29676:27;;;;;;;;;;;;:9;:27::i;38653:191::-;38746:6;;;-1:-1:-1;;;;;38763:17:0;;;-1:-1:-1;;;;;;38763:17:0;;;;;;;38796:40;;38746:6;;;38763:17;38746:6;;38796:40;;38727:16;;38796:40;38716:128;38653:191;:::o;34293:804::-;34448:4;-1:-1:-1;;;;;34469:13:0;;3300:20;3348:8;34465:625;;34505:72;;-1:-1:-1;;;34505:72:0;;-1:-1:-1;;;;;34505:36:0;;;;;:72;;20792:10;;34556:4;;34562:7;;34571:5;;34505:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34505:72:0;;;;;;;;-1:-1:-1;;34505:72:0;;;;;;;;;;;;:::i;:::-;;;34501:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34751:13:0;;34747:273;;34794:61;;-1:-1:-1;;;34794:61:0;;;;;;;:::i;34747:273::-;34970:6;34964:13;34955:6;34951:2;34947:15;34940:38;34501:534;-1:-1:-1;;;;;;34628:55:0;-1:-1:-1;;;34628:55:0;;-1:-1:-1;34621:62:0;;34465:625;-1:-1:-1;35074:4:0;34465:625;34293:804;;;;;;:::o;398:723::-;454:13;675:10;671:53;;-1:-1:-1;;702:10:0;;;;;;;;;;;;-1:-1:-1;;;702:10:0;;;;;398:723::o;671:53::-;749:5;734:12;790:78;797:9;;790:78;;823:8;;;;:::i;:::-;;-1:-1:-1;846:10:0;;-1:-1:-1;854:2:0;846:10;;:::i;:::-;;;790:78;;;878:19;910:6;900:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;900:17:0;;878:39;;928:154;935:10;;928:154;;962:11;972:1;962:11;;:::i;:::-;;-1:-1:-1;1031:10:0;1039:2;1031:5;:10;:::i;:::-;1018:24;;:2;:24;:::i;:::-;1005:39;;988:6;995;988:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;988:56:0;;;;;;;;-1:-1:-1;1059:11:0;1068:2;1059:11;;:::i;:::-;;;928:154;;39910:190;40035:4;40088;40059:25;40072:5;40079:4;40059:12;:25::i;:::-;:33;;39910:190;-1:-1:-1;;;;39910:190:0:o;29988:1389::-;30111:20;30134:12;-1:-1:-1;;;;;30165:16:0;;30157:62;;;;-1:-1:-1;;;30157:62:0;;22495:2:1;30157:62:0;;;22477:21:1;22534:2;22514:18;;;22507:30;22573:34;22553:18;;;22546:62;-1:-1:-1;;;22624:18:1;;;22617:31;22665:19;;30157:62:0;22293:397:1;30157:62:0;30364:21;30372:12;29545:4;29579:12;-1:-1:-1;29569:22:0;29488:111;30364:21;30363:22;30355:64;;;;-1:-1:-1;;;30355:64:0;;22897:2:1;30355:64:0;;;22879:21:1;22936:2;22916:18;;;22909:30;22975:31;22955:18;;;22948:59;23024:18;;30355:64:0;22695:353:1;30355:64:0;30449:1;30438:8;:12;30430:60;;;;-1:-1:-1;;;30430:60:0;;23255:2:1;30430:60:0;;;23237:21:1;23294:2;23274:18;;;23267:30;23333:34;23313:18;;;23306:62;-1:-1:-1;;;23384:18:1;;;23377:33;23427:19;;30430:60:0;23053:399:1;30430:60:0;-1:-1:-1;;;;;30610:16:0;;30577:30;30610:16;;;:12;:16;;;;;;;;;30577:49;;;;;;;;;-1:-1:-1;;;;;30577:49:0;;;;;-1:-1:-1;;;30577:49:0;;;;;;;;;;;30656:135;;;;;;;;30682:19;;30577:49;;30656:135;;;30682:39;;30712:8;;30682:39;:::i;:::-;-1:-1:-1;;;;;30656:135:0;;;;;30771:8;30736:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;30656:135:0;;;;;;-1:-1:-1;;;;;30637:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;30637:154:0;;;;;;;;;;;;30830:43;;;;;;;;;;;30856:15;30830:43;;;;;;;;30802:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;30802:71:0;-1:-1:-1;;;;;;30802:71:0;;;;;;;;;;;;;;;;;;30814:12;;30934:325;30958:8;30954:1;:12;30934:325;;;30993:38;;31018:12;;-1:-1:-1;;;;;30993:38:0;;;31010:1;;30993:38;;31010:1;;30993:38;31072:59;31103:1;31107:2;31111:12;31125:5;31072:22;:59::i;:::-;31046:172;;;;-1:-1:-1;;;31046:172:0;;;;;;;:::i;:::-;31233:14;;;;:::i;:::-;;;;30968:3;;;;;:::i;:::-;;;;30934:325;;;-1:-1:-1;31271:12:0;:27;;;31309:60;28878:355;40461:675;40544:7;40587:4;40544:7;40602:497;40626:5;:12;40622:1;:16;40602:497;;;40660:20;40683:5;40689:1;40683:8;;;;;;;;:::i;:::-;;;;;;;40660:31;;40726:12;40710;:28;40706:382;;41212:13;41262:15;;;41298:4;41291:15;;;41345:4;41329:21;;40838:57;;40706:382;;;41212:13;41262:15;;;41298:4;41291:15;;;41345:4;41329:21;;41015:57;;40706:382;-1:-1:-1;40640:3:0;;;;:::i;:::-;;;;40602:497;;;-1:-1:-1;41116:12:0;40461:675;-1:-1:-1;;;40461:675:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:131:1;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;:::-;566:5;332:245;-1:-1:-1;;;332:245:1:o;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:269::-;1090:3;1128:5;1122:12;1155:6;1150:3;1143:19;1171:63;1227:6;1220:4;1215:3;1211:14;1204:4;1197:5;1193:16;1171:63;:::i;:::-;1288:2;1267:15;-1:-1:-1;;1263:29:1;1254:39;;;;1295:4;1250:50;;1037:269;-1:-1:-1;;1037:269:1:o;1311:231::-;1460:2;1449:9;1442:21;1423:4;1480:56;1532:2;1521:9;1517:18;1509:6;1480:56;:::i;1547:180::-;1606:6;1659:2;1647:9;1638:7;1634:23;1630:32;1627:52;;;1675:1;1672;1665:12;1627:52;-1:-1:-1;1698:23:1;;1547:180;-1:-1:-1;1547:180:1:o;1940:131::-;-1:-1:-1;;;;;2015:31:1;;2005:42;;1995:70;;2061:1;2058;2051:12;2076:315;2144:6;2152;2205:2;2193:9;2184:7;2180:23;2176:32;2173:52;;;2221:1;2218;2211:12;2173:52;2260:9;2247:23;2279:31;2304:5;2279:31;:::i;:::-;2329:5;2381:2;2366:18;;;;2353:32;;-1:-1:-1;;;2076:315:1:o;2578:456::-;2655:6;2663;2671;2724:2;2712:9;2703:7;2699:23;2695:32;2692:52;;;2740:1;2737;2730:12;2692:52;2779:9;2766:23;2798:31;2823:5;2798:31;:::i;:::-;2848:5;-1:-1:-1;2905:2:1;2890:18;;2877:32;2918:33;2877:32;2918:33;:::i;:::-;2578:456;;2970:7;;-1:-1:-1;;;3024:2:1;3009:18;;;;2996:32;;2578:456::o;3413:127::-;3474:10;3469:3;3465:20;3462:1;3455:31;3505:4;3502:1;3495:15;3529:4;3526:1;3519:15;3545:632;3610:5;3640:18;3681:2;3673:6;3670:14;3667:40;;;3687:18;;:::i;:::-;3762:2;3756:9;3730:2;3816:15;;-1:-1:-1;;3812:24:1;;;3838:2;3808:33;3804:42;3792:55;;;3862:18;;;3882:22;;;3859:46;3856:72;;;3908:18;;:::i;:::-;3948:10;3944:2;3937:22;3977:6;3968:15;;4007:6;3999;3992:22;4047:3;4038:6;4033:3;4029:16;4026:25;4023:45;;;4064:1;4061;4054:12;4023:45;4114:6;4109:3;4102:4;4094:6;4090:17;4077:44;4169:1;4162:4;4153:6;4145;4141:19;4137:30;4130:41;;;;3545:632;;;;;:::o;4182:451::-;4251:6;4304:2;4292:9;4283:7;4279:23;4275:32;4272:52;;;4320:1;4317;4310:12;4272:52;4360:9;4347:23;4393:18;4385:6;4382:30;4379:50;;;4425:1;4422;4415:12;4379:50;4448:22;;4501:4;4493:13;;4489:27;-1:-1:-1;4479:55:1;;4530:1;4527;4520:12;4479:55;4553:74;4619:7;4614:2;4601:16;4596:2;4592;4588:11;4553:74;:::i;4638:156::-;4704:20;;4764:4;4753:16;;4743:27;;4733:55;;4784:1;4781;4774:12;4733:55;4638:156;;;:::o;4799:182::-;4856:6;4909:2;4897:9;4888:7;4884:23;4880:32;4877:52;;;4925:1;4922;4915:12;4877:52;4948:27;4965:9;4948:27;:::i;4986:247::-;5045:6;5098:2;5086:9;5077:7;5073:23;5069:32;5066:52;;;5114:1;5111;5104:12;5066:52;5153:9;5140:23;5172:31;5197:5;5172:31;:::i;5238:416::-;5303:6;5311;5364:2;5352:9;5343:7;5339:23;5335:32;5332:52;;;5380:1;5377;5370:12;5332:52;5419:9;5406:23;5438:31;5463:5;5438:31;:::i;:::-;5488:5;-1:-1:-1;5545:2:1;5530:18;;5517:32;5587:15;;5580:23;5568:36;;5558:64;;5618:1;5615;5608:12;5558:64;5641:7;5631:17;;;5238:416;;;;;:::o;5919:795::-;6014:6;6022;6030;6038;6091:3;6079:9;6070:7;6066:23;6062:33;6059:53;;;6108:1;6105;6098:12;6059:53;6147:9;6134:23;6166:31;6191:5;6166:31;:::i;:::-;6216:5;-1:-1:-1;6273:2:1;6258:18;;6245:32;6286:33;6245:32;6286:33;:::i;:::-;6338:7;-1:-1:-1;6392:2:1;6377:18;;6364:32;;-1:-1:-1;6447:2:1;6432:18;;6419:32;6474:18;6463:30;;6460:50;;;6506:1;6503;6496:12;6460:50;6529:22;;6582:4;6574:13;;6570:27;-1:-1:-1;6560:55:1;;6611:1;6608;6601:12;6560:55;6634:74;6700:7;6695:2;6682:16;6677:2;6673;6669:11;6634:74;:::i;:::-;6624:84;;;5919:795;;;;;;;:::o;6719:367::-;6782:8;6792:6;6846:3;6839:4;6831:6;6827:17;6823:27;6813:55;;6864:1;6861;6854:12;6813:55;-1:-1:-1;6887:20:1;;6930:18;6919:30;;6916:50;;;6962:1;6959;6952:12;6916:50;6999:4;6991:6;6987:17;6975:29;;7059:3;7052:4;7042:6;7039:1;7035:14;7027:6;7023:27;7019:38;7016:47;7013:67;;;7076:1;7073;7066:12;7013:67;6719:367;;;;;:::o;7091:505::-;7186:6;7194;7202;7255:2;7243:9;7234:7;7230:23;7226:32;7223:52;;;7271:1;7268;7261:12;7223:52;7311:9;7298:23;7344:18;7336:6;7333:30;7330:50;;;7376:1;7373;7366:12;7330:50;7415:70;7477:7;7468:6;7457:9;7453:22;7415:70;:::i;:::-;7504:8;;7389:96;;-1:-1:-1;7586:2:1;7571:18;;;;7558:32;;7091:505;-1:-1:-1;;;;7091:505:1:o;7601:388::-;7669:6;7677;7730:2;7718:9;7709:7;7705:23;7701:32;7698:52;;;7746:1;7743;7736:12;7698:52;7785:9;7772:23;7804:31;7829:5;7804:31;:::i;:::-;7854:5;-1:-1:-1;7911:2:1;7896:18;;7883:32;7924:33;7883:32;7924:33;:::i;7994:507::-;8087:6;8095;8103;8156:2;8144:9;8135:7;8131:23;8127:32;8124:52;;;8172:1;8169;8162:12;8124:52;8195:27;8212:9;8195:27;:::i;:::-;8185:37;;8273:2;8262:9;8258:18;8245:32;8300:18;8292:6;8289:30;8286:50;;;8332:1;8329;8322:12;8286:50;8371:70;8433:7;8424:6;8413:9;8409:22;8371:70;:::i;:::-;7994:507;;8460:8;;-1:-1:-1;8345:96:1;;-1:-1:-1;;;;7994:507:1:o;8506:380::-;8585:1;8581:12;;;;8628;;;8649:61;;8703:4;8695:6;8691:17;8681:27;;8649:61;8756:2;8748:6;8745:14;8725:18;8722:38;8719:161;;;8802:10;8797:3;8793:20;8790:1;8783:31;8837:4;8834:1;8827:15;8865:4;8862:1;8855:15;8719:161;;8506:380;;;:::o;10134:127::-;10195:10;10190:3;10186:20;10183:1;10176:31;10226:4;10223:1;10216:15;10250:4;10247:1;10240:15;10266:125;10306:4;10334:1;10331;10328:8;10325:34;;;10339:18;;:::i;:::-;-1:-1:-1;10376:9:1;;10266:125::o;10799:135::-;10838:3;-1:-1:-1;;10859:17:1;;10856:43;;;10879:18;;:::i;:::-;-1:-1:-1;10926:1:1;10915:13;;10799:135::o;11354:356::-;11556:2;11538:21;;;11575:18;;;11568:30;11634:34;11629:2;11614:18;;11607:62;11701:2;11686:18;;11354:356::o;12683:128::-;12723:3;12754:1;12750:6;12747:1;12744:13;12741:39;;;12760:18;;:::i;:::-;-1:-1:-1;12796:9:1;;12683:128::o;12816:405::-;13018:2;13000:21;;;13057:2;13037:18;;;13030:30;13096:34;13091:2;13076:18;;13069:62;-1:-1:-1;;;13162:2:1;13147:18;;13140:39;13211:3;13196:19;;12816:405::o;13226:195::-;13264:4;13301;13298:1;13294:12;13333:4;13330:1;13326:12;13358:3;13353;13350:12;13347:38;;;13365:18;;:::i;:::-;13402:13;;;13226:195;-1:-1:-1;;;13226:195:1:o;13426:204::-;13464:3;13500:4;13497:1;13493:12;13532:4;13529:1;13525:12;13567:3;13561:4;13557:14;13552:3;13549:23;13546:49;;;13575:18;;:::i;:::-;13611:13;;13426:204;-1:-1:-1;;;13426:204:1:o;13635:341::-;13837:2;13819:21;;;13876:2;13856:18;;;13849:30;-1:-1:-1;;;13910:2:1;13895:18;;13888:47;13967:2;13952:18;;13635:341::o;13981:168::-;14021:7;14087:1;14083;14079:6;14075:14;14072:1;14069:21;14064:1;14057:9;14050:17;14046:45;14043:71;;;14094:18;;:::i;:::-;-1:-1:-1;14134:9:1;;13981:168::o;14154:342::-;14356:2;14338:21;;;14395:2;14375:18;;;14368:30;-1:-1:-1;;;14429:2:1;14414:18;;14407:48;14487:2;14472:18;;14154:342::o;15268:415::-;15470:2;15452:21;;;15509:2;15489:18;;;15482:30;15548:34;15543:2;15528:18;;15521:62;-1:-1:-1;;;15614:2:1;15599:18;;15592:49;15673:3;15658:19;;15268:415::o;16230:185::-;16272:3;16310:5;16304:12;16325:52;16370:6;16365:3;16358:4;16351:5;16347:16;16325:52;:::i;:::-;16393:16;;;;;16230:185;-1:-1:-1;;16230:185:1:o;16538:1301::-;16815:3;16844:1;16877:6;16871:13;16907:3;16929:1;16957:9;16953:2;16949:18;16939:28;;17017:2;17006:9;17002:18;17039;17029:61;;17083:4;17075:6;17071:17;17061:27;;17029:61;17109:2;17157;17149:6;17146:14;17126:18;17123:38;17120:165;;;-1:-1:-1;;;17184:33:1;;17240:4;17237:1;17230:15;17270:4;17191:3;17258:17;17120:165;17301:18;17328:104;;;;17446:1;17441:320;;;;17294:467;;17328:104;-1:-1:-1;;17361:24:1;;17349:37;;17406:16;;;;-1:-1:-1;17328:104:1;;17441:320;16177:1;16170:14;;;16214:4;16201:18;;17536:1;17550:165;17564:6;17561:1;17558:13;17550:165;;;17642:14;;17629:11;;;17622:35;17685:16;;;;17579:10;;17550:165;;;17554:3;;17744:6;17739:3;17735:16;17728:23;;17294:467;;;;;;;17777:56;17802:30;17828:3;17820:6;17802:30;:::i;:::-;-1:-1:-1;;;16480:20:1;;16525:1;16516:11;;16420:113;17777:56;17770:63;16538:1301;-1:-1:-1;;;;;16538:1301:1:o;17844:127::-;17905:10;17900:3;17896:20;17893:1;17886:31;17936:4;17933:1;17926:15;17960:4;17957:1;17950:15;20603:136;20642:3;20670:5;20660:39;;20679:18;;:::i;:::-;-1:-1:-1;;;20715:18:1;;20603:136::o;21160:500::-;-1:-1:-1;;;;;21429:15:1;;;21411:34;;21481:15;;21476:2;21461:18;;21454:43;21528:2;21513:18;;21506:34;;;21576:3;21571:2;21556:18;;21549:31;;;21354:4;;21597:57;;21634:19;;21626:6;21597:57;:::i;:::-;21589:65;21160:500;-1:-1:-1;;;;;;21160:500:1:o;21665:249::-;21734:6;21787:2;21775:9;21766:7;21762:23;21758:32;21755:52;;;21803:1;21800;21793:12;21755:52;21835:9;21829:16;21854:30;21878:5;21854:30;:::i;21919:127::-;21980:10;21975:3;21971:20;21968:1;21961:31;22011:4;22008:1;22001:15;22035:4;22032:1;22025:15;22051:120;22091:1;22117;22107:35;;22122:18;;:::i;:::-;-1:-1:-1;22156:9:1;;22051:120::o;22176:112::-;22208:1;22234;22224:35;;22239:18;;:::i;:::-;-1:-1:-1;22273:9:1;;22176:112::o;23457:253::-;23497:3;-1:-1:-1;;;;;23586:2:1;23583:1;23579:10;23616:2;23613:1;23609:10;23647:3;23643:2;23639:12;23634:3;23631:21;23628:47;;;23655:18;;:::i;:::-;23691:13;;23457:253;-1:-1:-1;;;;23457:253:1:o
Swarm Source
ipfs://c7860a4fea92bc34440d8ab18d1bcd2130890f3c8849105b38374b1580ae2097
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.