ERC-721
NFT
Overview
Max Total Supply
4,000 BATW
Holders
1,380
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 BATWLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BoredApeTravelWorld
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "./ERC721Enumerable.sol"; import "./Ownable.sol"; contract BoredApeTravelWorld is ERC721Enumerable, Ownable { using Strings for uint256; string public baseURI = "ipfs://QmRrXBSb76QAP8phAoiCyfzAtyHbEVxkJj5kbhnxszyqCq/"; string public baseExtension = ".json"; uint256 public cost = 0 ether; uint256 public maxSupply = 4000; uint256 public maxMintAmount = 2; bool public isMintActive = false; mapping(address => bool) public whitelisted; mapping(address => uint) public minted; constructor() ERC721("Bored Ape Travel World", "BATW") {} // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } // public function mint(uint256 _mintAmount) public payable { uint256 supply = totalSupply(); require(isMintActive, "BATW: Minting needs to be enabled."); require(_mintAmount > 0); require(supply + _mintAmount <= maxSupply, "BATW: Mint/order exceeds supply"); require(_mintAmount + minted[msg.sender] <= maxMintAmount, "BATW: mintAmount must be less than or equal maxMintAmount"); minted[msg.sender] += _mintAmount; for (uint256 i = 1; i <= _mintAmount; i++) { _safeMint(msg.sender, supply + i); } } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } //only owner function airdrop(uint[] calldata amount, address[] calldata recipient) public onlyOwner { require(amount.length == recipient.length, "BATW: Must provide equal amounts and recipients"); uint totalAmount; uint supply = totalSupply(); for(uint i; i < amount.length; i++) { totalAmount += amount[i]; } require(supply + totalAmount < maxSupply, "BATW: Mint/order exceeds supply"); for(uint i; i < recipient.length; i++) { for(uint j = 1; j <= amount[i]; j++) { _safeMint(recipient[i], supply + j); } } } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function setMaxSupply(uint256 _newSupply) public onlyOwner { maxSupply = _newSupply; } function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { maxMintAmount = _newmaxMintAmount; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function setMintingActive(bool _state) public onlyOwner { require(isMintActive != _state, "BATW: New value matches old"); isMintActive = _state; } function whitelistUser(address _user) public onlyOwner { whitelisted[_user] = true; } function removeWhitelistUser(address _user) public onlyOwner { whitelisted[_user] = false; } function withdraw() public payable onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // 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; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @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 || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @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) { _requireMinted(tokenId); 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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_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 virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @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. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: 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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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 ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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`. * * 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; /** * @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 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
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":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","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":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeWhitelistUser","outputs":[],"stateMutability":"nonpayable","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setMintingActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"whitelistUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60e0604052603660808181529062002ebd60a039600b9062000022908262000208565b50604080518082019091526005815264173539b7b760d91b6020820152600c906200004e908262000208565b506000600d55610fa0600e556002600f556010805460ff191690553480156200007657600080fd5b506040518060400160405280601681526020017f426f726564204170652054726176656c20576f726c6400000000000000000000815250604051806040016040528060048152602001634241545760e01b8152508160009081620000db919062000208565b506001620000ea828262000208565b50505062000107620001016200010d60201b60201c565b62000111565b620002d4565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200018e57607f821691505b602082108103620001af57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200020357600081815260208120601f850160051c81016020861015620001de5750805b601f850160051c820191505b81811015620001ff57828155600101620001ea565b5050505b505050565b81516001600160401b0381111562000224576200022462000163565b6200023c8162000235845462000179565b84620001b5565b602080601f8311600181146200027457600084156200025b5750858301515b600019600386901b1c1916600185901b178555620001ff565b600085815260208120601f198616915b82811015620002a55788860151825594840194600190910190840162000284565b5085821015620002c45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612bd980620002e46000396000f3fe6080604052600436106102a05760003560e01c80636352211e1161016e578063a22cb465116100cb578063d5abeb011161007f578063da3ef23f11610064578063da3ef23f1461070c578063e985e9c51461072c578063f2fde38b1461077557600080fd5b8063d5abeb01146106c6578063d936547e146106dc57600080fd5b8063c6682862116100b0578063c668286214610671578063c87b56dd14610686578063d04ef285146106a657600080fd5b8063a22cb46514610631578063b88d4fde1461065157600080fd5b8063715018a6116101225780638da5cb5b116101075780638da5cb5b146105eb57806395d89b4114610609578063a0712d681461061e57600080fd5b8063715018a6146105b65780637f00c7a6146105cb57600080fd5b80636c0360eb116101535780636c0360eb146105615780636f8b44b01461057657806370a082311461059657600080fd5b80636352211e146105215780636673c4c21461054157600080fd5b80632f745c591161021c57806344a0d68a116101d05780634f6ccce7116101b55780634f6ccce7146104c757806355f804b3146104e75780635b92ac0d1461050757600080fd5b806344a0d68a146104875780634a4c560d146104a757600080fd5b80633ccfd60b116102015780633ccfd60b1461043257806342842e0e1461043a578063438b63001461045a57600080fd5b80632f745c59146103f257806330cc7ae01461041257600080fd5b806313faede6116102735780631e7269c5116102585780631e7269c51461038f578063239c70ae146103bc57806323b872dd146103d257600080fd5b806313faede61461035657806318160ddd1461037a57600080fd5b806301ffc9a7146102a557806306fdde03146102da578063081812fc146102fc578063095ea7b314610334575b600080fd5b3480156102b157600080fd5b506102c56102c036600461233c565b610795565b60405190151581526020015b60405180910390f35b3480156102e657600080fd5b506102ef6107f1565b6040516102d191906123cf565b34801561030857600080fd5b5061031c6103173660046123e2565b610883565b6040516001600160a01b0390911681526020016102d1565b34801561034057600080fd5b5061035461034f366004612417565b6108aa565b005b34801561036257600080fd5b5061036c600d5481565b6040519081526020016102d1565b34801561038657600080fd5b5060085461036c565b34801561039b57600080fd5b5061036c6103aa366004612441565b60126020526000908152604090205481565b3480156103c857600080fd5b5061036c600f5481565b3480156103de57600080fd5b506103546103ed36600461245c565b6109e0565b3480156103fe57600080fd5b5061036c61040d366004612417565b610a67565b34801561041e57600080fd5b5061035461042d366004612441565b610b0f565b610354610b38565b34801561044657600080fd5b5061035461045536600461245c565b610bb4565b34801561046657600080fd5b5061047a610475366004612441565b610bcf565b6040516102d19190612498565b34801561049357600080fd5b506103546104a23660046123e2565b610c71565b3480156104b357600080fd5b506103546104c2366004612441565b610c7e565b3480156104d357600080fd5b5061036c6104e23660046123e2565b610caa565b3480156104f357600080fd5b5061035461050236600461259f565b610d4e565b34801561051357600080fd5b506010546102c59060ff1681565b34801561052d57600080fd5b5061031c61053c3660046123e2565b610d66565b34801561054d57600080fd5b5061035461055c366004612634565b610dcb565b34801561056d57600080fd5b506102ef610f88565b34801561058257600080fd5b506103546105913660046123e2565b611016565b3480156105a257600080fd5b5061036c6105b1366004612441565b611023565b3480156105c257600080fd5b506103546110bd565b3480156105d757600080fd5b506103546105e63660046123e2565b6110d1565b3480156105f757600080fd5b50600a546001600160a01b031661031c565b34801561061557600080fd5b506102ef6110de565b61035461062c3660046123e2565b6110ed565b34801561063d57600080fd5b5061035461064c3660046126b0565b6112bb565b34801561065d57600080fd5b5061035461066c3660046126e3565b6112c6565b34801561067d57600080fd5b506102ef611354565b34801561069257600080fd5b506102ef6106a13660046123e2565b611361565b3480156106b257600080fd5b506103546106c136600461275f565b61144d565b3480156106d257600080fd5b5061036c600e5481565b3480156106e857600080fd5b506102c56106f7366004612441565b60116020526000908152604090205460ff1681565b34801561071857600080fd5b5061035461072736600461259f565b6114c2565b34801561073857600080fd5b506102c561074736600461277a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561078157600080fd5b50610354610790366004612441565b6114d6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806107eb57506107eb82611563565b92915050565b606060008054610800906127a4565b80601f016020809104026020016040519081016040528092919081815260200182805461082c906127a4565b80156108795780601f1061084e57610100808354040283529160200191610879565b820191906000526020600020905b81548152906001019060200180831161085c57829003601f168201915b5050505050905090565b600061088e82611646565b506000908152600460205260409020546001600160a01b031690565b60006108b582610d66565b9050806001600160a01b0316836001600160a01b0316036109435760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b038216148061095f575061095f8133610747565b6109d15760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161093a565b6109db83836116aa565b505050565b6109ea3382611730565b610a5c5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161093a565b6109db8383836117af565b6000610a7283611023565b8210610ae65760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161093a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610b1761199f565b6001600160a01b03166000908152601160205260409020805460ff19169055565b610b4061199f565b6000610b54600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610b9e576040519150601f19603f3d011682016040523d82523d6000602084013e610ba3565b606091505b5050905080610bb157600080fd5b50565b6109db838383604051806020016040528060008152506112c6565b60606000610bdc83611023565b905060008167ffffffffffffffff811115610bf957610bf96124dc565b604051908082528060200260200182016040528015610c22578160200160208202803683370190505b50905060005b82811015610c6957610c3a8582610a67565b828281518110610c4c57610c4c6127f7565b602090810291909101015280610c6181612855565b915050610c28565b509392505050565b610c7961199f565b600d55565b610c8661199f565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b6000610cb560085490565b8210610d295760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161093a565b60088281548110610d3c57610d3c6127f7565b90600052602060002001549050919050565b610d5661199f565b600b610d6282826128db565b5050565b6000818152600260205260408120546001600160a01b0316806107eb5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161093a565b610dd361199f565b828114610e485760405162461bcd60e51b815260206004820152602f60248201527f424154573a204d7573742070726f7669646520657175616c20616d6f756e747360448201527f20616e6420726563697069656e74730000000000000000000000000000000000606482015260840161093a565b600080610e5460085490565b905060005b85811015610e9957868682818110610e7357610e736127f7565b9050602002013583610e8591906129f5565b925080610e9181612855565b915050610e59565b50600e54610ea783836129f5565b10610ef45760405162461bcd60e51b815260206004820152601f60248201527f424154573a204d696e742f6f72646572206578636565647320737570706c7900604482015260640161093a565b60005b83811015610f7f5760015b878783818110610f1457610f146127f7565b905060200201358111610f6c57610f5a868684818110610f3657610f366127f7565b9050602002016020810190610f4b9190612441565b610f5583866129f5565b6119f9565b80610f6481612855565b915050610f02565b5080610f7781612855565b915050610ef7565b50505050505050565b600b8054610f95906127a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc1906127a4565b801561100e5780601f10610fe35761010080835404028352916020019161100e565b820191906000526020600020905b815481529060010190602001808311610ff157829003601f168201915b505050505081565b61101e61199f565b600e55565b60006001600160a01b0382166110a15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e65720000000000000000000000000000000000000000000000606482015260840161093a565b506001600160a01b031660009081526003602052604090205490565b6110c561199f565b6110cf6000611a13565b565b6110d961199f565b600f55565b606060018054610800906127a4565b60006110f860085490565b60105490915060ff166111735760405162461bcd60e51b815260206004820152602260248201527f424154573a204d696e74696e67206e6565647320746f20626520656e61626c6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161093a565b6000821161118057600080fd5b600e5461118d83836129f5565b11156111db5760405162461bcd60e51b815260206004820152601f60248201527f424154573a204d696e742f6f72646572206578636565647320737570706c7900604482015260640161093a565b600f54336000908152601260205260409020546111f890846129f5565b111561126c5760405162461bcd60e51b815260206004820152603960248201527f424154573a206d696e74416d6f756e74206d757374206265206c65737320746860448201527f616e206f7220657175616c206d61784d696e74416d6f756e7400000000000000606482015260840161093a565b336000908152601260205260408120805484929061128b9084906129f5565b90915550600190505b8281116109db576112a933610f5583856129f5565b806112b381612855565b915050611294565b610d62338383611a7d565b6112d03383611730565b6113425760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161093a565b61134e84848484611b4b565b50505050565b600c8054610f95906127a4565b6000818152600260205260409020546060906001600160a01b03166113ee5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161093a565b60006113f8611bd4565b905060008151116114185760405180602001604052806000815250611446565b8061142284611be3565b600c60405160200161143693929190612a0d565b6040516020818303038152906040525b9392505050565b61145561199f565b60105481151560ff9091161515036114af5760405162461bcd60e51b815260206004820152601b60248201527f424154573a204e65772076616c7565206d617463686573206f6c640000000000604482015260640161093a565b6010805460ff1916911515919091179055565b6114ca61199f565b600c610d6282826128db565b6114de61199f565b6001600160a01b03811661155a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161093a565b610bb181611a13565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806115f657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107eb57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107eb565b6000818152600260205260409020546001600160a01b0316610bb15760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161093a565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906116f782610d66565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061173c83610d66565b9050806001600160a01b0316846001600160a01b0316148061178357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806117a75750836001600160a01b031661179c84610883565b6001600160a01b0316145b949350505050565b826001600160a01b03166117c282610d66565b6001600160a01b03161461183e5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161093a565b6001600160a01b0382166118b95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161093a565b6118c4838383611d18565b6118cf6000826116aa565b6001600160a01b03831660009081526003602052604081208054600192906118f8908490612aad565b90915550506001600160a01b03821660009081526003602052604081208054600192906119269084906129f5565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b031633146110cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161093a565b610d62828260405180602001604052806000815250611dd0565b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611ade5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161093a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611b568484846117af565b611b6284848484611e59565b61134e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161093a565b6060600b8054610800906127a4565b606081600003611c2657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611c505780611c3a81612855565b9150611c499050600a83612af3565b9150611c2a565b60008167ffffffffffffffff811115611c6b57611c6b6124dc565b6040519080825280601f01601f191660200182016040528015611c95576020820181803683370190505b5090505b84156117a757611caa600183612aad565b9150611cb7600a86612b07565b611cc29060306129f5565b60f81b818381518110611cd757611cd76127f7565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d11600a86612af3565b9450611c99565b6001600160a01b038316611d7357611d6e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611d96565b816001600160a01b0316836001600160a01b031614611d9657611d968382612018565b6001600160a01b038216611dad576109db816120b5565b826001600160a01b0316826001600160a01b0316146109db576109db8282612164565b611dda83836121a8565b611de76000848484611e59565b6109db5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161093a565b60006001600160a01b0384163b1561200d576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290611eb6903390899088908890600401612b1b565b6020604051808303816000875af1925050508015611f0f575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f0c91810190612b57565b60015b611fc2573d808015611f3d576040519150601f19603f3d011682016040523d82523d6000602084013e611f42565b606091505b508051600003611fba5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161093a565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506117a7565b506001949350505050565b6000600161202584611023565b61202f9190612aad565b600083815260076020526040902054909150808214612082576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906120c790600190612aad565b600083815260096020526040812054600880549394509092849081106120ef576120ef6127f7565b906000526020600020015490508060088381548110612110576121106127f7565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061214857612148612b74565b6001900381819060005260206000200160009055905550505050565b600061216f83611023565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166121fe5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161093a565b6000818152600260205260409020546001600160a01b0316156122635760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161093a565b61226f60008383611d18565b6001600160a01b03821660009081526003602052604081208054600192906122989084906129f5565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610bb157600080fd5b60006020828403121561234e57600080fd5b81356114468161230e565b60005b8381101561237457818101518382015260200161235c565b8381111561134e5750506000910152565b6000815180845261239d816020860160208601612359565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006114466020830184612385565b6000602082840312156123f457600080fd5b5035919050565b80356001600160a01b038116811461241257600080fd5b919050565b6000806040838503121561242a57600080fd5b612433836123fb565b946020939093013593505050565b60006020828403121561245357600080fd5b611446826123fb565b60008060006060848603121561247157600080fd5b61247a846123fb565b9250612488602085016123fb565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b818110156124d0578351835292840192918401916001016124b4565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115612526576125266124dc565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561256c5761256c6124dc565b8160405280935085815286868601111561258557600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156125b157600080fd5b813567ffffffffffffffff8111156125c857600080fd5b8201601f810184136125d957600080fd5b6117a78482356020840161250b565b60008083601f8401126125fa57600080fd5b50813567ffffffffffffffff81111561261257600080fd5b6020830191508360208260051b850101111561262d57600080fd5b9250929050565b6000806000806040858703121561264a57600080fd5b843567ffffffffffffffff8082111561266257600080fd5b61266e888389016125e8565b9096509450602087013591508082111561268757600080fd5b50612694878288016125e8565b95989497509550505050565b8035801515811461241257600080fd5b600080604083850312156126c357600080fd5b6126cc836123fb565b91506126da602084016126a0565b90509250929050565b600080600080608085870312156126f957600080fd5b612702856123fb565b9350612710602086016123fb565b925060408501359150606085013567ffffffffffffffff81111561273357600080fd5b8501601f8101871361274457600080fd5b6127538782356020840161250b565b91505092959194509250565b60006020828403121561277157600080fd5b611446826126a0565b6000806040838503121561278d57600080fd5b612796836123fb565b91506126da602084016123fb565b600181811c908216806127b857607f821691505b6020821081036127f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361288657612886612826565b5060010190565b601f8211156109db57600081815260208120601f850160051c810160208610156128b45750805b601f850160051c820191505b818110156128d3578281556001016128c0565b505050505050565b815167ffffffffffffffff8111156128f5576128f56124dc565b6129098161290384546127a4565b8461288d565b602080601f83116001811461295c57600084156129265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556128d3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156129a95788860151825594840194600190910190840161298a565b50858210156129e557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008219821115612a0857612a08612826565b500190565b600084516020612a208285838a01612359565b855191840191612a338184848a01612359565b8554920191600090612a44816127a4565b60018281168015612a5c5760018114612a7157612a9d565b60ff1984168752821515830287019450612a9d565b896000528560002060005b84811015612a9557815489820152908301908701612a7c565b505082870194505b50929a9950505050505050505050565b600082821015612abf57612abf612826565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612b0257612b02612ac4565b500490565b600082612b1657612b16612ac4565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612b4d6080830184612385565b9695505050505050565b600060208284031215612b6957600080fd5b81516114468161230e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220ff6fd3eae86249fedf9b31c5b3551319344080b6454dd1e5bbf4de8bc736079e64736f6c634300080f0033697066733a2f2f516d5272584253623736514150387068416f694379667a41747948624556786b4a6a356b62686e78737a797143712f
Deployed Bytecode
0x6080604052600436106102a05760003560e01c80636352211e1161016e578063a22cb465116100cb578063d5abeb011161007f578063da3ef23f11610064578063da3ef23f1461070c578063e985e9c51461072c578063f2fde38b1461077557600080fd5b8063d5abeb01146106c6578063d936547e146106dc57600080fd5b8063c6682862116100b0578063c668286214610671578063c87b56dd14610686578063d04ef285146106a657600080fd5b8063a22cb46514610631578063b88d4fde1461065157600080fd5b8063715018a6116101225780638da5cb5b116101075780638da5cb5b146105eb57806395d89b4114610609578063a0712d681461061e57600080fd5b8063715018a6146105b65780637f00c7a6146105cb57600080fd5b80636c0360eb116101535780636c0360eb146105615780636f8b44b01461057657806370a082311461059657600080fd5b80636352211e146105215780636673c4c21461054157600080fd5b80632f745c591161021c57806344a0d68a116101d05780634f6ccce7116101b55780634f6ccce7146104c757806355f804b3146104e75780635b92ac0d1461050757600080fd5b806344a0d68a146104875780634a4c560d146104a757600080fd5b80633ccfd60b116102015780633ccfd60b1461043257806342842e0e1461043a578063438b63001461045a57600080fd5b80632f745c59146103f257806330cc7ae01461041257600080fd5b806313faede6116102735780631e7269c5116102585780631e7269c51461038f578063239c70ae146103bc57806323b872dd146103d257600080fd5b806313faede61461035657806318160ddd1461037a57600080fd5b806301ffc9a7146102a557806306fdde03146102da578063081812fc146102fc578063095ea7b314610334575b600080fd5b3480156102b157600080fd5b506102c56102c036600461233c565b610795565b60405190151581526020015b60405180910390f35b3480156102e657600080fd5b506102ef6107f1565b6040516102d191906123cf565b34801561030857600080fd5b5061031c6103173660046123e2565b610883565b6040516001600160a01b0390911681526020016102d1565b34801561034057600080fd5b5061035461034f366004612417565b6108aa565b005b34801561036257600080fd5b5061036c600d5481565b6040519081526020016102d1565b34801561038657600080fd5b5060085461036c565b34801561039b57600080fd5b5061036c6103aa366004612441565b60126020526000908152604090205481565b3480156103c857600080fd5b5061036c600f5481565b3480156103de57600080fd5b506103546103ed36600461245c565b6109e0565b3480156103fe57600080fd5b5061036c61040d366004612417565b610a67565b34801561041e57600080fd5b5061035461042d366004612441565b610b0f565b610354610b38565b34801561044657600080fd5b5061035461045536600461245c565b610bb4565b34801561046657600080fd5b5061047a610475366004612441565b610bcf565b6040516102d19190612498565b34801561049357600080fd5b506103546104a23660046123e2565b610c71565b3480156104b357600080fd5b506103546104c2366004612441565b610c7e565b3480156104d357600080fd5b5061036c6104e23660046123e2565b610caa565b3480156104f357600080fd5b5061035461050236600461259f565b610d4e565b34801561051357600080fd5b506010546102c59060ff1681565b34801561052d57600080fd5b5061031c61053c3660046123e2565b610d66565b34801561054d57600080fd5b5061035461055c366004612634565b610dcb565b34801561056d57600080fd5b506102ef610f88565b34801561058257600080fd5b506103546105913660046123e2565b611016565b3480156105a257600080fd5b5061036c6105b1366004612441565b611023565b3480156105c257600080fd5b506103546110bd565b3480156105d757600080fd5b506103546105e63660046123e2565b6110d1565b3480156105f757600080fd5b50600a546001600160a01b031661031c565b34801561061557600080fd5b506102ef6110de565b61035461062c3660046123e2565b6110ed565b34801561063d57600080fd5b5061035461064c3660046126b0565b6112bb565b34801561065d57600080fd5b5061035461066c3660046126e3565b6112c6565b34801561067d57600080fd5b506102ef611354565b34801561069257600080fd5b506102ef6106a13660046123e2565b611361565b3480156106b257600080fd5b506103546106c136600461275f565b61144d565b3480156106d257600080fd5b5061036c600e5481565b3480156106e857600080fd5b506102c56106f7366004612441565b60116020526000908152604090205460ff1681565b34801561071857600080fd5b5061035461072736600461259f565b6114c2565b34801561073857600080fd5b506102c561074736600461277a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561078157600080fd5b50610354610790366004612441565b6114d6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806107eb57506107eb82611563565b92915050565b606060008054610800906127a4565b80601f016020809104026020016040519081016040528092919081815260200182805461082c906127a4565b80156108795780601f1061084e57610100808354040283529160200191610879565b820191906000526020600020905b81548152906001019060200180831161085c57829003601f168201915b5050505050905090565b600061088e82611646565b506000908152600460205260409020546001600160a01b031690565b60006108b582610d66565b9050806001600160a01b0316836001600160a01b0316036109435760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b038216148061095f575061095f8133610747565b6109d15760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161093a565b6109db83836116aa565b505050565b6109ea3382611730565b610a5c5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161093a565b6109db8383836117af565b6000610a7283611023565b8210610ae65760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161093a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610b1761199f565b6001600160a01b03166000908152601160205260409020805460ff19169055565b610b4061199f565b6000610b54600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610b9e576040519150601f19603f3d011682016040523d82523d6000602084013e610ba3565b606091505b5050905080610bb157600080fd5b50565b6109db838383604051806020016040528060008152506112c6565b60606000610bdc83611023565b905060008167ffffffffffffffff811115610bf957610bf96124dc565b604051908082528060200260200182016040528015610c22578160200160208202803683370190505b50905060005b82811015610c6957610c3a8582610a67565b828281518110610c4c57610c4c6127f7565b602090810291909101015280610c6181612855565b915050610c28565b509392505050565b610c7961199f565b600d55565b610c8661199f565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b6000610cb560085490565b8210610d295760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161093a565b60088281548110610d3c57610d3c6127f7565b90600052602060002001549050919050565b610d5661199f565b600b610d6282826128db565b5050565b6000818152600260205260408120546001600160a01b0316806107eb5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161093a565b610dd361199f565b828114610e485760405162461bcd60e51b815260206004820152602f60248201527f424154573a204d7573742070726f7669646520657175616c20616d6f756e747360448201527f20616e6420726563697069656e74730000000000000000000000000000000000606482015260840161093a565b600080610e5460085490565b905060005b85811015610e9957868682818110610e7357610e736127f7565b9050602002013583610e8591906129f5565b925080610e9181612855565b915050610e59565b50600e54610ea783836129f5565b10610ef45760405162461bcd60e51b815260206004820152601f60248201527f424154573a204d696e742f6f72646572206578636565647320737570706c7900604482015260640161093a565b60005b83811015610f7f5760015b878783818110610f1457610f146127f7565b905060200201358111610f6c57610f5a868684818110610f3657610f366127f7565b9050602002016020810190610f4b9190612441565b610f5583866129f5565b6119f9565b80610f6481612855565b915050610f02565b5080610f7781612855565b915050610ef7565b50505050505050565b600b8054610f95906127a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc1906127a4565b801561100e5780601f10610fe35761010080835404028352916020019161100e565b820191906000526020600020905b815481529060010190602001808311610ff157829003601f168201915b505050505081565b61101e61199f565b600e55565b60006001600160a01b0382166110a15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e65720000000000000000000000000000000000000000000000606482015260840161093a565b506001600160a01b031660009081526003602052604090205490565b6110c561199f565b6110cf6000611a13565b565b6110d961199f565b600f55565b606060018054610800906127a4565b60006110f860085490565b60105490915060ff166111735760405162461bcd60e51b815260206004820152602260248201527f424154573a204d696e74696e67206e6565647320746f20626520656e61626c6560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015260840161093a565b6000821161118057600080fd5b600e5461118d83836129f5565b11156111db5760405162461bcd60e51b815260206004820152601f60248201527f424154573a204d696e742f6f72646572206578636565647320737570706c7900604482015260640161093a565b600f54336000908152601260205260409020546111f890846129f5565b111561126c5760405162461bcd60e51b815260206004820152603960248201527f424154573a206d696e74416d6f756e74206d757374206265206c65737320746860448201527f616e206f7220657175616c206d61784d696e74416d6f756e7400000000000000606482015260840161093a565b336000908152601260205260408120805484929061128b9084906129f5565b90915550600190505b8281116109db576112a933610f5583856129f5565b806112b381612855565b915050611294565b610d62338383611a7d565b6112d03383611730565b6113425760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161093a565b61134e84848484611b4b565b50505050565b600c8054610f95906127a4565b6000818152600260205260409020546060906001600160a01b03166113ee5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161093a565b60006113f8611bd4565b905060008151116114185760405180602001604052806000815250611446565b8061142284611be3565b600c60405160200161143693929190612a0d565b6040516020818303038152906040525b9392505050565b61145561199f565b60105481151560ff9091161515036114af5760405162461bcd60e51b815260206004820152601b60248201527f424154573a204e65772076616c7565206d617463686573206f6c640000000000604482015260640161093a565b6010805460ff1916911515919091179055565b6114ca61199f565b600c610d6282826128db565b6114de61199f565b6001600160a01b03811661155a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161093a565b610bb181611a13565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806115f657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107eb57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107eb565b6000818152600260205260409020546001600160a01b0316610bb15760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161093a565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906116f782610d66565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061173c83610d66565b9050806001600160a01b0316846001600160a01b0316148061178357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806117a75750836001600160a01b031661179c84610883565b6001600160a01b0316145b949350505050565b826001600160a01b03166117c282610d66565b6001600160a01b03161461183e5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161093a565b6001600160a01b0382166118b95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161093a565b6118c4838383611d18565b6118cf6000826116aa565b6001600160a01b03831660009081526003602052604081208054600192906118f8908490612aad565b90915550506001600160a01b03821660009081526003602052604081208054600192906119269084906129f5565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b031633146110cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161093a565b610d62828260405180602001604052806000815250611dd0565b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611ade5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161093a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611b568484846117af565b611b6284848484611e59565b61134e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161093a565b6060600b8054610800906127a4565b606081600003611c2657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611c505780611c3a81612855565b9150611c499050600a83612af3565b9150611c2a565b60008167ffffffffffffffff811115611c6b57611c6b6124dc565b6040519080825280601f01601f191660200182016040528015611c95576020820181803683370190505b5090505b84156117a757611caa600183612aad565b9150611cb7600a86612b07565b611cc29060306129f5565b60f81b818381518110611cd757611cd76127f7565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d11600a86612af3565b9450611c99565b6001600160a01b038316611d7357611d6e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611d96565b816001600160a01b0316836001600160a01b031614611d9657611d968382612018565b6001600160a01b038216611dad576109db816120b5565b826001600160a01b0316826001600160a01b0316146109db576109db8282612164565b611dda83836121a8565b611de76000848484611e59565b6109db5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161093a565b60006001600160a01b0384163b1561200d576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290611eb6903390899088908890600401612b1b565b6020604051808303816000875af1925050508015611f0f575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f0c91810190612b57565b60015b611fc2573d808015611f3d576040519150601f19603f3d011682016040523d82523d6000602084013e611f42565b606091505b508051600003611fba5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161093a565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506117a7565b506001949350505050565b6000600161202584611023565b61202f9190612aad565b600083815260076020526040902054909150808214612082576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906120c790600190612aad565b600083815260096020526040812054600880549394509092849081106120ef576120ef6127f7565b906000526020600020015490508060088381548110612110576121106127f7565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061214857612148612b74565b6001900381819060005260206000200160009055905550505050565b600061216f83611023565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166121fe5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161093a565b6000818152600260205260409020546001600160a01b0316156122635760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161093a565b61226f60008383611d18565b6001600160a01b03821660009081526003602052604081208054600192906122989084906129f5565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610bb157600080fd5b60006020828403121561234e57600080fd5b81356114468161230e565b60005b8381101561237457818101518382015260200161235c565b8381111561134e5750506000910152565b6000815180845261239d816020860160208601612359565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006114466020830184612385565b6000602082840312156123f457600080fd5b5035919050565b80356001600160a01b038116811461241257600080fd5b919050565b6000806040838503121561242a57600080fd5b612433836123fb565b946020939093013593505050565b60006020828403121561245357600080fd5b611446826123fb565b60008060006060848603121561247157600080fd5b61247a846123fb565b9250612488602085016123fb565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b818110156124d0578351835292840192918401916001016124b4565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115612526576125266124dc565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561256c5761256c6124dc565b8160405280935085815286868601111561258557600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156125b157600080fd5b813567ffffffffffffffff8111156125c857600080fd5b8201601f810184136125d957600080fd5b6117a78482356020840161250b565b60008083601f8401126125fa57600080fd5b50813567ffffffffffffffff81111561261257600080fd5b6020830191508360208260051b850101111561262d57600080fd5b9250929050565b6000806000806040858703121561264a57600080fd5b843567ffffffffffffffff8082111561266257600080fd5b61266e888389016125e8565b9096509450602087013591508082111561268757600080fd5b50612694878288016125e8565b95989497509550505050565b8035801515811461241257600080fd5b600080604083850312156126c357600080fd5b6126cc836123fb565b91506126da602084016126a0565b90509250929050565b600080600080608085870312156126f957600080fd5b612702856123fb565b9350612710602086016123fb565b925060408501359150606085013567ffffffffffffffff81111561273357600080fd5b8501601f8101871361274457600080fd5b6127538782356020840161250b565b91505092959194509250565b60006020828403121561277157600080fd5b611446826126a0565b6000806040838503121561278d57600080fd5b612796836123fb565b91506126da602084016123fb565b600181811c908216806127b857607f821691505b6020821081036127f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361288657612886612826565b5060010190565b601f8211156109db57600081815260208120601f850160051c810160208610156128b45750805b601f850160051c820191505b818110156128d3578281556001016128c0565b505050505050565b815167ffffffffffffffff8111156128f5576128f56124dc565b6129098161290384546127a4565b8461288d565b602080601f83116001811461295c57600084156129265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556128d3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156129a95788860151825594840194600190910190840161298a565b50858210156129e557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008219821115612a0857612a08612826565b500190565b600084516020612a208285838a01612359565b855191840191612a338184848a01612359565b8554920191600090612a44816127a4565b60018281168015612a5c5760018114612a7157612a9d565b60ff1984168752821515830287019450612a9d565b896000528560002060005b84811015612a9557815489820152908301908701612a7c565b505082870194505b50929a9950505050505050505050565b600082821015612abf57612abf612826565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612b0257612b02612ac4565b500490565b600082612b1657612b16612ac4565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612b4d6080830184612385565b9695505050505050565b600060208284031215612b6957600080fd5b81516114468161230e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220ff6fd3eae86249fedf9b31c5b3551319344080b6454dd1e5bbf4de8bc736079e64736f6c634300080f0033
Deployed Bytecode Sourcemap
137:3645:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:224:5;;;;;;;;;;-1:-1:-1;1018:224:5;;;;;:::i;:::-;;:::i;:::-;;;611:14:13;;604:22;586:41;;574:2;559:18;1018:224:5;;;;;;;;2483:100:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3996:171::-;;;;;;;;;;-1:-1:-1;3996:171:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1797:55:13;;;1779:74;;1767:2;1752:18;3996:171:4;1633:226:13;3513:417:4;;;;;;;;;;-1:-1:-1;3513:417:4;;;;;:::i;:::-;;:::i;:::-;;359:29:1;;;;;;;;;;;;;;;;;;;2470:25:13;;;2458:2;2443:18;359:29:1;2324:177:13;1658:113:5;;;;;;;;;;-1:-1:-1;1746:10:5;:17;1658:113;;553:38:1;;;;;;;;;;-1:-1:-1;553:38:1;;;;;:::i;:::-;;;;;;;;;;;;;;429:32;;;;;;;;;;;;;;;;4696:336:4;;;;;;;;;;-1:-1:-1;4696:336:4;;;;;:::i;:::-;;:::i;1326:256:5:-;;;;;;;;;;-1:-1:-1;1326:256:5;;;;;:::i;:::-;;:::i;3528:100:1:-;;;;;;;;;;-1:-1:-1;3528:100:1;;;;;:::i;:::-;;:::i;3634:145::-;;;:::i;5103:185:4:-;;;;;;;;;;-1:-1:-1;5103:185:4;;;;;:::i;:::-;;:::i;1342:348:1:-;;;;;;;;;;-1:-1:-1;1342:348:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2722:80::-;;;;;;;;;;-1:-1:-1;2722:80:1;;;;;:::i;:::-;;:::i;3428:93::-;;;;;;;;;;-1:-1:-1;3428:93:1;;;;;:::i;:::-;;:::i;1848:233:5:-;;;;;;;;;;-1:-1:-1;1848:233:5;;;;;:::i;:::-;;:::i;3030:98:1:-;;;;;;;;;;-1:-1:-1;3030:98:1;;;;;:::i;:::-;;:::i;466:32::-;;;;;;;;;;-1:-1:-1;466:32:1;;;;;;;;2194:222:4;;;;;;;;;;-1:-1:-1;2194:222:4;;;;;:::i;:::-;;:::i;2141:575:1:-;;;;;;;;;;-1:-1:-1;2141:575:1;;;;;:::i;:::-;;:::i;232:80::-;;;;;;;;;;;;;:::i;2808:94::-;;;;;;;;;;-1:-1:-1;2808:94:1;;;;;:::i;:::-;;:::i;1925:207:4:-;;;;;;;;;;-1:-1:-1;1925:207:4;;;;;:::i;:::-;;:::i;1884:103:11:-;;;;;;;;;;;;;:::i;2908:116:1:-;;;;;;;;;;-1:-1:-1;2908:116:1;;;;;:::i;:::-;;:::i;1236:87:11:-;;;;;;;;;;-1:-1:-1;1309:6:11;;-1:-1:-1;;;;;1309:6:11;1236:87;;2652:104:4;;;;;;;;;;;;;:::i;795:541:1:-;;;;;;:::i;:::-;;:::i;4239:155:4:-;;;;;;;;;;-1:-1:-1;4239:155:4;;;;;:::i;:::-;;:::i;5359:323::-;;;;;;;;;;-1:-1:-1;5359:323:4;;;;;:::i;:::-;;:::i;317:37:1:-;;;;;;;;;;;;;:::i;1696:423::-;;;;;;;;;;-1:-1:-1;1696:423:1;;;;;:::i;:::-;;:::i;3262:159::-;;;;;;;;;;-1:-1:-1;3262:159:1;;;;;:::i;:::-;;:::i;393:31::-;;;;;;;;;;;;;;;;503:43;;;;;;;;;;-1:-1:-1;503:43:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;3134:122;;;;;;;;;;-1:-1:-1;3134:122:1;;;;;:::i;:::-;;:::i;4465:164:4:-;;;;;;;;;;-1:-1:-1;4465:164:4;;;;;:::i;:::-;-1:-1:-1;;;;;4586:25:4;;;4562:4;4586:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4465:164;2142:201:11;;;;;;;;;;-1:-1:-1;2142:201:11;;;;;:::i;:::-;;:::i;1018:224:5:-;1120:4;1144:50;;;1159:35;1144:50;;:90;;;1198:36;1222:11;1198:23;:36::i;:::-;1137:97;1018:224;-1:-1:-1;;1018:224:5:o;2483:100:4:-;2537:13;2570:5;2563:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2483:100;:::o;3996:171::-;4072:7;4092:23;4107:7;4092:14;:23::i;:::-;-1:-1:-1;4135:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4135:24:4;;3996:171::o;3513:417::-;3594:13;3610:23;3625:7;3610:14;:23::i;:::-;3594:39;;3658:5;-1:-1:-1;;;;;3652:11:4;:2;-1:-1:-1;;;;;3652:11:4;;3644:57;;;;-1:-1:-1;;;3644:57:4;;8348:2:13;3644:57:4;;;8330:21:13;8387:2;8367:18;;;8360:30;8426:34;8406:18;;;8399:62;8497:3;8477:18;;;8470:31;8518:19;;3644:57:4;;;;;;;;;736:10:2;-1:-1:-1;;;;;3736:21:4;;;;:62;;-1:-1:-1;3761:37:4;3778:5;736:10:2;4465:164:4;:::i;3761:37::-;3714:174;;;;-1:-1:-1;;;3714:174:4;;8750:2:13;3714:174:4;;;8732:21:13;8789:2;8769:18;;;8762:30;8828:34;8808:18;;;8801:62;8899:32;8879:18;;;8872:60;8949:19;;3714:174:4;8548:426:13;3714:174:4;3901:21;3910:2;3914:7;3901:8;:21::i;:::-;3583:347;3513:417;;:::o;4696:336::-;4891:41;736:10:2;4924:7:4;4891:18;:41::i;:::-;4883:100;;;;-1:-1:-1;;;4883:100:4;;9181:2:13;4883:100:4;;;9163:21:13;9220:2;9200:18;;;9193:30;9259:34;9239:18;;;9232:62;9330:16;9310:18;;;9303:44;9364:19;;4883:100:4;8979:410:13;4883:100:4;4996:28;5006:4;5012:2;5016:7;4996:9;:28::i;1326:256:5:-;1423:7;1459:23;1476:5;1459:16;:23::i;:::-;1451:5;:31;1443:87;;;;-1:-1:-1;;;1443:87:5;;9596:2:13;1443:87:5;;;9578:21:13;9635:2;9615:18;;;9608:30;9674:34;9654:18;;;9647:62;9745:13;9725:18;;;9718:41;9776:19;;1443:87:5;9394:407:13;1443:87:5;-1:-1:-1;;;;;;1548:19:5;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1326:256::o;3528:100:1:-;1122:13:11;:11;:13::i;:::-;-1:-1:-1;;;;;3596:18:1::1;3617:5;3596:18:::0;;;:11:::1;:18;::::0;;;;:26;;-1:-1:-1;;3596:26:1::1;::::0;;3528:100::o;3634:145::-;1122:13:11;:11;:13::i;:::-;3687:7:1::1;3708;1309:6:11::0;;-1:-1:-1;;;;;1309:6:11;;1236:87;3708:7:1::1;-1:-1:-1::0;;;;;3700:21:1::1;3729;3700:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3686:69;;;3770:2;3762:11;;;::::0;::::1;;3679:100;3634:145::o:0;5103:185:4:-;5241:39;5258:4;5264:2;5268:7;5241:39;;;;;;;;;;;;:16;:39::i;1342:348:1:-;1417:16;1445:23;1471:17;1481:6;1471:9;:17::i;:::-;1445:43;;1495:25;1537:15;1523:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1523:30:1;;1495:58;;1565:9;1560:103;1580:15;1576:1;:19;1560:103;;;1625:30;1645:6;1653:1;1625:19;:30::i;:::-;1611:8;1620:1;1611:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;1597:3;;;;:::i;:::-;;;;1560:103;;;-1:-1:-1;1676:8:1;1342:348;-1:-1:-1;;;1342:348:1:o;2722:80::-;1122:13:11;:11;:13::i;:::-;2781:4:1::1;:15:::0;2722:80::o;3428:93::-;1122:13:11;:11;:13::i;:::-;-1:-1:-1;;;;;3490:18:1::1;;::::0;;;:11:::1;:18;::::0;;;;:25;;-1:-1:-1;;3490:25:1::1;3511:4;3490:25;::::0;;3428:93::o;1848:233:5:-;1923:7;1959:30;1746:10;:17;;1658:113;1959:30;1951:5;:38;1943:95;;;;-1:-1:-1;;;1943:95:5;;10796:2:13;1943:95:5;;;10778:21:13;10835:2;10815:18;;;10808:30;10874:34;10854:18;;;10847:62;10945:14;10925:18;;;10918:42;10977:19;;1943:95:5;10594:408:13;1943:95:5;2056:10;2067:5;2056:17;;;;;;;;:::i;:::-;;;;;;;;;2049:24;;1848:233;;;:::o;3030:98:1:-;1122:13:11;:11;:13::i;:::-;3101:7:1::1;:21;3111:11:::0;3101:7;:21:::1;:::i;:::-;;3030:98:::0;:::o;2194:222:4:-;2266:7;2302:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2302:16:4;;2329:56;;;;-1:-1:-1;;;2329:56:4;;13592:2:13;2329:56:4;;;13574:21:13;13631:2;13611:18;;;13604:30;13670:26;13650:18;;;13643:54;13714:18;;2329:56:4;13390:348:13;2141:575:1;1122:13:11;:11;:13::i;:::-;2244:33:1;;::::1;2236:93;;;::::0;-1:-1:-1;;;2236:93:1;;13945:2:13;2236:93:1::1;::::0;::::1;13927:21:13::0;13984:2;13964:18;;;13957:30;14023:34;14003:18;;;13996:62;14094:17;14074:18;;;14067:45;14129:19;;2236:93:1::1;13743:411:13::0;2236:93:1::1;2338:16;2361:11:::0;2375:13:::1;1746:10:5::0;:17;;1658:113;2375:13:1::1;2361:27;;2399:6;2395:77;2407:17:::0;;::::1;2395:77;;;2455:6;;2462:1;2455:9;;;;;;;:::i;:::-;;;;;;;2440:24;;;;;:::i;:::-;::::0;-1:-1:-1;2426:3:1;::::1;::::0;::::1;:::i;:::-;;;;2395:77;;;-1:-1:-1::0;2509:9:1::1;::::0;2486:20:::1;2495:11:::0;2486:6;:20:::1;:::i;:::-;:32;2478:76;;;::::0;-1:-1:-1;;;2478:76:1;;14494:2:13;2478:76:1::1;::::0;::::1;14476:21:13::0;14533:2;14513:18;;;14506:30;14572:33;14552:18;;;14545:61;14623:18;;2478:76:1::1;14292:355:13::0;2478:76:1::1;2567:6;2563:148;2575:20:::0;;::::1;2563:148;;;2624:1;2611:93;2632:6;;2639:1;2632:9;;;;;;;:::i;:::-;;;;;;;2627:1;:14;2611:93;;2659:35;2669:9;;2679:1;2669:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2683:10;2692:1:::0;2683:6;:10:::1;:::i;:::-;2659:9;:35::i;:::-;2643:3:::0;::::1;::::0;::::1;:::i;:::-;;;;2611:93;;;-1:-1:-1::0;2597:3:1;::::1;::::0;::::1;:::i;:::-;;;;2563:148;;;;2229:487;;2141:575:::0;;;;:::o;232:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2808:94::-;1122:13:11;:11;:13::i;:::-;2874:9:1::1;:22:::0;2808:94::o;1925:207:4:-;1997:7;-1:-1:-1;;;;;2025:19:4;;2017:73;;;;-1:-1:-1;;;2017:73:4;;14854:2:13;2017:73:4;;;14836:21:13;14893:2;14873:18;;;14866:30;14932:34;14912:18;;;14905:62;15003:11;14983:18;;;14976:39;15032:19;;2017:73:4;14652:405:13;2017:73:4;-1:-1:-1;;;;;;2108:16:4;;;;;:9;:16;;;;;;;1925:207::o;1884:103:11:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;2908:116:1:-;1122:13:11;:11;:13::i;:::-;2985::1::1;:33:::0;2908:116::o;2652:104:4:-;2708:13;2741:7;2734:14;;;;;:::i;795:541:1:-;852:14;869:13;1746:10:5;:17;;1658:113;869:13:1;897:12;;852:30;;-1:-1:-1;897:12:1;;889:59;;;;-1:-1:-1;;;889:59:1;;15264:2:13;889:59:1;;;15246:21:13;15303:2;15283:18;;;15276:30;15342:34;15322:18;;;15315:62;15413:4;15393:18;;;15386:32;15435:19;;889:59:1;15062:398:13;889:59:1;977:1;963:11;:15;955:24;;;;;;1018:9;;994:20;1003:11;994:6;:20;:::i;:::-;:33;;986:77;;;;-1:-1:-1;;;986:77:1;;14494:2:13;986:77:1;;;14476:21:13;14533:2;14513:18;;;14506:30;14572:33;14552:18;;;14545:61;14623:18;;986:77:1;14292:355:13;986:77:1;1114:13;;1099:10;1092:18;;;;:6;:18;;;;;;1078:32;;:11;:32;:::i;:::-;:49;;1070:119;;;;-1:-1:-1;;;1070:119:1;;15667:2:13;1070:119:1;;;15649:21:13;15706:2;15686:18;;;15679:30;15745:34;15725:18;;;15718:62;15816:27;15796:18;;;15789:55;15861:19;;1070:119:1;15465:421:13;1070:119:1;1205:10;1198:18;;;;:6;:18;;;;;:33;;1220:11;;1198:18;:33;;1220:11;;1198:33;:::i;:::-;;;;-1:-1:-1;1255:1:1;;-1:-1:-1;1238:93:1;1263:11;1258:1;:16;1238:93;;1290:33;1300:10;1312;1321:1;1312:6;:10;:::i;1290:33::-;1276:3;;;;:::i;:::-;;;;1238:93;;4239:155:4;4334:52;736:10:2;4367:8:4;4377;4334:18;:52::i;5359:323::-;5533:41;736:10:2;5566:7:4;5533:18;:41::i;:::-;5525:100;;;;-1:-1:-1;;;5525:100:4;;9181:2:13;5525:100:4;;;9163:21:13;9220:2;9200:18;;;9193:30;9259:34;9239:18;;;9232:62;9330:16;9310:18;;;9303:44;9364:19;;5525:100:4;8979:410:13;5525:100:4;5636:38;5650:4;5656:2;5660:7;5669:4;5636:13;:38::i;:::-;5359:323;;;;:::o;317:37:1:-;;;;;;;:::i;1696:423::-;7254:4:4;7278:16;;;:7;:16;;;;;;1794:13:1;;-1:-1:-1;;;;;7278:16:4;1819:97:1;;;;-1:-1:-1;;;1819:97:1;;16093:2:13;1819:97:1;;;16075:21:13;16132:2;16112:18;;;16105:30;16171:34;16151:18;;;16144:62;16242:17;16222:18;;;16215:45;16277:19;;1819:97:1;15891:411:13;1819:97:1;1925:28;1956:10;:8;:10::i;:::-;1925:41;;2011:1;1986:14;1980:28;:32;:133;;;;;;;;;;;;;;;;;2048:14;2064:18;:7;:16;:18::i;:::-;2084:13;2031:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1980:133;1973:140;1696:423;-1:-1:-1;;;1696:423:1:o;3262:159::-;1122:13:11;:11;:13::i;:::-;3333:12:1::1;::::0;:22;::::1;;:12;::::0;;::::1;:22;;::::0;3325:62:::1;;;::::0;-1:-1:-1;;;3325:62:1;;17802:2:13;3325:62:1::1;::::0;::::1;17784:21:13::0;17841:2;17821:18;;;17814:30;17880:29;17860:18;;;17853:57;17927:18;;3325:62:1::1;17600:351:13::0;3325:62:1::1;3394:12;:21:::0;;-1:-1:-1;;3394:21:1::1;::::0;::::1;;::::0;;;::::1;::::0;;3262:159::o;3134:122::-;1122:13:11;:11;:13::i;:::-;3217::1::1;:33;3233:17:::0;3217:13;:33:::1;:::i;2142:201:11:-:0;1122:13;:11;:13::i;:::-;-1:-1:-1;;;;;2231:22:11;::::1;2223:73;;;::::0;-1:-1:-1;;;2223:73:11;;18158:2:13;2223:73:11::1;::::0;::::1;18140:21:13::0;18197:2;18177:18;;;18170:30;18236:34;18216:18;;;18209:62;18307:8;18287:18;;;18280:36;18333:19;;2223:73:11::1;17956:402:13::0;2223:73:11::1;2307:28;2326:8;2307:18;:28::i;1556:305:4:-:0;1658:4;1695:40;;;1710:25;1695:40;;:105;;-1:-1:-1;1752:48:4;;;1767:33;1752:48;1695:105;:158;;;-1:-1:-1;978:25:3;963:40;;;;1817:36:4;854:157:3;11971:135:4;7254:4;7278:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7278:16:4;12045:53;;;;-1:-1:-1;;;12045:53:4;;13592:2:13;12045:53:4;;;13574:21:13;13631:2;13611:18;;;13604:30;13670:26;13650:18;;;13643:54;13714:18;;12045:53:4;13390:348:13;11250:174:4;11325:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;11325:29:4;;;;;;;;:24;;11379:23;11325:24;11379:14;:23::i;:::-;-1:-1:-1;;;;;11370:46:4;;;;;;;;;;;11250:174;;:::o;7483:264::-;7576:4;7593:13;7609:23;7624:7;7609:14;:23::i;:::-;7593:39;;7662:5;-1:-1:-1;;;;;7651:16:4;:7;-1:-1:-1;;;;;7651:16:4;;:52;;;-1:-1:-1;;;;;;4586:25:4;;;4562:4;4586:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7671:32;7651:87;;;;7731:7;-1:-1:-1;;;;;7707:31:4;:20;7719:7;7707:11;:20::i;:::-;-1:-1:-1;;;;;7707:31:4;;7651:87;7643:96;7483:264;-1:-1:-1;;;;7483:264:4:o;10506:625::-;10665:4;-1:-1:-1;;;;;10638:31:4;:23;10653:7;10638:14;:23::i;:::-;-1:-1:-1;;;;;10638:31:4;;10630:81;;;;-1:-1:-1;;;10630:81:4;;18565:2:13;10630:81:4;;;18547:21:13;18604:2;18584:18;;;18577:30;18643:34;18623:18;;;18616:62;18714:7;18694:18;;;18687:35;18739:19;;10630:81:4;18363:401:13;10630:81:4;-1:-1:-1;;;;;10730:16:4;;10722:65;;;;-1:-1:-1;;;10722:65:4;;18971:2:13;10722:65:4;;;18953:21:13;19010:2;18990:18;;;18983:30;19049:34;19029:18;;;19022:62;19120:6;19100:18;;;19093:34;19144:19;;10722:65:4;18769:400:13;10722:65:4;10800:39;10821:4;10827:2;10831:7;10800:20;:39::i;:::-;10904:29;10921:1;10925:7;10904:8;:29::i;:::-;-1:-1:-1;;;;;10946:15:4;;;;;;:9;:15;;;;;:20;;10965:1;;10946:15;:20;;10965:1;;10946:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10977:13:4;;;;;;:9;:13;;;;;:18;;10994:1;;10977:13;:18;;10994:1;;10977:18;:::i;:::-;;;;-1:-1:-1;;11006:16:4;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;11006:21:4;;;;;;;;;11045:27;;11006:16;;11045:27;;;;;;;3583:347;3513:417;;:::o;1401:132:11:-;1309:6;;-1:-1:-1;;;;;1309:6:11;736:10:2;1465:23:11;1457:68;;;;-1:-1:-1;;;1457:68:11;;19506:2:13;1457:68:11;;;19488:21:13;;;19525:18;;;19518:30;19584:34;19564:18;;;19557:62;19636:18;;1457:68:11;19304:356:13;8089:110:4;8165:26;8175:2;8179:7;8165:26;;;;;;;;;;;;:9;:26::i;2503:191:11:-;2596:6;;;-1:-1:-1;;;;;2613:17:11;;;;;;;;;;;2646:40;;2596:6;;;2613:17;2596:6;;2646:40;;2577:16;;2646:40;2566:128;2503:191;:::o;11567:315:4:-;11722:8;-1:-1:-1;;;;;11713:17:4;:5;-1:-1:-1;;;;;11713:17:4;;11705:55;;;;-1:-1:-1;;;11705:55:4;;19867:2:13;11705:55:4;;;19849:21:13;19906:2;19886:18;;;19879:30;19945:27;19925:18;;;19918:55;19990:18;;11705:55:4;19665:349:13;11705:55:4;-1:-1:-1;;;;;11771:25:4;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11771:46:4;;;;;;;;;;11833:41;;586::13;;;11833::4;;559:18:13;11833:41:4;;;;;;;11567:315;;;:::o;6563:313::-;6719:28;6729:4;6735:2;6739:7;6719:9;:28::i;:::-;6766:47;6789:4;6795:2;6799:7;6808:4;6766:22;:47::i;:::-;6758:110;;;;-1:-1:-1;;;6758:110:4;;20221:2:13;6758:110:4;;;20203:21:13;20260:2;20240:18;;;20233:30;20299:34;20279:18;;;20272:62;20370:20;20350:18;;;20343:48;20408:19;;6758:110:4;20019:414:13;674:102:1;734:13;763:7;756:14;;;;;:::i;407:723:12:-;463:13;684:5;693:1;684:10;680:53;;-1:-1:-1;;711:10:12;;;;;;;;;;;;;;;;;;407:723::o;680:53::-;758:5;743:12;799:78;806:9;;799:78;;832:8;;;;:::i;:::-;;-1:-1:-1;855:10:12;;-1:-1:-1;863:2:12;855:10;;:::i;:::-;;;799:78;;;887:19;919:6;909:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;909:17:12;;887:39;;937:154;944:10;;937:154;;971:11;981:1;971:11;;:::i;:::-;;-1:-1:-1;1040:10:12;1048:2;1040:5;:10;:::i;:::-;1027:24;;:2;:24;:::i;:::-;1014:39;;997:6;1004;997:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1068:11:12;1077:2;1068:11;;:::i;:::-;;;937:154;;2694:589:5;-1:-1:-1;;;;;2900:18:5;;2896:187;;2935:40;2967:7;4110:10;:17;;4083:24;;;;:15;:24;;;;;:44;;;4138:24;;;;;;;;;;;;4006:164;2935:40;2896:187;;;3005:2;-1:-1:-1;;;;;2997:10:5;:4;-1:-1:-1;;;;;2997:10:5;;2993:90;;3024:47;3057:4;3063:7;3024:32;:47::i;:::-;-1:-1:-1;;;;;3097:16:5;;3093:183;;3130:45;3167:7;3130:36;:45::i;3093:183::-;3203:4;-1:-1:-1;;;;;3197:10:5;:2;-1:-1:-1;;;;;3197:10:5;;3193:83;;3224:40;3252:2;3256:7;3224:27;:40::i;8426:319:4:-;8555:18;8561:2;8565:7;8555:5;:18::i;:::-;8606:53;8637:1;8641:2;8645:7;8654:4;8606:22;:53::i;:::-;8584:153;;;;-1:-1:-1;;;8584:153:4;;20221:2:13;8584:153:4;;;20203:21:13;20260:2;20240:18;;;20233:30;20299:34;20279:18;;;20272:62;20370:20;20350:18;;;20343:48;20408:19;;8584:153:4;20019:414:13;12670:853:4;12824:4;-1:-1:-1;;;;;12845:13:4;;1505:19:0;:23;12841:675:4;;12881:71;;;;;-1:-1:-1;;;;;12881:36:4;;;;;:71;;736:10:2;;12932:4:4;;12938:7;;12947:4;;12881:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12881:71:4;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12877:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13122:6;:13;13139:1;13122:18;13118:328;;13165:60;;-1:-1:-1;;;13165:60:4;;20221:2:13;13165:60:4;;;20203:21:13;20260:2;20240:18;;;20233:30;20299:34;20279:18;;;20272:62;20370:20;20350:18;;;20343:48;20408:19;;13165:60:4;20019:414:13;13118:328:4;13396:6;13390:13;13381:6;13377:2;13373:15;13366:38;12877:584;13003:51;;13013:41;13003:51;;-1:-1:-1;12996:58:4;;12841:675;-1:-1:-1;13500:4:4;12670:853;;;;;;:::o;4797:988:5:-;5063:22;5113:1;5088:22;5105:4;5088:16;:22::i;:::-;:26;;;;:::i;:::-;5125:18;5146:26;;;:17;:26;;;;;;5063:51;;-1:-1:-1;5279:28:5;;;5275:328;;-1:-1:-1;;;;;5346:18:5;;5324:19;5346:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5397:30;;;;;;:44;;;5514:30;;:17;:30;;;;;:43;;;5275:328;-1:-1:-1;5699:26:5;;;;:17;:26;;;;;;;;5692:33;;;-1:-1:-1;;;;;5743:18:5;;;;;:12;:18;;;;;:34;;;;;;;5736:41;4797:988::o;6080:1079::-;6358:10;:17;6333:22;;6358:21;;6378:1;;6358:21;:::i;:::-;6390:18;6411:24;;;:15;:24;;;;;;6784:10;:26;;6333:46;;-1:-1:-1;6411:24:5;;6333:46;;6784:26;;;;;;:::i;:::-;;;;;;;;;6762:48;;6848:11;6823:10;6834;6823:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6928:28;;;:15;:28;;;;;;;:41;;;7100:24;;;;;7093:31;7135:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6151:1008;;;6080:1079;:::o;3584:221::-;3669:14;3686:20;3703:2;3686:16;:20::i;:::-;-1:-1:-1;;;;;3717:16:5;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3762:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3584:221:5:o;9081:439:4:-;-1:-1:-1;;;;;9161:16:4;;9153:61;;;;-1:-1:-1;;;9153:61:4;;22031:2:13;9153:61:4;;;22013:21:13;;;22050:18;;;22043:30;22109:34;22089:18;;;22082:62;22161:18;;9153:61:4;21829:356:13;9153:61:4;7254:4;7278:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7278:16:4;:30;9225:58;;;;-1:-1:-1;;;9225:58:4;;22392:2:13;9225:58:4;;;22374:21:13;22431:2;22411:18;;;22404:30;22470;22450:18;;;22443:58;22518:18;;9225:58:4;22190:352:13;9225:58:4;9296:45;9325:1;9329:2;9333:7;9296:20;:45::i;:::-;-1:-1:-1;;;;;9354:13:4;;;;;;:9;:13;;;;;:18;;9371:1;;9354:13;:18;;9371:1;;9354:18;:::i;:::-;;;;-1:-1:-1;;9383:16:4;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;9383:21:4;;;;;;;;9422:33;;9383:16;;;9422:33;;9383:16;;9422:33;3101:21:1::1;3030:98:::0;:::o;14:177:13:-;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:13;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;1137:66;1116:88;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:13:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:13;;1448:180;-1:-1:-1;1448:180:13:o;1864:196::-;1932:20;;-1:-1:-1;;;;;1981:54:13;;1971:65;;1961:93;;2050:1;2047;2040:12;1961:93;1864:196;;;:::o;2065:254::-;2133:6;2141;2194:2;2182:9;2173:7;2169:23;2165:32;2162:52;;;2210:1;2207;2200:12;2162:52;2233:29;2252:9;2233:29;:::i;:::-;2223:39;2309:2;2294:18;;;;2281:32;;-1:-1:-1;;;2065:254:13:o;2506:186::-;2565:6;2618:2;2606:9;2597:7;2593:23;2589:32;2586:52;;;2634:1;2631;2624:12;2586:52;2657:29;2676:9;2657:29;:::i;2697:328::-;2774:6;2782;2790;2843:2;2831:9;2822:7;2818:23;2814:32;2811:52;;;2859:1;2856;2849:12;2811:52;2882:29;2901:9;2882:29;:::i;:::-;2872:39;;2930:38;2964:2;2953:9;2949:18;2930:38;:::i;:::-;2920:48;;3015:2;3004:9;3000:18;2987:32;2977:42;;2697:328;;;;;:::o;3030:632::-;3201:2;3253:21;;;3323:13;;3226:18;;;3345:22;;;3172:4;;3201:2;3424:15;;;;3398:2;3383:18;;;3172:4;3467:169;3481:6;3478:1;3475:13;3467:169;;;3542:13;;3530:26;;3611:15;;;;3576:12;;;;3503:1;3496:9;3467:169;;;-1:-1:-1;3653:3:13;;3030:632;-1:-1:-1;;;;;;3030:632:13:o;3667:184::-;3719:77;3716:1;3709:88;3816:4;3813:1;3806:15;3840:4;3837:1;3830:15;3856:691;3921:5;3951:18;3992:2;3984:6;3981:14;3978:40;;;3998:18;;:::i;:::-;4132:2;4126:9;4198:2;4186:15;;4037:66;4182:24;;;4208:2;4178:33;4174:42;4162:55;;;4232:18;;;4252:22;;;4229:46;4226:72;;;4278:18;;:::i;:::-;4318:10;4314:2;4307:22;4347:6;4338:15;;4377:6;4369;4362:22;4417:3;4408:6;4403:3;4399:16;4396:25;4393:45;;;4434:1;4431;4424:12;4393:45;4484:6;4479:3;4472:4;4464:6;4460:17;4447:44;4539:1;4532:4;4523:6;4515;4511:19;4507:30;4500:41;;;;3856:691;;;;;:::o;4552:451::-;4621:6;4674:2;4662:9;4653:7;4649:23;4645:32;4642:52;;;4690:1;4687;4680:12;4642:52;4730:9;4717:23;4763:18;4755:6;4752:30;4749:50;;;4795:1;4792;4785:12;4749:50;4818:22;;4871:4;4863:13;;4859:27;-1:-1:-1;4849:55:13;;4900:1;4897;4890:12;4849:55;4923:74;4989:7;4984:2;4971:16;4966:2;4962;4958:11;4923:74;:::i;5008:367::-;5071:8;5081:6;5135:3;5128:4;5120:6;5116:17;5112:27;5102:55;;5153:1;5150;5143:12;5102:55;-1:-1:-1;5176:20:13;;5219:18;5208:30;;5205:50;;;5251:1;5248;5241:12;5205:50;5288:4;5280:6;5276:17;5264:29;;5348:3;5341:4;5331:6;5328:1;5324:14;5316:6;5312:27;5308:38;5305:47;5302:67;;;5365:1;5362;5355:12;5302:67;5008:367;;;;;:::o;5380:773::-;5502:6;5510;5518;5526;5579:2;5567:9;5558:7;5554:23;5550:32;5547:52;;;5595:1;5592;5585:12;5547:52;5635:9;5622:23;5664:18;5705:2;5697:6;5694:14;5691:34;;;5721:1;5718;5711:12;5691:34;5760:70;5822:7;5813:6;5802:9;5798:22;5760:70;:::i;:::-;5849:8;;-1:-1:-1;5734:96:13;-1:-1:-1;5937:2:13;5922:18;;5909:32;;-1:-1:-1;5953:16:13;;;5950:36;;;5982:1;5979;5972:12;5950:36;;6021:72;6085:7;6074:8;6063:9;6059:24;6021:72;:::i;:::-;5380:773;;;;-1:-1:-1;6112:8:13;-1:-1:-1;;;;5380:773:13:o;6158:160::-;6223:20;;6279:13;;6272:21;6262:32;;6252:60;;6308:1;6305;6298:12;6323:254;6388:6;6396;6449:2;6437:9;6428:7;6424:23;6420:32;6417:52;;;6465:1;6462;6455:12;6417:52;6488:29;6507:9;6488:29;:::i;:::-;6478:39;;6536:35;6567:2;6556:9;6552:18;6536:35;:::i;:::-;6526:45;;6323:254;;;;;:::o;6582:667::-;6677:6;6685;6693;6701;6754:3;6742:9;6733:7;6729:23;6725:33;6722:53;;;6771:1;6768;6761:12;6722:53;6794:29;6813:9;6794:29;:::i;:::-;6784:39;;6842:38;6876:2;6865:9;6861:18;6842:38;:::i;:::-;6832:48;;6927:2;6916:9;6912:18;6899:32;6889:42;;6982:2;6971:9;6967:18;6954:32;7009:18;7001:6;6998:30;6995:50;;;7041:1;7038;7031:12;6995:50;7064:22;;7117:4;7109:13;;7105:27;-1:-1:-1;7095:55:13;;7146:1;7143;7136:12;7095:55;7169:74;7235:7;7230:2;7217:16;7212:2;7208;7204:11;7169:74;:::i;:::-;7159:84;;;6582:667;;;;;;;:::o;7254:180::-;7310:6;7363:2;7351:9;7342:7;7338:23;7334:32;7331:52;;;7379:1;7376;7369:12;7331:52;7402:26;7418:9;7402:26;:::i;7439:260::-;7507:6;7515;7568:2;7556:9;7547:7;7543:23;7539:32;7536:52;;;7584:1;7581;7574:12;7536:52;7607:29;7626:9;7607:29;:::i;:::-;7597:39;;7655:38;7689:2;7678:9;7674:18;7655:38;:::i;7704:437::-;7783:1;7779:12;;;;7826;;;7847:61;;7901:4;7893:6;7889:17;7879:27;;7847:61;7954:2;7946:6;7943:14;7923:18;7920:38;7917:218;;7991:77;7988:1;7981:88;8092:4;8089:1;8082:15;8120:4;8117:1;8110:15;7917:218;;7704:437;;;:::o;10016:184::-;10068:77;10065:1;10058:88;10165:4;10162:1;10155:15;10189:4;10186:1;10179:15;10205:184;10257:77;10254:1;10247:88;10354:4;10351:1;10344:15;10378:4;10375:1;10368:15;10394:195;10433:3;10464:66;10457:5;10454:77;10451:103;;10534:18;;:::i;:::-;-1:-1:-1;10581:1:13;10570:13;;10394:195::o;11133:545::-;11235:2;11230:3;11227:11;11224:448;;;11271:1;11296:5;11292:2;11285:17;11341:4;11337:2;11327:19;11411:2;11399:10;11395:19;11392:1;11388:27;11382:4;11378:38;11447:4;11435:10;11432:20;11429:47;;;-1:-1:-1;11470:4:13;11429:47;11525:2;11520:3;11516:12;11513:1;11509:20;11503:4;11499:31;11489:41;;11580:82;11598:2;11591:5;11588:13;11580:82;;;11643:17;;;11624:1;11613:13;11580:82;;;11584:3;;;11133:545;;;:::o;11914:1471::-;12040:3;12034:10;12067:18;12059:6;12056:30;12053:56;;;12089:18;;:::i;:::-;12118:97;12208:6;12168:38;12200:4;12194:11;12168:38;:::i;:::-;12162:4;12118:97;:::i;:::-;12270:4;;12334:2;12323:14;;12351:1;12346:782;;;;13172:1;13189:6;13186:89;;;-1:-1:-1;13241:19:13;;;13235:26;13186:89;11820:66;11811:1;11807:11;;;11803:84;11799:89;11789:100;11895:1;11891:11;;;11786:117;13288:81;;12316:1063;;12346:782;11080:1;11073:14;;;11117:4;11104:18;;12394:66;12382:79;;;12559:236;12573:7;12570:1;12567:14;12559:236;;;12662:19;;;12656:26;12641:42;;12754:27;;;;12722:1;12710:14;;;;12589:19;;12559:236;;;12563:3;12823:6;12814:7;12811:19;12808:261;;;12884:19;;;12878:26;12985:66;12967:1;12963:14;;;12979:3;12959:24;12955:97;12951:102;12936:118;12921:134;;12808:261;-1:-1:-1;;;;;13115:1:13;13099:14;;;13095:22;13082:36;;-1:-1:-1;11914:1471:13:o;14159:128::-;14199:3;14230:1;14226:6;14223:1;14220:13;14217:39;;;14236:18;;:::i;:::-;-1:-1:-1;14272:9:13;;14159:128::o;16307:1288::-;16531:3;16569:6;16563:13;16595:4;16608:51;16652:6;16647:3;16642:2;16634:6;16630:15;16608:51;:::i;:::-;16722:13;;16681:16;;;;16744:55;16722:13;16681:16;16766:15;;;16744:55;:::i;:::-;16888:13;;16821:20;;;16861:1;;16926:36;16888:13;16926:36;:::i;:::-;16981:1;16998:18;;;17025:199;;;;17238:1;17233:337;;;;16991:579;;17025:199;-1:-1:-1;;17064:9:13;17060:82;17053:5;17046:97;17202:8;17195:16;17188:24;17178:8;17174:39;17167:5;17163:51;17156:58;;17025:199;;17233:337;17264:6;17261:1;17254:17;17312:2;17309:1;17299:16;17337:1;17351:169;17365:8;17362:1;17359:15;17351:169;;;17447:14;;17432:13;;;17425:37;17490:16;;;;17382:10;;17351:169;;;17355:3;;17551:8;17544:5;17540:20;17533:27;;16991:579;-1:-1:-1;17586:3:13;;16307:1288;-1:-1:-1;;;;;;;;;;16307:1288:13:o;19174:125::-;19214:4;19242:1;19239;19236:8;19233:34;;;19247:18;;:::i;:::-;-1:-1:-1;19284:9:13;;19174:125::o;20438:184::-;20490:77;20487:1;20480:88;20587:4;20584:1;20577:15;20611:4;20608:1;20601:15;20627:120;20667:1;20693;20683:35;;20698:18;;:::i;:::-;-1:-1:-1;20732:9:13;;20627:120::o;20752:112::-;20784:1;20810;20800:35;;20815:18;;:::i;:::-;-1:-1:-1;20849:9:13;;20752:112::o;20869:512::-;21063:4;-1:-1:-1;;;;;21173:2:13;21165:6;21161:15;21150:9;21143:34;21225:2;21217:6;21213:15;21208:2;21197:9;21193:18;21186:43;;21265:6;21260:2;21249:9;21245:18;21238:34;21308:3;21303:2;21292:9;21288:18;21281:31;21329:46;21370:3;21359:9;21355:19;21347:6;21329:46;:::i;:::-;21321:54;20869:512;-1:-1:-1;;;;;;20869:512:13:o;21386:249::-;21455:6;21508:2;21496:9;21487:7;21483:23;21479:32;21476:52;;;21524:1;21521;21514:12;21476:52;21556:9;21550:16;21575:30;21599:5;21575:30;:::i;21640:184::-;21692:77;21689:1;21682:88;21789:4;21786:1;21779:15;21813:4;21810:1;21803:15
Swarm Source
ipfs://ff6fd3eae86249fedf9b31c5b3551319344080b6454dd1e5bbf4de8bc736079e
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.