Feature Tip: Add private address tag to any address under My Name Tag !
Overview
Max Total Supply
10,000 NFFMINT
Holders
195
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 NFFMINTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
nonFungibleFungiMintPass
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-31 */ // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.3.2 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol // OpenZeppelin Contracts v4.3.2 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.3.2 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol // OpenZeppelin Contracts v4.3.2 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.3.2 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.3.2 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.3.2 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.3.2 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.3.2 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.3.2 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.3.2 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @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: balance query for the zero address"); 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: owner query for nonexistent token"); 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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public 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 owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); 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: transfer caller is not 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: transfer caller is not 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) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, 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); } /** * @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); } /** * @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 of token that is not own"); 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); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {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 a {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 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 { 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 {} } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.3.2 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @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(); } } // File: mintPass.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // SafeMath for Safe calculation of UINT256 library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { if (a == 0) { return 0; } c = a * b; require(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; require(c >= a); return c; } } contract nonFungibleFungiMintPass is ERC721Enumerable, Ownable { /* Created by: 0xInuarashi Discord: 0xInuarashi#1234 Twitter: https://twitter.com/0xinuarashi */ constructor() payable ERC721("NonFungibleFungiMintPass", "NFFMINT") {} // Initialize SafeMath library for UINT using SafeMath for uint; // General NFT Variables uint public maxTokens = 10000; uint public tokensReservedForWhitelist = 6695; uint public tokensMintedForWhitelist = 0; uint public tokensReservedForDutchAuction = 3000; uint public tokensMintedForDutchAuction = 0; uint public tokensReservedForReserved = 305; uint public tokensMintedForReserved = 0; string internal baseTokenURI; string internal baseTokenURI_EXT; event MintAsOwner(address indexed to, uint tokenId); event MintWhitelist(address indexed to, uint tokenId); event MintDutchAuction(address indexed to, uint price, uint tokenId); event MintRolloverSale(address indexed to, uint tokenId); // Modifiers modifier onlySender { require (msg.sender == tx.origin, "No smart contracts!"); _; } // Contract Governance mapping(address => bool) internal shareholderToUnlockGovernance; address internal Shareholder_1 = 0x9eEFBb6759E48aAafd8a49d825abFdD0B22d5aD1; address internal Shareholder_2 = 0x506aeaEb48cA2E4145910606a6Fe97f294477d1B; address internal Shareholder_3 = 0x2f3Db2A40C01d1fDd6Fd4ac6040684292B8807e8; address internal Shareholder_4 = 0x458E0c06506eabE9C21074A46E7fAb70672D6205; address internal Shareholder_5 = 0x2cF855E17bD28Bb34982Ca1E4371ef7d3E6817e1; address internal Shareholder_6 = 0xB4C84F2848ba2FF988f4Ca33A5b37f0FCC4a60c2; address internal Shareholder_7 = 0x1eD3D146cb5945e1C894A70013Ed83F95693EA22; uint internal Shareholder_1_Share = 7; uint internal Shareholder_2_Share = 7; uint internal Shareholder_3_Share = 21; uint internal Shareholder_4_Share = 35; uint internal Shareholder_5_Share = 12; uint internal Shareholder_6_Share = 10; uint internal Shareholder_7_Share = 8; // Receive Ether event Received(address from, uint amount); receive() external payable { emit Received(msg.sender, msg.value); } // Withdraw Ether function withdrawEther() public onlyOwner { uint _totalETH = address(this).balance; uint _Shareholder_1_ETH = ((_totalETH * Shareholder_1_Share) / 100); uint _Shareholder_2_ETH = ((_totalETH * Shareholder_2_Share) / 100); uint _Shareholder_3_ETH = ((_totalETH * Shareholder_3_Share) / 100); uint _Shareholder_4_ETH = ((_totalETH * Shareholder_4_Share) / 100); uint _Shareholder_5_ETH = ((_totalETH * Shareholder_5_Share) / 100); uint _Shareholder_6_ETH = ((_totalETH * Shareholder_6_Share) / 100); uint _Shareholder_7_ETH = ((_totalETH * Shareholder_7_Share) / 100); payable(Shareholder_1).transfer(_Shareholder_1_ETH); payable(Shareholder_2).transfer(_Shareholder_2_ETH); payable(Shareholder_3).transfer(_Shareholder_3_ETH); payable(Shareholder_4).transfer(_Shareholder_4_ETH); payable(Shareholder_5).transfer(_Shareholder_5_ETH); payable(Shareholder_6).transfer(_Shareholder_6_ETH); payable(Shareholder_7).transfer(_Shareholder_7_ETH); } function viewWithdrawEtherAmounts() public view onlyOwner returns (uint[] memory) { uint _totalETH = address(this).balance; uint[] memory _ethToSendArray = new uint[](9); uint _Shareholder_1_ETH = ((_totalETH * Shareholder_1_Share) / 100); uint _Shareholder_2_ETH = ((_totalETH * Shareholder_2_Share) / 100); uint _Shareholder_3_ETH = ((_totalETH * Shareholder_3_Share) / 100); uint _Shareholder_4_ETH = ((_totalETH * Shareholder_4_Share) / 100); uint _Shareholder_5_ETH = ((_totalETH * Shareholder_5_Share) / 100); uint _Shareholder_6_ETH = ((_totalETH * Shareholder_6_Share) / 100); uint _Shareholder_7_ETH = ((_totalETH * Shareholder_7_Share) / 100); _ethToSendArray[0] = _Shareholder_1_ETH; _ethToSendArray[1] = _Shareholder_2_ETH; _ethToSendArray[2] = _Shareholder_3_ETH; _ethToSendArray[3] = _Shareholder_4_ETH; _ethToSendArray[4] = _Shareholder_5_ETH; _ethToSendArray[5] = _Shareholder_6_ETH; _ethToSendArray[6] = _Shareholder_7_ETH; _ethToSendArray[7] = _totalETH; // Total ETH _ethToSendArray[8] = _Shareholder_1_ETH + _Shareholder_2_ETH + _Shareholder_3_ETH + _Shareholder_4_ETH + _Shareholder_5_ETH + _Shareholder_6_ETH + _Shareholder_7_ETH; // Total ETH added from shareholders return _ethToSendArray; } // Emergency Withdraw -- Tested and working! // Governance Functions // It looks super hardcoded but I guess it's okay for something like this. modifier onlyShareholder { require(msg.sender == Shareholder_1 || msg.sender == Shareholder_2 || msg.sender == Shareholder_3 || msg.sender == Shareholder_4 || msg.sender == Shareholder_5 || msg.sender == Shareholder_6 || msg.sender == Shareholder_7, "You are not a shareholder!"); _; } function unlockEmergencyFunctionAsShareholder() public onlyShareholder { shareholderToUnlockGovernance[msg.sender] = true; } modifier emergencyOnly { require(shareholderToUnlockGovernance[Shareholder_1] && shareholderToUnlockGovernance[Shareholder_2] && shareholderToUnlockGovernance[Shareholder_3] && shareholderToUnlockGovernance[Shareholder_4] && shareholderToUnlockGovernance[Shareholder_5] && shareholderToUnlockGovernance[Shareholder_6] && shareholderToUnlockGovernance[Shareholder_7], "The emergency function has not been unlocked!"); _; } function emergencyWithdrawEther() public onlyOwner emergencyOnly { payable(msg.sender).transfer(address(this).balance); } // Check Governance View function function checkGovernanceStatus(address address_) public view onlyShareholder returns (bool) { return shareholderToUnlockGovernance[address_]; } ////////// Minting ///////////// // Owner Mint function ownerMintMany(address address_, uint amount_) public onlyOwner { require(tokensReservedForReserved >= tokensMintedForReserved + amount_, "No more reserved tokens!"); tokensMintedForReserved += amount_; // increment tokens minted for reserved for (uint i = 0; i < amount_; i++) { uint _mintId = totalSupply(); _mint(address_, _mintId); emit MintAsOwner(address_, _mintId); } } function ownerMint(address address_) public onlyOwner { require(tokensReservedForReserved > tokensMintedForReserved, "No more reserved tokens!"); tokensMintedForReserved++; // increment tokens minted for reserved uint _mintId = totalSupply(); _mint(address_, _mintId); emit MintAsOwner(address_, _mintId); } // Whitelist Items uint public addressesWhitelisted = 0; // tracker for whitelist amount uint public whiteListPrice = 0.08 ether; // fixed price for whitelisted addresses mapping(address => uint) public addressToWhitelistQuota; // mapping for whitelist to quota mapping(address => uint) public addressToWhitelistMinted; // mapping for whitelist to minted bool public whiteListMintEnabled; modifier whiteListMint { require(whiteListMintEnabled, "Whitelist Mints are not enabled yet!"); _; } // Whitelist Functions function setWhiteListMintStatus(bool bool_) public onlyOwner { whiteListMintEnabled = bool_; } function addAddressToWhitelist(address[] memory addresses_) public onlyOwner { uint _amountOfAddresses = addresses_.length; for (uint i = 0; i < _amountOfAddresses; i++) { addressToWhitelistQuota[addresses_[i]] = 1; // record the whitelisted address and quota } addressesWhitelisted += _amountOfAddresses; // increase tracker by amount of whitelisted addreses } function checkWhitelistArrayIsUnique(address[] memory addresses_) public view onlyOwner returns (bool) { uint _amountOfAddresses = addresses_.length; for (uint i = 0; i < _amountOfAddresses; i++) { if (addressToWhitelistQuota[addresses_[i]] == 1) { return false; } } return true; } function checkWhitelistArrayIsAllUnclaimed(address[] memory addresses_) public view onlyOwner returns (bool) { uint _amountOfAddresses = addresses_.length; for (uint i = 0; i < _amountOfAddresses; i++) { if (addressToWhitelistMinted[msg.sender] != 0) { return false; } } return true; } function mintWhitelist() public payable onlySender whiteListMint { require(addressToWhitelistQuota[msg.sender] > 0, "You are not whitelisted!"); require(addressToWhitelistMinted[msg.sender] == 0, "You have no more whitelist mints left!"); require(msg.value == whiteListPrice, "Invalid value sent!"); require(tokensReservedForWhitelist > tokensMintedForWhitelist, "No more whitelist tokens!"); require(maxTokens > totalSupply(), "No more tokens remaining!"); addressToWhitelistMinted[msg.sender]++; // increments the tracker so that they cannot mint again tokensMintedForWhitelist++; // increments tracker of how many tokens have been minted from whitelist uint _mintId = totalSupply(); _mint(msg.sender, _mintId); emit MintWhitelist(msg.sender, _mintId); } // Merkle Tree Whitelisting bytes32 public merkleRoot = 0x57c359b719e25852692060d2b4d8ce73ad9fea9406622eab2d3cb352cf46373c; function setMerkleRoot(bytes32 merkleRoot_) public onlyOwner { merkleRoot = merkleRoot_; } function isMerkleWhitelisted(bytes32[] memory proof_) public view returns (bool) { bytes32 _leaf = keccak256(abi.encodePacked(msg.sender)); for (uint i = 0; i < proof_.length; i++) { _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) : keccak256(abi.encodePacked(proof_[i], _leaf)); } return _leaf == merkleRoot; } function mintWhitelistMerkleTree(bytes32[] memory proof_) public payable onlySender whiteListMint { require(isMerkleWhitelisted(proof_), "You are not whitelisted!"); require(addressToWhitelistMinted[msg.sender] == 0, "You have no more whitelist mints left!"); require(msg.value == whiteListPrice, "Invalid value sent!"); require(tokensReservedForWhitelist > tokensMintedForWhitelist, "No more whitelist tokens!"); require(maxTokens > totalSupply(), "No more tokens remaining!"); addressToWhitelistMinted[msg.sender]++; // increments the tracker so that they cannot mint again tokensMintedForWhitelist++; // increments tracker of how many tokens have been minted from whitelist uint _mintId = totalSupply(); _mint(msg.sender, _mintId); emit MintWhitelist(msg.sender, _mintId); } // Dutch Auction Items uint public dutchEndingPrice = 0.08 ether; uint public dutchPriceAdditional; // = 2.02 ether, record the additional price of dutch and deduct uint public dutchStartTime; // record the start time uint public dutchDuration; // record the duration uint public dutchEndTime; // record the end time bool public dutchAuctionStarted; // boolean for dutch auction modifier dutchAuction { require(dutchAuctionStarted && block.timestamp >= dutchStartTime, "Dutch auction has not started yet!"); _; } function setDutchAuctionStartStatus(bool bool_) public onlyOwner { dutchAuctionStarted = bool_; } // Dutch Action Initialize function setDutchAuction(uint dutchPriceAdditional_, uint dutchStartTime_, uint dutchDuration_) public onlyOwner { dutchPriceAdditional = dutchPriceAdditional_; // set the additional price of dutch to deduct dutchStartTime = dutchStartTime_; // record the current start time as UNIX timestamp dutchDuration = dutchDuration_; // record the duration of the dutch in order to deduct dutchEndTime = dutchStartTime.add(dutchDuration); // record for safekeeping the ending time } // Dutch Auction Functions function getTimeElapsed() public view returns (uint) { return dutchStartTime > 0 ? dutchStartTime.add(dutchDuration) >= block.timestamp ? block.timestamp.sub(dutchStartTime) : dutchDuration : 0; // this value will end at dutchDuration as maximum. } function getTimeRemaining() public view returns (uint) { return dutchDuration.sub(getTimeElapsed()); } function getAdditionalPrice() public view returns (uint) { return dutchDuration.sub(getTimeElapsed()).mul(dutchPriceAdditional).div(dutchDuration); // magic equation to calculate additional price on top of ending price } function getCurrentDutchPrice() public view returns (uint) { return dutchEndingPrice.add(getAdditionalPrice()); } // untested function mintDutchAuctionMany(uint amount_) public payable onlySender dutchAuction { require(tokensReservedForDutchAuction >= tokensMintedForDutchAuction + amount_, "No more tokens for Dutch Auction!"); require(maxTokens >= totalSupply() + amount_, "No more tokens remaining!"); require(5 >= amount_, "You can only mint up to 5 per transaction!"); require(msg.value >= getCurrentDutchPrice() * amount_, "Invalid value sent!"); tokensMintedForDutchAuction += amount_; // increase tokens minted for dutch auction tracker for (uint i = 0; i < amount_; i++) { uint _mintId = totalSupply(); uint _currentPrice = getCurrentDutchPrice(); _mint(msg.sender, _mintId); emit MintDutchAuction(msg.sender, _currentPrice, _mintId); } } function mintDutchAuction() public payable onlySender dutchAuction { require(tokensReservedForDutchAuction > tokensMintedForDutchAuction, "No more tokens for Dutch Auction!"); require(maxTokens > totalSupply(), "No more tokens remaining!"); require(msg.value >= getCurrentDutchPrice(), "Invalid value sent!"); tokensMintedForDutchAuction++; // increase tokens minted for dutch auction tracker uint _mintId = totalSupply(); uint _currentPrice = getCurrentDutchPrice(); _mint(msg.sender, _mintId); emit MintDutchAuction(msg.sender, _currentPrice, _mintId); } // Rollover Sale Items uint public rolloverSalePrice; uint public rolloverSaleStartTime; bool public rolloverSaleStarted; uint public rolloverSaleTokensMinted; modifier rolloverSale { require(rolloverSaleStarted && block.timestamp >= rolloverSaleStartTime, "Rollover sale has not started yet!"); _; } // Rollover Sale Functions function setRolloverSalePrice(uint price_) public onlyOwner { rolloverSalePrice = price_; } function setRolloverSaleStatus(uint rolloverSaleStartTime_, bool bool_) public onlyOwner { require(rolloverSalePrice != 0, "You have not set a rollover sale price!"); rolloverSaleStartTime = rolloverSaleStartTime_; rolloverSaleStarted = bool_; } function mintRolloverSaleMany(uint amount_) public payable onlySender rolloverSale { require(maxTokens >= totalSupply() + amount_, "No remaining tokens left!"); require(5 >= amount_, "You can only mint up to 5 per transaction!"); require(msg.value == rolloverSalePrice * amount_, "Invalid value sent!"); rolloverSaleTokensMinted += amount_; // add to tracker of public sale tokens minted for (uint i = 0; i < amount_; i++) { uint _mintId = totalSupply(); _mint(msg.sender, _mintId); emit MintRolloverSale(msg.sender, _mintId); } } function mintRolloverSale() public payable onlySender rolloverSale { require(maxTokens > totalSupply(), "No remaining tokens left!"); require(msg.value == rolloverSalePrice, "Invalid value sent!"); rolloverSaleTokensMinted++; // add to tracker of public sale tokens minted uint _mintId = totalSupply(); _mint(msg.sender, _mintId); emit MintRolloverSale(msg.sender, _mintId); } // General NFT Administration function setBaseTokenURI(string memory uri_) external onlyOwner { baseTokenURI = uri_; } function setBaseTokenURI_EXT(string memory ext_) external onlyOwner { baseTokenURI_EXT = ext_; } function tokenURI(uint tokenId_) public view override returns (string memory) { require(_exists(tokenId_), "Query for non-existent token!"); return string(abi.encodePacked(baseTokenURI, Strings.toString(tokenId_), baseTokenURI_EXT)); } function walletOfOwner(address address_) public view returns (uint[] memory) { uint _balance = balanceOf(address_); // get balance of address uint[] memory _tokenIds = new uint[](_balance); // initialize array for (uint i = 0; i < _balance; i++) { _tokenIds[i] = tokenOfOwnerByIndex(address_, i); } return _tokenIds; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","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":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MintAsOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MintDutchAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MintRolloverSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MintWhitelist","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":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"addresses_","type":"address[]"}],"name":"addAddressToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToWhitelistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToWhitelistQuota","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addressesWhitelisted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"address_","type":"address"}],"name":"checkGovernanceStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses_","type":"address[]"}],"name":"checkWhitelistArrayIsAllUnclaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses_","type":"address[]"}],"name":"checkWhitelistArrayIsUnique","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dutchAuctionStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dutchDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dutchEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dutchEndingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dutchPriceAdditional","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dutchStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdditionalPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentDutchPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTimeElapsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTimeRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isMerkleWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintDutchAuction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mintDutchAuctionMany","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintRolloverSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mintRolloverSaleMany","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"mintWhitelistMerkleTree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"ownerMintMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rolloverSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rolloverSaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rolloverSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rolloverSaleTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"uri_","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"ext_","type":"string"}],"name":"setBaseTokenURI_EXT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dutchPriceAdditional_","type":"uint256"},{"internalType":"uint256","name":"dutchStartTime_","type":"uint256"},{"internalType":"uint256","name":"dutchDuration_","type":"uint256"}],"name":"setDutchAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setDutchAuctionStartStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setRolloverSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rolloverSaleStartTime_","type":"uint256"},{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setRolloverSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setWhiteListMintStatus","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":"tokensMintedForDutchAuction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMintedForReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMintedForWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensReservedForDutchAuction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensReservedForReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensReservedForWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockEmergencyFunctionAsShareholder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"viewWithdrawEtherAmounts","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
612710600b55611a27600c9081556000600d819055610bb8600e55600f8190556101316010556011819055601580546001600160a01b0319908116739eefbb6759e48aaafd8a49d825abfdd0b22d5ad117825560168054821673506aeaeb48ca2e4145910606a6fe97f294477d1b179055601780548216732f3db2a40c01d1fdd6fd4ac6040684292b8807e817905560188054821673458e0c06506eabe9c21074a46e7fab70672d6205178155601980548316732cf855e17bd28bb34982ca1e4371ef7d3e6817e1179055601a8054831673b4c84f2848ba2ff988f4ca33a5b37f0fcc4a60c2179055601b8054909216731ed3d146cb5945e1c894a70013ed83f95693ea22179091556007601c819055601d819055601e929092556023601f819055602094909455600a60215560086022559282905567011c37937e08000060248190557f57c359b719e25852692060d2b4d8ce73ad9fea9406622eab2d3cb352cf46373c60285560295560808381527f4e6f6e46756e6769626c6546756e67694d696e7450617373000000000000000060a090815261010060405260c0928352661391919352539560ca1b60e05290939192620001c0929091906200024f565b508051620001d69060019060208401906200024f565b505050620001f3620001ed620001f960201b60201c565b620001fd565b62000332565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200025d90620002f5565b90600052602060002090601f016020900481019282620002815760008555620002cc565b82601f106200029c57805160ff1916838001178555620002cc565b82800160010185558215620002cc579182015b82811115620002cc578251825591602001919060010190620002af565b50620002da929150620002de565b5090565b5b80821115620002da5760008155600101620002df565b600181811c908216806200030a57607f821691505b602082108114156200032c57634e487b7160e01b600052602260045260246000fd5b50919050565b61433980620003426000396000f3fe60806040526004361061041f5760003560e01c806370a082311161021e578063c507104a11610123578063dac6270d116100ab578063e07353ae1161007a578063e07353ae14610ba5578063e831574214610bbb578063e985e9c514610bd1578063f2fde38b14610c1a578063fc790b1e14610c3a57600080fd5b8063dac6270d14610b4b578063db8362c514610b60578063dc92f8f014610b76578063dd79331f14610b8b57600080fd5b8063cb062e47116100f2578063cb062e4714610ab5578063d345ad7214610ac8578063d3bcbb3c14610ade578063d577fec614610afe578063d854d1a214610b2b57600080fd5b8063c507104a14610a3f578063c77eb89c14610a55578063c82da95414610a75578063c87b56dd14610a9557600080fd5b806395d89b41116101a6578063a69d9c4711610175578063a69d9c47146109ba578063b88d4fde146109cf578063b95032f9146109ef578063be36538314610a09578063c2dd690314610a2957600080fd5b806395d89b411461094f578063a22cb46514610964578063a4979a9c14610984578063a64e45001461099a57600080fd5b806378934e83116101ed57806378934e83146108d35780637cb64759146108e95780638243a29c1461090957806388685cbd1461091e5780638da5cb5b1461093157600080fd5b806370a0823114610873578063715018a6146108935780637362377b146108a85780637756837c146108bd57600080fd5b80632f745c591161032457806348190ff6116102ac57806350339ace1161027b57806350339ace146107fb578063514dba1e146108115780635cbd3a7e146108275780636352211e1461083d578063685756851461085d57600080fd5b806348190ff6146107905780634e464238146107b05780634f6ccce7146107c65780634faa2d54146107e657600080fd5b80633cc090de116102f35780633cc090de14610700578063403786881461071a578063404907ea1461073a57806342842e0e14610750578063438b63001461077057600080fd5b80632f745c591461068d57806330176e13146106ad57806331a8a44d146106cd578063324ce984146106e057600080fd5b806315b6ff27116103a75780632379c285116103765780632379c2851461061957806323b872dd1461062f578063275f3a2f1461064f5780632d3df31f1461066f5780632eb4a7ab1461067757600080fd5b806315b6ff27146105ac57806318160ddd146105c25780631e3bcc8e146105d757806322f14762146105f757600080fd5b806306fdde03116103ee57806306fdde03146104fd578063075026d01461051f578063081812fc14610534578063095ea7b31461056c5780630f1695171461058c57600080fd5b806301ffc9a71461046357806302ffaed11461049857806305dc0487146104ba57806305fab7a5146104c257600080fd5b3661045e57604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561046f57600080fd5b5061048361047e366004613bd1565b610c42565b60405190151581526020015b60405180910390f35b3480156104a457600080fd5b506104b86104b3366004613c0b565b610c6d565b005b6104b8610cb7565b3480156104ce57600080fd5b506104ef6104dd366004613913565b60266020526000908152604090205481565b60405190815260200161048f565b34801561050957600080fd5b50610512610deb565b60405161048f9190613e1d565b34801561052b57600080fd5b506104ef610e7d565b34801561054057600080fd5b5061055461054f366004613bb8565b610eb0565b6040516001600160a01b03909116815260200161048f565b34801561057857600080fd5b506104b8610587366004613a43565b610f45565b34801561059857600080fd5b506104836105a7366004613a6d565b61105b565b3480156105b857600080fd5b506104ef602c5481565b3480156105ce57600080fd5b506008546104ef565b3480156105e357600080fd5b506104b86105f2366004613913565b611104565b34801561060357600080fd5b5061060c6111e3565b60405161048f9190613dd9565b34801561062557600080fd5b506104ef600e5481565b34801561063b57600080fd5b506104b861064a366004613961565b611476565b34801561065b57600080fd5b506104b861066a366004613c54565b6114a7565b6104b8611549565b34801561068357600080fd5b506104ef60285481565b34801561069957600080fd5b506104ef6106a8366004613a43565b611726565b3480156106b957600080fd5b506104b86106c8366004613c0b565b6117bc565b6104b86106db366004613bb8565b6117f9565b3480156106ec57600080fd5b506104b86106fb366004613a43565b611978565b34801561070c57600080fd5b506027546104839060ff1681565b34801561072657600080fd5b506104b8610735366004613bb8565b611a8c565b34801561074657600080fd5b506104ef60305481565b34801561075c57600080fd5b506104b861076b366004613961565b611abb565b34801561077c57600080fd5b5061060c61078b366004613913565b611ad6565b34801561079c57600080fd5b506104b86107ab366004613b9d565b611b78565b3480156107bc57600080fd5b506104ef60115481565b3480156107d257600080fd5b506104ef6107e1366004613bb8565b611bb5565b3480156107f257600080fd5b506104ef611c48565b34801561080757600080fd5b506104ef600d5481565b34801561081d57600080fd5b506104ef600f5481565b34801561083357600080fd5b506104ef60235481565b34801561084957600080fd5b50610554610858366004613bb8565b611c8c565b34801561086957600080fd5b506104ef60245481565b34801561087f57600080fd5b506104ef61088e366004613913565b611d03565b34801561089f57600080fd5b506104b8611d8a565b3480156108b457600080fd5b506104b8611dc0565b3480156108c957600080fd5b506104ef60295481565b3480156108df57600080fd5b506104ef60105481565b3480156108f557600080fd5b506104b8610904366004613bb8565b612065565b34801561091557600080fd5b506104b8612094565b6104b861092c366004613b11565b612188565b34801561093d57600080fd5b50600a546001600160a01b0316610554565b34801561095b57600080fd5b50610512612357565b34801561097057600080fd5b506104b861097f366004613a19565b612366565b34801561099057600080fd5b506104ef600c5481565b3480156109a657600080fd5b506104b86109b5366004613c77565b612371565b3480156109c657600080fd5b506104ef6123bc565b3480156109db57600080fd5b506104b86109ea36600461399d565b6123d2565b3480156109fb57600080fd5b506031546104839060ff1681565b348015610a1557600080fd5b50610483610a24366004613913565b61240a565b348015610a3557600080fd5b506104ef602b5481565b348015610a4b57600080fd5b506104ef602d5481565b348015610a6157600080fd5b50610483610a70366004613b11565b612504565b348015610a8157600080fd5b506104b8610a90366004613b9d565b612626565b348015610aa157600080fd5b50610512610ab0366004613bb8565b612663565b6104b8610ac3366004613bb8565b6126ff565b348015610ad457600080fd5b506104ef60325481565b348015610aea57600080fd5b506104b8610af9366004613a6d565b61289b565b348015610b0a57600080fd5b506104ef610b19366004613913565b60256020526000908152604090205481565b348015610b3757600080fd5b50610483610b46366004613a6d565b612945565b348015610b5757600080fd5b506104ef6129b0565b348015610b6c57600080fd5b506104ef602a5481565b348015610b8257600080fd5b506104b86129bd565b348015610b9757600080fd5b50602e546104839060ff1681565b348015610bb157600080fd5b506104ef602f5481565b348015610bc757600080fd5b506104ef600b5481565b348015610bdd57600080fd5b50610483610bec36600461392e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610c2657600080fd5b506104b8610c35366004613913565b612b7a565b6104b8612c12565b60006001600160e01b0319821663780e9d6360e01b1480610c675750610c6782612d2f565b92915050565b600a546001600160a01b03163314610ca05760405162461bcd60e51b8152600401610c9790614021565b60405180910390fd5b8051610cb39060139060208401906137fb565b5050565b333214610cd65760405162461bcd60e51b8152600401610c9790613ff4565b602e5460ff168015610cea5750602b544210155b610d065760405162461bcd60e51b8152600401610c9790613e30565b600f54600e5411610d295760405162461bcd60e51b8152600401610c9790614056565b600854600b5411610d4c5760405162461bcd60e51b8152600401610c9790613ec4565b610d546123bc565b341015610d735760405162461bcd60e51b8152600401610c9790613f85565b600f8054906000610d8383614250565b91905055506000610d9360085490565b90506000610d9f6123bc565b9050610dab3383612d7f565b604080518281526020810184905233917fdaa045d42a3e393e68713f4d86f01a118383dbd19b795912cfd9f4394bc3b45091015b60405180910390a25050565b606060008054610dfa90614215565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2690614215565b8015610e735780601f10610e4857610100808354040283529160200191610e73565b820191906000526020600020905b815481529060010190602001808311610e5657829003601f168201915b5050505050905090565b6000610eab602c54610ea5602a54610e9f610e96611c48565b602c5490612ecd565b90612eed565b90612f1d565b905090565b6000818152600260205260408120546001600160a01b0316610f295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c97565b506000908152600460205260409020546001600160a01b031690565b6000610f5082611c8c565b9050806001600160a01b0316836001600160a01b03161415610fbe5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c97565b336001600160a01b0382161480610fda5750610fda8133610bec565b61104c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c97565b6110568383612f29565b505050565b600a546000906001600160a01b031633146110885760405162461bcd60e51b8152600401610c9790614021565b815160005b818110156110f857602560008583815181106110ab576110ab6142c1565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054600114156110e6575060009392505050565b806110f081614250565b91505061108d565b5060019150505b919050565b600a546001600160a01b0316331461112e5760405162461bcd60e51b8152600401610c9790614021565b6011546010541161117c5760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520726573657276656420746f6b656e732160401b6044820152606401610c97565b6011805490600061118c83614250565b9190505550600061119c60085490565b90506111a88282612d7f565b816001600160a01b03167f82bff94c69b4a624bb0d25e15735cf4189fdc4706e6b6806c94886b0009f2bdf82604051610ddf91815260200190565b600a546060906001600160a01b031633146112105760405162461bcd60e51b8152600401610c9790614021565b6040805160098082526101408201909252479160009190602082016101208036833701905050905060006064601c548461124a91906141b3565b611254919061419f565b905060006064601d548561126891906141b3565b611272919061419f565b905060006064601e548661128691906141b3565b611290919061419f565b905060006064601f54876112a491906141b3565b6112ae919061419f565b905060006064602054886112c291906141b3565b6112cc919061419f565b905060006064602154896112e091906141b3565b6112ea919061419f565b9050600060646022548a6112fe91906141b3565b611308919061419f565b9050868860008151811061131e5761131e6142c1565b602002602001018181525050858860018151811061133e5761133e6142c1565b602002602001018181525050848860028151811061135e5761135e6142c1565b602002602001018181525050838860038151811061137e5761137e6142c1565b602002602001018181525050828860048151811061139e5761139e6142c1565b60200260200101818152505081886005815181106113be576113be6142c1565b60200260200101818152505080886006815181106113de576113de6142c1565b60200260200101818152505088886007815181106113fe576113fe6142c1565b602090810291909101015280828486886114188b8d614187565b6114229190614187565b61142c9190614187565b6114369190614187565b6114409190614187565b61144a9190614187565b8860088151811061145d5761145d6142c1565b6020908102919091010152509597505050505050505090565b6114803382612f97565b61149c5760405162461bcd60e51b8152600401610c9790614097565b61105683838361308e565b600a546001600160a01b031633146114d15760405162461bcd60e51b8152600401610c9790614021565b602f546115305760405162461bcd60e51b815260206004820152602760248201527f596f752068617665206e6f7420736574206120726f6c6c6f7665722073616c656044820152662070726963652160c81b6064820152608401610c97565b6030919091556031805460ff1916911515919091179055565b3332146115685760405162461bcd60e51b8152600401610c9790613ff4565b60275460ff1661158a5760405162461bcd60e51b8152600401610c9790613f41565b336000908152602560205260409020546115e15760405162461bcd60e51b8152602060048201526018602482015277596f7520617265206e6f742077686974656c69737465642160401b6044820152606401610c97565b336000908152602660205260409020541561160e5760405162461bcd60e51b8152600401610c9790613efb565b602454341461162f5760405162461bcd60e51b8152600401610c9790613f85565b600d54600c541161167e5760405162461bcd60e51b81526020600482015260196024820152784e6f206d6f72652077686974656c69737420746f6b656e732160381b6044820152606401610c97565b600854600b54116116a15760405162461bcd60e51b8152600401610c9790613ec4565b3360009081526026602052604081208054916116bc83614250565b9091555050600d80549060006116d183614250565b919050555060006116e160085490565b90506116ed3382612d7f565b60405181815233907fda47e427fb170a95b4539ea720c3caf8ad5a319335b1a85fb3a8db83a61159c0906020015b60405180910390a250565b600061173183611d03565b82106117935760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c97565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146117e65760405162461bcd60e51b8152600401610c9790614021565b8051610cb39060129060208401906137fb565b3332146118185760405162461bcd60e51b8152600401610c9790613ff4565b60315460ff16801561182c57506030544210155b6118485760405162461bcd60e51b8152600401610c9790613fb2565b8061185260085490565b61185c9190614187565b600b5410156118a95760405162461bcd60e51b81526020600482015260196024820152784e6f2072656d61696e696e6720746f6b656e73206c6566742160381b6044820152606401610c97565b80600510156118ca5760405162461bcd60e51b8152600401610c97906140e8565b80602f546118d891906141b3565b34146118f65760405162461bcd60e51b8152600401610c9790613f85565b80603260008282546119089190614187565b90915550600090505b81811015610cb357600061192460085490565b90506119303382612d7f565b60405181815233907f84c3d13e58f975be443cb619b0cd52382e886629cd5f453f4d9c2b8e45de10959060200160405180910390a2508061197081614250565b915050611911565b600a546001600160a01b031633146119a25760405162461bcd60e51b8152600401610c9790614021565b806011546119b09190614187565b60105410156119fc5760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520726573657276656420746f6b656e732160401b6044820152606401610c97565b8060116000828254611a0e9190614187565b90915550600090505b81811015611056576000611a2a60085490565b9050611a368482612d7f565b836001600160a01b03167f82bff94c69b4a624bb0d25e15735cf4189fdc4706e6b6806c94886b0009f2bdf82604051611a7191815260200190565b60405180910390a25080611a8481614250565b915050611a17565b600a546001600160a01b03163314611ab65760405162461bcd60e51b8152600401610c9790614021565b602f55565b611056838383604051806020016040528060008152506123d2565b60606000611ae383611d03565b905060008167ffffffffffffffff811115611b0057611b006142d7565b604051908082528060200260200182016040528015611b29578160200160208202803683370190505b50905060005b82811015611b7057611b418582611726565b828281518110611b5357611b536142c1565b602090810291909101015280611b6881614250565b915050611b2f565b509392505050565b600a546001600160a01b03163314611ba25760405162461bcd60e51b8152600401610c9790614021565b6027805460ff1916911515919091179055565b6000611bc060085490565b8210611c235760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c97565b60088281548110611c3657611c366142c1565b90600052602060002001549050919050565b600080602b5411611c595750600090565b42611c71602c54602b5461323990919063ffffffff16565b1015611c7e5750602c5490565b602b54610eab904290612ecd565b6000818152600260205260408120546001600160a01b031680610c675760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c97565b60006001600160a01b038216611d6e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c97565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611db45760405162461bcd60e51b8152600401610c9790614021565b611dbe6000613254565b565b600a546001600160a01b03163314611dea5760405162461bcd60e51b8152600401610c9790614021565b601c544790600090606490611dff90846141b3565b611e09919061419f565b905060006064601d5484611e1d91906141b3565b611e27919061419f565b905060006064601e5485611e3b91906141b3565b611e45919061419f565b905060006064601f5486611e5991906141b3565b611e63919061419f565b90506000606460205487611e7791906141b3565b611e81919061419f565b90506000606460215488611e9591906141b3565b611e9f919061419f565b90506000606460225489611eb391906141b3565b611ebd919061419f565b6015546040519192506001600160a01b03169088156108fc029089906000818181858888f19350505050158015611ef8573d6000803e3d6000fd5b506016546040516001600160a01b039091169087156108fc029088906000818181858888f19350505050158015611f33573d6000803e3d6000fd5b506017546040516001600160a01b039091169086156108fc029087906000818181858888f19350505050158015611f6e573d6000803e3d6000fd5b506018546040516001600160a01b039091169085156108fc029086906000818181858888f19350505050158015611fa9573d6000803e3d6000fd5b506019546040516001600160a01b039091169084156108fc029085906000818181858888f19350505050158015611fe4573d6000803e3d6000fd5b50601a546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561201f573d6000803e3d6000fd5b50601b546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561205a573d6000803e3d6000fd5b505050505050505050565b600a546001600160a01b0316331461208f5760405162461bcd60e51b8152600401610c9790614021565b602855565b6015546001600160a01b03163314806120b757506016546001600160a01b031633145b806120cc57506017546001600160a01b031633145b806120e157506018546001600160a01b031633145b806120f657506019546001600160a01b031633145b8061210b5750601a546001600160a01b031633145b806121205750601b546001600160a01b031633145b61216c5760405162461bcd60e51b815260206004820152601a60248201527f596f7520617265206e6f742061207368617265686f6c646572210000000000006044820152606401610c97565b336000908152601460205260409020805460ff19166001179055565b3332146121a75760405162461bcd60e51b8152600401610c9790613ff4565b60275460ff166121c95760405162461bcd60e51b8152600401610c9790613f41565b6121d281612504565b6122195760405162461bcd60e51b8152602060048201526018602482015277596f7520617265206e6f742077686974656c69737465642160401b6044820152606401610c97565b33600090815260266020526040902054156122465760405162461bcd60e51b8152600401610c9790613efb565b60245434146122675760405162461bcd60e51b8152600401610c9790613f85565b600d54600c54116122b65760405162461bcd60e51b81526020600482015260196024820152784e6f206d6f72652077686974656c69737420746f6b656e732160381b6044820152606401610c97565b600854600b54116122d95760405162461bcd60e51b8152600401610c9790613ec4565b3360009081526026602052604081208054916122f483614250565b9091555050600d805490600061230983614250565b9190505550600061231960085490565b90506123253382612d7f565b60405181815233907fda47e427fb170a95b4539ea720c3caf8ad5a319335b1a85fb3a8db83a61159c090602001610ddf565b606060018054610dfa90614215565b610cb33383836132a6565b600a546001600160a01b0316331461239b5760405162461bcd60e51b8152600401610c9790614021565b602a839055602b829055602c8190556123b48282613239565b602d55505050565b6000610eab6123c9610e7d565b60295490613239565b6123dc3383612f97565b6123f85760405162461bcd60e51b8152600401610c9790614097565b61240484848484613375565b50505050565b6015546000906001600160a01b031633148061243057506016546001600160a01b031633145b8061244557506017546001600160a01b031633145b8061245a57506018546001600160a01b031633145b8061246f57506019546001600160a01b031633145b806124845750601a546001600160a01b031633145b806124995750601b546001600160a01b031633145b6124e55760405162461bcd60e51b815260206004820152601a60248201527f596f7520617265206e6f742061207368617265686f6c646572210000000000006044820152606401610c97565b506001600160a01b031660009081526014602052604090205460ff1690565b6040516bffffffffffffffffffffffff193360601b166020820152600090819060340160405160208183030381529060405280519060200120905060005b835181101561261b5783818151811061255d5761255d6142c1565b602002602001015182106125bb5783818151811061257d5761257d6142c1565b6020026020010151826040516020016125a0929190918252602082015260400190565b60405160208183030381529060405280519060200120612607565b818482815181106125ce576125ce6142c1565b60200260200101516040516020016125f0929190918252602082015260400190565b604051602081830303815290604052805190602001205b91508061261381614250565b915050612542565b506028541492915050565b600a546001600160a01b031633146126505760405162461bcd60e51b8152600401610c9790614021565b602e805460ff1916911515919091179055565b6000818152600260205260409020546060906001600160a01b03166126ca5760405162461bcd60e51b815260206004820152601d60248201527f517565727920666f72206e6f6e2d6578697374656e7420746f6b656e210000006044820152606401610c97565b60126126d5836133a8565b60136040516020016126e993929190613d69565b6040516020818303038152906040529050919050565b33321461271e5760405162461bcd60e51b8152600401610c9790613ff4565b602e5460ff1680156127325750602b544210155b61274e5760405162461bcd60e51b8152600401610c9790613e30565b80600f5461275c9190614187565b600e54101561277d5760405162461bcd60e51b8152600401610c9790614056565b8061278760085490565b6127919190614187565b600b5410156127b25760405162461bcd60e51b8152600401610c9790613ec4565b80600510156127d35760405162461bcd60e51b8152600401610c97906140e8565b806127dc6123bc565b6127e691906141b3565b3410156128055760405162461bcd60e51b8152600401610c9790613f85565b80600f60008282546128179190614187565b90915550600090505b81811015610cb357600061283360085490565b9050600061283f6123bc565b905061284b3383612d7f565b604080518281526020810184905233917fdaa045d42a3e393e68713f4d86f01a118383dbd19b795912cfd9f4394bc3b450910160405180910390a25050808061289390614250565b915050612820565b600a546001600160a01b031633146128c55760405162461bcd60e51b8152600401610c9790614021565b805160005b81811015612929576001602560008584815181106128ea576128ea6142c1565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550808061292190614250565b9150506128ca565b50806023600082825461293c9190614187565b90915550505050565b600a546000906001600160a01b031633146129725760405162461bcd60e51b8152600401610c9790614021565b815160005b818110156110f857336000908152602660205260409020541561299e575060009392505050565b806129a881614250565b915050612977565b6000610eab610e96611c48565b600a546001600160a01b031633146129e75760405162461bcd60e51b8152600401610c9790614021565b6015546001600160a01b031660009081526014602052604090205460ff168015612a2b57506016546001600160a01b031660009081526014602052604090205460ff165b8015612a5157506017546001600160a01b031660009081526014602052604090205460ff165b8015612a7757506018546001600160a01b031660009081526014602052604090205460ff165b8015612a9d57506019546001600160a01b031660009081526014602052604090205460ff165b8015612ac35750601a546001600160a01b031660009081526014602052604090205460ff165b8015612ae95750601b546001600160a01b031660009081526014602052604090205460ff165b612b4b5760405162461bcd60e51b815260206004820152602d60248201527f54686520656d657267656e63792066756e6374696f6e20686173206e6f74206260448201526c65656e20756e6c6f636b65642160981b6064820152608401610c97565b60405133904780156108fc02916000818181858888f19350505050158015612b77573d6000803e3d6000fd5b50565b600a546001600160a01b03163314612ba45760405162461bcd60e51b8152600401610c9790614021565b6001600160a01b038116612c095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c97565b612b7781613254565b333214612c315760405162461bcd60e51b8152600401610c9790613ff4565b60315460ff168015612c4557506030544210155b612c615760405162461bcd60e51b8152600401610c9790613fb2565b600854600b5411612cb05760405162461bcd60e51b81526020600482015260196024820152784e6f2072656d61696e696e6720746f6b656e73206c6566742160381b6044820152606401610c97565b602f543414612cd15760405162461bcd60e51b8152600401610c9790613f85565b60328054906000612ce183614250565b91905055506000612cf160085490565b9050612cfd3382612d7f565b60405181815233907f84c3d13e58f975be443cb619b0cd52382e886629cd5f453f4d9c2b8e45de10959060200161171b565b60006001600160e01b031982166380ac58cd60e01b1480612d6057506001600160e01b03198216635b5e139f60e01b145b80610c6757506301ffc9a760e01b6001600160e01b0319831614610c67565b6001600160a01b038216612dd55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c97565b6000818152600260205260409020546001600160a01b031615612e3a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c97565b612e46600083836134a6565b6001600160a01b0382166000908152600360205260408120805460019290612e6f908490614187565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600082821115612edc57600080fd5b612ee682846141d2565b9392505050565b600082612efc57506000610c67565b612f0682846141b3565b905081612f13848361419f565b14610c6757600080fd5b6000612ee6828461419f565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612f5e82611c8c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166130105760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c97565b600061301b83611c8c565b9050806001600160a01b0316846001600160a01b031614806130565750836001600160a01b031661304b84610eb0565b6001600160a01b0316145b8061308657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166130a182611c8c565b6001600160a01b0316146131095760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c97565b6001600160a01b03821661316b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c97565b6131768383836134a6565b613181600082612f29565b6001600160a01b03831660009081526003602052604081208054600192906131aa9084906141d2565b90915550506001600160a01b03821660009081526003602052604081208054600192906131d8908490614187565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006132458284614187565b905082811015610c6757600080fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156133085760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c97565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61338084848461308e565b61338c8484848461355e565b6124045760405162461bcd60e51b8152600401610c9790613e72565b6060816133cc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156133f657806133e081614250565b91506133ef9050600a8361419f565b91506133d0565b60008167ffffffffffffffff811115613411576134116142d7565b6040519080825280601f01601f19166020018201604052801561343b576020820181803683370190505b5090505b8415613086576134506001836141d2565b915061345d600a8661426b565b613468906030614187565b60f81b81838151811061347d5761347d6142c1565b60200101906001600160f81b031916908160001a90535061349f600a8661419f565b945061343f565b6001600160a01b038316613501576134fc81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613524565b816001600160a01b0316836001600160a01b03161461352457613524838261366b565b6001600160a01b03821661353b5761105681613708565b826001600160a01b0316826001600160a01b0316146110565761105682826137b7565b60006001600160a01b0384163b1561366057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906135a2903390899088908890600401613d9c565b602060405180830381600087803b1580156135bc57600080fd5b505af19250505080156135ec575060408051601f3d908101601f191682019092526135e991810190613bee565b60015b613646573d80801561361a576040519150601f19603f3d011682016040523d82523d6000602084013e61361f565b606091505b50805161363e5760405162461bcd60e51b8152600401610c9790613e72565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613086565b506001949350505050565b6000600161367884611d03565b61368291906141d2565b6000838152600760205260409020549091508082146136d5576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061371a906001906141d2565b60008381526009602052604081205460088054939450909284908110613742576137426142c1565b906000526020600020015490508060088381548110613763576137636142c1565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061379b5761379b6142ab565b6001900381819060005260206000200160009055905550505050565b60006137c283611d03565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461380790614215565b90600052602060002090601f016020900481019282613829576000855561386f565b82601f1061384257805160ff191683800117855561386f565b8280016001018555821561386f579182015b8281111561386f578251825591602001919060010190613854565b5061387b92915061387f565b5090565b5b8082111561387b5760008155600101613880565b600067ffffffffffffffff8311156138ae576138ae6142d7565b6138c1601f8401601f1916602001614132565b90508281528383830111156138d557600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146110ff57600080fd5b803580151581146110ff57600080fd5b60006020828403121561392557600080fd5b612ee6826138ec565b6000806040838503121561394157600080fd5b61394a836138ec565b9150613958602084016138ec565b90509250929050565b60008060006060848603121561397657600080fd5b61397f846138ec565b925061398d602085016138ec565b9150604084013590509250925092565b600080600080608085870312156139b357600080fd5b6139bc856138ec565b93506139ca602086016138ec565b925060408501359150606085013567ffffffffffffffff8111156139ed57600080fd5b8501601f810187136139fe57600080fd5b613a0d87823560208401613894565b91505092959194509250565b60008060408385031215613a2c57600080fd5b613a35836138ec565b915061395860208401613903565b60008060408385031215613a5657600080fd5b613a5f836138ec565b946020939093013593505050565b60006020808385031215613a8057600080fd5b823567ffffffffffffffff811115613a9757600080fd5b8301601f81018513613aa857600080fd5b8035613abb613ab682614163565b614132565b80828252848201915084840188868560051b8701011115613adb57600080fd5b600094505b83851015613b0557613af1816138ec565b835260019490940193918501918501613ae0565b50979650505050505050565b60006020808385031215613b2457600080fd5b823567ffffffffffffffff811115613b3b57600080fd5b8301601f81018513613b4c57600080fd5b8035613b5a613ab682614163565b80828252848201915084840188868560051b8701011115613b7a57600080fd5b600094505b83851015613b05578035835260019490940193918501918501613b7f565b600060208284031215613baf57600080fd5b612ee682613903565b600060208284031215613bca57600080fd5b5035919050565b600060208284031215613be357600080fd5b8135612ee6816142ed565b600060208284031215613c0057600080fd5b8151612ee6816142ed565b600060208284031215613c1d57600080fd5b813567ffffffffffffffff811115613c3457600080fd5b8201601f81018413613c4557600080fd5b61308684823560208401613894565b60008060408385031215613c6757600080fd5b8235915061395860208401613903565b600080600060608486031215613c8c57600080fd5b505081359360208301359350604090920135919050565b60008151808452613cbb8160208601602086016141e9565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680613ce957607f831692505b6020808410821415613d0b57634e487b7160e01b600052602260045260246000fd5b818015613d1f5760018114613d3057613d5d565b60ff19861689528489019650613d5d565b60008881526020902060005b86811015613d555781548b820152908501908301613d3c565b505084890196505b50505050505092915050565b6000613d758286613ccf565b8451613d858183602089016141e9565b613d9181830186613ccf565b979650505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613dcf90830184613ca3565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613e1157835183529284019291840191600101613df5565b50909695505050505050565b602081526000612ee66020830184613ca3565b60208082526022908201527f44757463682061756374696f6e20686173206e6f742073746172746564207965604082015261742160f01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526019908201527f4e6f206d6f726520746f6b656e732072656d61696e696e672100000000000000604082015260600190565b60208082526026908201527f596f752068617665206e6f206d6f72652077686974656c697374206d696e7473604082015265206c6566742160d01b606082015260800190565b60208082526024908201527f57686974656c697374204d696e747320617265206e6f7420656e61626c6564206040820152637965742160e01b606082015260800190565b602080825260139082015272496e76616c69642076616c75652073656e742160681b604082015260600190565b60208082526022908201527f526f6c6c6f7665722073616c6520686173206e6f742073746172746564207965604082015261742160f01b606082015260800190565b6020808252601390820152724e6f20736d61727420636f6e7472616374732160681b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f4e6f206d6f726520746f6b656e7320666f722044757463682041756374696f6e6040820152602160f81b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602a908201527f596f752063616e206f6e6c79206d696e7420757020746f203520706572207472604082015269616e73616374696f6e2160b01b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561415b5761415b6142d7565b604052919050565b600067ffffffffffffffff82111561417d5761417d6142d7565b5060051b60200190565b6000821982111561419a5761419a61427f565b500190565b6000826141ae576141ae614295565b500490565b60008160001904831182151516156141cd576141cd61427f565b500290565b6000828210156141e4576141e461427f565b500390565b60005b838110156142045781810151838201526020016141ec565b838111156124045750506000910152565b600181811c9082168061422957607f821691505b6020821081141561424a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156142645761426461427f565b5060010190565b60008261427a5761427a614295565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114612b7757600080fdfea2646970667358221220e7745a08d17366ac76bf7bda49fb00d13d8071ce3635041686ce3f5ed313d0d964736f6c63430008070033
Deployed Bytecode
0x60806040526004361061041f5760003560e01c806370a082311161021e578063c507104a11610123578063dac6270d116100ab578063e07353ae1161007a578063e07353ae14610ba5578063e831574214610bbb578063e985e9c514610bd1578063f2fde38b14610c1a578063fc790b1e14610c3a57600080fd5b8063dac6270d14610b4b578063db8362c514610b60578063dc92f8f014610b76578063dd79331f14610b8b57600080fd5b8063cb062e47116100f2578063cb062e4714610ab5578063d345ad7214610ac8578063d3bcbb3c14610ade578063d577fec614610afe578063d854d1a214610b2b57600080fd5b8063c507104a14610a3f578063c77eb89c14610a55578063c82da95414610a75578063c87b56dd14610a9557600080fd5b806395d89b41116101a6578063a69d9c4711610175578063a69d9c47146109ba578063b88d4fde146109cf578063b95032f9146109ef578063be36538314610a09578063c2dd690314610a2957600080fd5b806395d89b411461094f578063a22cb46514610964578063a4979a9c14610984578063a64e45001461099a57600080fd5b806378934e83116101ed57806378934e83146108d35780637cb64759146108e95780638243a29c1461090957806388685cbd1461091e5780638da5cb5b1461093157600080fd5b806370a0823114610873578063715018a6146108935780637362377b146108a85780637756837c146108bd57600080fd5b80632f745c591161032457806348190ff6116102ac57806350339ace1161027b57806350339ace146107fb578063514dba1e146108115780635cbd3a7e146108275780636352211e1461083d578063685756851461085d57600080fd5b806348190ff6146107905780634e464238146107b05780634f6ccce7146107c65780634faa2d54146107e657600080fd5b80633cc090de116102f35780633cc090de14610700578063403786881461071a578063404907ea1461073a57806342842e0e14610750578063438b63001461077057600080fd5b80632f745c591461068d57806330176e13146106ad57806331a8a44d146106cd578063324ce984146106e057600080fd5b806315b6ff27116103a75780632379c285116103765780632379c2851461061957806323b872dd1461062f578063275f3a2f1461064f5780632d3df31f1461066f5780632eb4a7ab1461067757600080fd5b806315b6ff27146105ac57806318160ddd146105c25780631e3bcc8e146105d757806322f14762146105f757600080fd5b806306fdde03116103ee57806306fdde03146104fd578063075026d01461051f578063081812fc14610534578063095ea7b31461056c5780630f1695171461058c57600080fd5b806301ffc9a71461046357806302ffaed11461049857806305dc0487146104ba57806305fab7a5146104c257600080fd5b3661045e57604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561046f57600080fd5b5061048361047e366004613bd1565b610c42565b60405190151581526020015b60405180910390f35b3480156104a457600080fd5b506104b86104b3366004613c0b565b610c6d565b005b6104b8610cb7565b3480156104ce57600080fd5b506104ef6104dd366004613913565b60266020526000908152604090205481565b60405190815260200161048f565b34801561050957600080fd5b50610512610deb565b60405161048f9190613e1d565b34801561052b57600080fd5b506104ef610e7d565b34801561054057600080fd5b5061055461054f366004613bb8565b610eb0565b6040516001600160a01b03909116815260200161048f565b34801561057857600080fd5b506104b8610587366004613a43565b610f45565b34801561059857600080fd5b506104836105a7366004613a6d565b61105b565b3480156105b857600080fd5b506104ef602c5481565b3480156105ce57600080fd5b506008546104ef565b3480156105e357600080fd5b506104b86105f2366004613913565b611104565b34801561060357600080fd5b5061060c6111e3565b60405161048f9190613dd9565b34801561062557600080fd5b506104ef600e5481565b34801561063b57600080fd5b506104b861064a366004613961565b611476565b34801561065b57600080fd5b506104b861066a366004613c54565b6114a7565b6104b8611549565b34801561068357600080fd5b506104ef60285481565b34801561069957600080fd5b506104ef6106a8366004613a43565b611726565b3480156106b957600080fd5b506104b86106c8366004613c0b565b6117bc565b6104b86106db366004613bb8565b6117f9565b3480156106ec57600080fd5b506104b86106fb366004613a43565b611978565b34801561070c57600080fd5b506027546104839060ff1681565b34801561072657600080fd5b506104b8610735366004613bb8565b611a8c565b34801561074657600080fd5b506104ef60305481565b34801561075c57600080fd5b506104b861076b366004613961565b611abb565b34801561077c57600080fd5b5061060c61078b366004613913565b611ad6565b34801561079c57600080fd5b506104b86107ab366004613b9d565b611b78565b3480156107bc57600080fd5b506104ef60115481565b3480156107d257600080fd5b506104ef6107e1366004613bb8565b611bb5565b3480156107f257600080fd5b506104ef611c48565b34801561080757600080fd5b506104ef600d5481565b34801561081d57600080fd5b506104ef600f5481565b34801561083357600080fd5b506104ef60235481565b34801561084957600080fd5b50610554610858366004613bb8565b611c8c565b34801561086957600080fd5b506104ef60245481565b34801561087f57600080fd5b506104ef61088e366004613913565b611d03565b34801561089f57600080fd5b506104b8611d8a565b3480156108b457600080fd5b506104b8611dc0565b3480156108c957600080fd5b506104ef60295481565b3480156108df57600080fd5b506104ef60105481565b3480156108f557600080fd5b506104b8610904366004613bb8565b612065565b34801561091557600080fd5b506104b8612094565b6104b861092c366004613b11565b612188565b34801561093d57600080fd5b50600a546001600160a01b0316610554565b34801561095b57600080fd5b50610512612357565b34801561097057600080fd5b506104b861097f366004613a19565b612366565b34801561099057600080fd5b506104ef600c5481565b3480156109a657600080fd5b506104b86109b5366004613c77565b612371565b3480156109c657600080fd5b506104ef6123bc565b3480156109db57600080fd5b506104b86109ea36600461399d565b6123d2565b3480156109fb57600080fd5b506031546104839060ff1681565b348015610a1557600080fd5b50610483610a24366004613913565b61240a565b348015610a3557600080fd5b506104ef602b5481565b348015610a4b57600080fd5b506104ef602d5481565b348015610a6157600080fd5b50610483610a70366004613b11565b612504565b348015610a8157600080fd5b506104b8610a90366004613b9d565b612626565b348015610aa157600080fd5b50610512610ab0366004613bb8565b612663565b6104b8610ac3366004613bb8565b6126ff565b348015610ad457600080fd5b506104ef60325481565b348015610aea57600080fd5b506104b8610af9366004613a6d565b61289b565b348015610b0a57600080fd5b506104ef610b19366004613913565b60256020526000908152604090205481565b348015610b3757600080fd5b50610483610b46366004613a6d565b612945565b348015610b5757600080fd5b506104ef6129b0565b348015610b6c57600080fd5b506104ef602a5481565b348015610b8257600080fd5b506104b86129bd565b348015610b9757600080fd5b50602e546104839060ff1681565b348015610bb157600080fd5b506104ef602f5481565b348015610bc757600080fd5b506104ef600b5481565b348015610bdd57600080fd5b50610483610bec36600461392e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610c2657600080fd5b506104b8610c35366004613913565b612b7a565b6104b8612c12565b60006001600160e01b0319821663780e9d6360e01b1480610c675750610c6782612d2f565b92915050565b600a546001600160a01b03163314610ca05760405162461bcd60e51b8152600401610c9790614021565b60405180910390fd5b8051610cb39060139060208401906137fb565b5050565b333214610cd65760405162461bcd60e51b8152600401610c9790613ff4565b602e5460ff168015610cea5750602b544210155b610d065760405162461bcd60e51b8152600401610c9790613e30565b600f54600e5411610d295760405162461bcd60e51b8152600401610c9790614056565b600854600b5411610d4c5760405162461bcd60e51b8152600401610c9790613ec4565b610d546123bc565b341015610d735760405162461bcd60e51b8152600401610c9790613f85565b600f8054906000610d8383614250565b91905055506000610d9360085490565b90506000610d9f6123bc565b9050610dab3383612d7f565b604080518281526020810184905233917fdaa045d42a3e393e68713f4d86f01a118383dbd19b795912cfd9f4394bc3b45091015b60405180910390a25050565b606060008054610dfa90614215565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2690614215565b8015610e735780601f10610e4857610100808354040283529160200191610e73565b820191906000526020600020905b815481529060010190602001808311610e5657829003601f168201915b5050505050905090565b6000610eab602c54610ea5602a54610e9f610e96611c48565b602c5490612ecd565b90612eed565b90612f1d565b905090565b6000818152600260205260408120546001600160a01b0316610f295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c97565b506000908152600460205260409020546001600160a01b031690565b6000610f5082611c8c565b9050806001600160a01b0316836001600160a01b03161415610fbe5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c97565b336001600160a01b0382161480610fda5750610fda8133610bec565b61104c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c97565b6110568383612f29565b505050565b600a546000906001600160a01b031633146110885760405162461bcd60e51b8152600401610c9790614021565b815160005b818110156110f857602560008583815181106110ab576110ab6142c1565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054600114156110e6575060009392505050565b806110f081614250565b91505061108d565b5060019150505b919050565b600a546001600160a01b0316331461112e5760405162461bcd60e51b8152600401610c9790614021565b6011546010541161117c5760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520726573657276656420746f6b656e732160401b6044820152606401610c97565b6011805490600061118c83614250565b9190505550600061119c60085490565b90506111a88282612d7f565b816001600160a01b03167f82bff94c69b4a624bb0d25e15735cf4189fdc4706e6b6806c94886b0009f2bdf82604051610ddf91815260200190565b600a546060906001600160a01b031633146112105760405162461bcd60e51b8152600401610c9790614021565b6040805160098082526101408201909252479160009190602082016101208036833701905050905060006064601c548461124a91906141b3565b611254919061419f565b905060006064601d548561126891906141b3565b611272919061419f565b905060006064601e548661128691906141b3565b611290919061419f565b905060006064601f54876112a491906141b3565b6112ae919061419f565b905060006064602054886112c291906141b3565b6112cc919061419f565b905060006064602154896112e091906141b3565b6112ea919061419f565b9050600060646022548a6112fe91906141b3565b611308919061419f565b9050868860008151811061131e5761131e6142c1565b602002602001018181525050858860018151811061133e5761133e6142c1565b602002602001018181525050848860028151811061135e5761135e6142c1565b602002602001018181525050838860038151811061137e5761137e6142c1565b602002602001018181525050828860048151811061139e5761139e6142c1565b60200260200101818152505081886005815181106113be576113be6142c1565b60200260200101818152505080886006815181106113de576113de6142c1565b60200260200101818152505088886007815181106113fe576113fe6142c1565b602090810291909101015280828486886114188b8d614187565b6114229190614187565b61142c9190614187565b6114369190614187565b6114409190614187565b61144a9190614187565b8860088151811061145d5761145d6142c1565b6020908102919091010152509597505050505050505090565b6114803382612f97565b61149c5760405162461bcd60e51b8152600401610c9790614097565b61105683838361308e565b600a546001600160a01b031633146114d15760405162461bcd60e51b8152600401610c9790614021565b602f546115305760405162461bcd60e51b815260206004820152602760248201527f596f752068617665206e6f7420736574206120726f6c6c6f7665722073616c656044820152662070726963652160c81b6064820152608401610c97565b6030919091556031805460ff1916911515919091179055565b3332146115685760405162461bcd60e51b8152600401610c9790613ff4565b60275460ff1661158a5760405162461bcd60e51b8152600401610c9790613f41565b336000908152602560205260409020546115e15760405162461bcd60e51b8152602060048201526018602482015277596f7520617265206e6f742077686974656c69737465642160401b6044820152606401610c97565b336000908152602660205260409020541561160e5760405162461bcd60e51b8152600401610c9790613efb565b602454341461162f5760405162461bcd60e51b8152600401610c9790613f85565b600d54600c541161167e5760405162461bcd60e51b81526020600482015260196024820152784e6f206d6f72652077686974656c69737420746f6b656e732160381b6044820152606401610c97565b600854600b54116116a15760405162461bcd60e51b8152600401610c9790613ec4565b3360009081526026602052604081208054916116bc83614250565b9091555050600d80549060006116d183614250565b919050555060006116e160085490565b90506116ed3382612d7f565b60405181815233907fda47e427fb170a95b4539ea720c3caf8ad5a319335b1a85fb3a8db83a61159c0906020015b60405180910390a250565b600061173183611d03565b82106117935760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c97565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146117e65760405162461bcd60e51b8152600401610c9790614021565b8051610cb39060129060208401906137fb565b3332146118185760405162461bcd60e51b8152600401610c9790613ff4565b60315460ff16801561182c57506030544210155b6118485760405162461bcd60e51b8152600401610c9790613fb2565b8061185260085490565b61185c9190614187565b600b5410156118a95760405162461bcd60e51b81526020600482015260196024820152784e6f2072656d61696e696e6720746f6b656e73206c6566742160381b6044820152606401610c97565b80600510156118ca5760405162461bcd60e51b8152600401610c97906140e8565b80602f546118d891906141b3565b34146118f65760405162461bcd60e51b8152600401610c9790613f85565b80603260008282546119089190614187565b90915550600090505b81811015610cb357600061192460085490565b90506119303382612d7f565b60405181815233907f84c3d13e58f975be443cb619b0cd52382e886629cd5f453f4d9c2b8e45de10959060200160405180910390a2508061197081614250565b915050611911565b600a546001600160a01b031633146119a25760405162461bcd60e51b8152600401610c9790614021565b806011546119b09190614187565b60105410156119fc5760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520726573657276656420746f6b656e732160401b6044820152606401610c97565b8060116000828254611a0e9190614187565b90915550600090505b81811015611056576000611a2a60085490565b9050611a368482612d7f565b836001600160a01b03167f82bff94c69b4a624bb0d25e15735cf4189fdc4706e6b6806c94886b0009f2bdf82604051611a7191815260200190565b60405180910390a25080611a8481614250565b915050611a17565b600a546001600160a01b03163314611ab65760405162461bcd60e51b8152600401610c9790614021565b602f55565b611056838383604051806020016040528060008152506123d2565b60606000611ae383611d03565b905060008167ffffffffffffffff811115611b0057611b006142d7565b604051908082528060200260200182016040528015611b29578160200160208202803683370190505b50905060005b82811015611b7057611b418582611726565b828281518110611b5357611b536142c1565b602090810291909101015280611b6881614250565b915050611b2f565b509392505050565b600a546001600160a01b03163314611ba25760405162461bcd60e51b8152600401610c9790614021565b6027805460ff1916911515919091179055565b6000611bc060085490565b8210611c235760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c97565b60088281548110611c3657611c366142c1565b90600052602060002001549050919050565b600080602b5411611c595750600090565b42611c71602c54602b5461323990919063ffffffff16565b1015611c7e5750602c5490565b602b54610eab904290612ecd565b6000818152600260205260408120546001600160a01b031680610c675760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c97565b60006001600160a01b038216611d6e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c97565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611db45760405162461bcd60e51b8152600401610c9790614021565b611dbe6000613254565b565b600a546001600160a01b03163314611dea5760405162461bcd60e51b8152600401610c9790614021565b601c544790600090606490611dff90846141b3565b611e09919061419f565b905060006064601d5484611e1d91906141b3565b611e27919061419f565b905060006064601e5485611e3b91906141b3565b611e45919061419f565b905060006064601f5486611e5991906141b3565b611e63919061419f565b90506000606460205487611e7791906141b3565b611e81919061419f565b90506000606460215488611e9591906141b3565b611e9f919061419f565b90506000606460225489611eb391906141b3565b611ebd919061419f565b6015546040519192506001600160a01b03169088156108fc029089906000818181858888f19350505050158015611ef8573d6000803e3d6000fd5b506016546040516001600160a01b039091169087156108fc029088906000818181858888f19350505050158015611f33573d6000803e3d6000fd5b506017546040516001600160a01b039091169086156108fc029087906000818181858888f19350505050158015611f6e573d6000803e3d6000fd5b506018546040516001600160a01b039091169085156108fc029086906000818181858888f19350505050158015611fa9573d6000803e3d6000fd5b506019546040516001600160a01b039091169084156108fc029085906000818181858888f19350505050158015611fe4573d6000803e3d6000fd5b50601a546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561201f573d6000803e3d6000fd5b50601b546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561205a573d6000803e3d6000fd5b505050505050505050565b600a546001600160a01b0316331461208f5760405162461bcd60e51b8152600401610c9790614021565b602855565b6015546001600160a01b03163314806120b757506016546001600160a01b031633145b806120cc57506017546001600160a01b031633145b806120e157506018546001600160a01b031633145b806120f657506019546001600160a01b031633145b8061210b5750601a546001600160a01b031633145b806121205750601b546001600160a01b031633145b61216c5760405162461bcd60e51b815260206004820152601a60248201527f596f7520617265206e6f742061207368617265686f6c646572210000000000006044820152606401610c97565b336000908152601460205260409020805460ff19166001179055565b3332146121a75760405162461bcd60e51b8152600401610c9790613ff4565b60275460ff166121c95760405162461bcd60e51b8152600401610c9790613f41565b6121d281612504565b6122195760405162461bcd60e51b8152602060048201526018602482015277596f7520617265206e6f742077686974656c69737465642160401b6044820152606401610c97565b33600090815260266020526040902054156122465760405162461bcd60e51b8152600401610c9790613efb565b60245434146122675760405162461bcd60e51b8152600401610c9790613f85565b600d54600c54116122b65760405162461bcd60e51b81526020600482015260196024820152784e6f206d6f72652077686974656c69737420746f6b656e732160381b6044820152606401610c97565b600854600b54116122d95760405162461bcd60e51b8152600401610c9790613ec4565b3360009081526026602052604081208054916122f483614250565b9091555050600d805490600061230983614250565b9190505550600061231960085490565b90506123253382612d7f565b60405181815233907fda47e427fb170a95b4539ea720c3caf8ad5a319335b1a85fb3a8db83a61159c090602001610ddf565b606060018054610dfa90614215565b610cb33383836132a6565b600a546001600160a01b0316331461239b5760405162461bcd60e51b8152600401610c9790614021565b602a839055602b829055602c8190556123b48282613239565b602d55505050565b6000610eab6123c9610e7d565b60295490613239565b6123dc3383612f97565b6123f85760405162461bcd60e51b8152600401610c9790614097565b61240484848484613375565b50505050565b6015546000906001600160a01b031633148061243057506016546001600160a01b031633145b8061244557506017546001600160a01b031633145b8061245a57506018546001600160a01b031633145b8061246f57506019546001600160a01b031633145b806124845750601a546001600160a01b031633145b806124995750601b546001600160a01b031633145b6124e55760405162461bcd60e51b815260206004820152601a60248201527f596f7520617265206e6f742061207368617265686f6c646572210000000000006044820152606401610c97565b506001600160a01b031660009081526014602052604090205460ff1690565b6040516bffffffffffffffffffffffff193360601b166020820152600090819060340160405160208183030381529060405280519060200120905060005b835181101561261b5783818151811061255d5761255d6142c1565b602002602001015182106125bb5783818151811061257d5761257d6142c1565b6020026020010151826040516020016125a0929190918252602082015260400190565b60405160208183030381529060405280519060200120612607565b818482815181106125ce576125ce6142c1565b60200260200101516040516020016125f0929190918252602082015260400190565b604051602081830303815290604052805190602001205b91508061261381614250565b915050612542565b506028541492915050565b600a546001600160a01b031633146126505760405162461bcd60e51b8152600401610c9790614021565b602e805460ff1916911515919091179055565b6000818152600260205260409020546060906001600160a01b03166126ca5760405162461bcd60e51b815260206004820152601d60248201527f517565727920666f72206e6f6e2d6578697374656e7420746f6b656e210000006044820152606401610c97565b60126126d5836133a8565b60136040516020016126e993929190613d69565b6040516020818303038152906040529050919050565b33321461271e5760405162461bcd60e51b8152600401610c9790613ff4565b602e5460ff1680156127325750602b544210155b61274e5760405162461bcd60e51b8152600401610c9790613e30565b80600f5461275c9190614187565b600e54101561277d5760405162461bcd60e51b8152600401610c9790614056565b8061278760085490565b6127919190614187565b600b5410156127b25760405162461bcd60e51b8152600401610c9790613ec4565b80600510156127d35760405162461bcd60e51b8152600401610c97906140e8565b806127dc6123bc565b6127e691906141b3565b3410156128055760405162461bcd60e51b8152600401610c9790613f85565b80600f60008282546128179190614187565b90915550600090505b81811015610cb357600061283360085490565b9050600061283f6123bc565b905061284b3383612d7f565b604080518281526020810184905233917fdaa045d42a3e393e68713f4d86f01a118383dbd19b795912cfd9f4394bc3b450910160405180910390a25050808061289390614250565b915050612820565b600a546001600160a01b031633146128c55760405162461bcd60e51b8152600401610c9790614021565b805160005b81811015612929576001602560008584815181106128ea576128ea6142c1565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550808061292190614250565b9150506128ca565b50806023600082825461293c9190614187565b90915550505050565b600a546000906001600160a01b031633146129725760405162461bcd60e51b8152600401610c9790614021565b815160005b818110156110f857336000908152602660205260409020541561299e575060009392505050565b806129a881614250565b915050612977565b6000610eab610e96611c48565b600a546001600160a01b031633146129e75760405162461bcd60e51b8152600401610c9790614021565b6015546001600160a01b031660009081526014602052604090205460ff168015612a2b57506016546001600160a01b031660009081526014602052604090205460ff165b8015612a5157506017546001600160a01b031660009081526014602052604090205460ff165b8015612a7757506018546001600160a01b031660009081526014602052604090205460ff165b8015612a9d57506019546001600160a01b031660009081526014602052604090205460ff165b8015612ac35750601a546001600160a01b031660009081526014602052604090205460ff165b8015612ae95750601b546001600160a01b031660009081526014602052604090205460ff165b612b4b5760405162461bcd60e51b815260206004820152602d60248201527f54686520656d657267656e63792066756e6374696f6e20686173206e6f74206260448201526c65656e20756e6c6f636b65642160981b6064820152608401610c97565b60405133904780156108fc02916000818181858888f19350505050158015612b77573d6000803e3d6000fd5b50565b600a546001600160a01b03163314612ba45760405162461bcd60e51b8152600401610c9790614021565b6001600160a01b038116612c095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c97565b612b7781613254565b333214612c315760405162461bcd60e51b8152600401610c9790613ff4565b60315460ff168015612c4557506030544210155b612c615760405162461bcd60e51b8152600401610c9790613fb2565b600854600b5411612cb05760405162461bcd60e51b81526020600482015260196024820152784e6f2072656d61696e696e6720746f6b656e73206c6566742160381b6044820152606401610c97565b602f543414612cd15760405162461bcd60e51b8152600401610c9790613f85565b60328054906000612ce183614250565b91905055506000612cf160085490565b9050612cfd3382612d7f565b60405181815233907f84c3d13e58f975be443cb619b0cd52382e886629cd5f453f4d9c2b8e45de10959060200161171b565b60006001600160e01b031982166380ac58cd60e01b1480612d6057506001600160e01b03198216635b5e139f60e01b145b80610c6757506301ffc9a760e01b6001600160e01b0319831614610c67565b6001600160a01b038216612dd55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c97565b6000818152600260205260409020546001600160a01b031615612e3a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c97565b612e46600083836134a6565b6001600160a01b0382166000908152600360205260408120805460019290612e6f908490614187565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600082821115612edc57600080fd5b612ee682846141d2565b9392505050565b600082612efc57506000610c67565b612f0682846141b3565b905081612f13848361419f565b14610c6757600080fd5b6000612ee6828461419f565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612f5e82611c8c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166130105760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c97565b600061301b83611c8c565b9050806001600160a01b0316846001600160a01b031614806130565750836001600160a01b031661304b84610eb0565b6001600160a01b0316145b8061308657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166130a182611c8c565b6001600160a01b0316146131095760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c97565b6001600160a01b03821661316b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c97565b6131768383836134a6565b613181600082612f29565b6001600160a01b03831660009081526003602052604081208054600192906131aa9084906141d2565b90915550506001600160a01b03821660009081526003602052604081208054600192906131d8908490614187565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006132458284614187565b905082811015610c6757600080fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156133085760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c97565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61338084848461308e565b61338c8484848461355e565b6124045760405162461bcd60e51b8152600401610c9790613e72565b6060816133cc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156133f657806133e081614250565b91506133ef9050600a8361419f565b91506133d0565b60008167ffffffffffffffff811115613411576134116142d7565b6040519080825280601f01601f19166020018201604052801561343b576020820181803683370190505b5090505b8415613086576134506001836141d2565b915061345d600a8661426b565b613468906030614187565b60f81b81838151811061347d5761347d6142c1565b60200101906001600160f81b031916908160001a90535061349f600a8661419f565b945061343f565b6001600160a01b038316613501576134fc81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613524565b816001600160a01b0316836001600160a01b03161461352457613524838261366b565b6001600160a01b03821661353b5761105681613708565b826001600160a01b0316826001600160a01b0316146110565761105682826137b7565b60006001600160a01b0384163b1561366057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906135a2903390899088908890600401613d9c565b602060405180830381600087803b1580156135bc57600080fd5b505af19250505080156135ec575060408051601f3d908101601f191682019092526135e991810190613bee565b60015b613646573d80801561361a576040519150601f19603f3d011682016040523d82523d6000602084013e61361f565b606091505b50805161363e5760405162461bcd60e51b8152600401610c9790613e72565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613086565b506001949350505050565b6000600161367884611d03565b61368291906141d2565b6000838152600760205260409020549091508082146136d5576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061371a906001906141d2565b60008381526009602052604081205460088054939450909284908110613742576137426142c1565b906000526020600020015490508060088381548110613763576137636142c1565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061379b5761379b6142ab565b6001900381819060005260206000200160009055905550505050565b60006137c283611d03565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461380790614215565b90600052602060002090601f016020900481019282613829576000855561386f565b82601f1061384257805160ff191683800117855561386f565b8280016001018555821561386f579182015b8281111561386f578251825591602001919060010190613854565b5061387b92915061387f565b5090565b5b8082111561387b5760008155600101613880565b600067ffffffffffffffff8311156138ae576138ae6142d7565b6138c1601f8401601f1916602001614132565b90508281528383830111156138d557600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146110ff57600080fd5b803580151581146110ff57600080fd5b60006020828403121561392557600080fd5b612ee6826138ec565b6000806040838503121561394157600080fd5b61394a836138ec565b9150613958602084016138ec565b90509250929050565b60008060006060848603121561397657600080fd5b61397f846138ec565b925061398d602085016138ec565b9150604084013590509250925092565b600080600080608085870312156139b357600080fd5b6139bc856138ec565b93506139ca602086016138ec565b925060408501359150606085013567ffffffffffffffff8111156139ed57600080fd5b8501601f810187136139fe57600080fd5b613a0d87823560208401613894565b91505092959194509250565b60008060408385031215613a2c57600080fd5b613a35836138ec565b915061395860208401613903565b60008060408385031215613a5657600080fd5b613a5f836138ec565b946020939093013593505050565b60006020808385031215613a8057600080fd5b823567ffffffffffffffff811115613a9757600080fd5b8301601f81018513613aa857600080fd5b8035613abb613ab682614163565b614132565b80828252848201915084840188868560051b8701011115613adb57600080fd5b600094505b83851015613b0557613af1816138ec565b835260019490940193918501918501613ae0565b50979650505050505050565b60006020808385031215613b2457600080fd5b823567ffffffffffffffff811115613b3b57600080fd5b8301601f81018513613b4c57600080fd5b8035613b5a613ab682614163565b80828252848201915084840188868560051b8701011115613b7a57600080fd5b600094505b83851015613b05578035835260019490940193918501918501613b7f565b600060208284031215613baf57600080fd5b612ee682613903565b600060208284031215613bca57600080fd5b5035919050565b600060208284031215613be357600080fd5b8135612ee6816142ed565b600060208284031215613c0057600080fd5b8151612ee6816142ed565b600060208284031215613c1d57600080fd5b813567ffffffffffffffff811115613c3457600080fd5b8201601f81018413613c4557600080fd5b61308684823560208401613894565b60008060408385031215613c6757600080fd5b8235915061395860208401613903565b600080600060608486031215613c8c57600080fd5b505081359360208301359350604090920135919050565b60008151808452613cbb8160208601602086016141e9565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680613ce957607f831692505b6020808410821415613d0b57634e487b7160e01b600052602260045260246000fd5b818015613d1f5760018114613d3057613d5d565b60ff19861689528489019650613d5d565b60008881526020902060005b86811015613d555781548b820152908501908301613d3c565b505084890196505b50505050505092915050565b6000613d758286613ccf565b8451613d858183602089016141e9565b613d9181830186613ccf565b979650505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613dcf90830184613ca3565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613e1157835183529284019291840191600101613df5565b50909695505050505050565b602081526000612ee66020830184613ca3565b60208082526022908201527f44757463682061756374696f6e20686173206e6f742073746172746564207965604082015261742160f01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526019908201527f4e6f206d6f726520746f6b656e732072656d61696e696e672100000000000000604082015260600190565b60208082526026908201527f596f752068617665206e6f206d6f72652077686974656c697374206d696e7473604082015265206c6566742160d01b606082015260800190565b60208082526024908201527f57686974656c697374204d696e747320617265206e6f7420656e61626c6564206040820152637965742160e01b606082015260800190565b602080825260139082015272496e76616c69642076616c75652073656e742160681b604082015260600190565b60208082526022908201527f526f6c6c6f7665722073616c6520686173206e6f742073746172746564207965604082015261742160f01b606082015260800190565b6020808252601390820152724e6f20736d61727420636f6e7472616374732160681b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f4e6f206d6f726520746f6b656e7320666f722044757463682041756374696f6e6040820152602160f81b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602a908201527f596f752063616e206f6e6c79206d696e7420757020746f203520706572207472604082015269616e73616374696f6e2160b01b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561415b5761415b6142d7565b604052919050565b600067ffffffffffffffff82111561417d5761417d6142d7565b5060051b60200190565b6000821982111561419a5761419a61427f565b500190565b6000826141ae576141ae614295565b500490565b60008160001904831182151516156141cd576141cd61427f565b500290565b6000828210156141e4576141e461427f565b500390565b60005b838110156142045781810151838201526020016141ec565b838111156124045750506000910152565b600181811c9082168061422957607f821691505b6020821081141561424a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156142645761426461427f565b5060010190565b60008261427a5761427a614295565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114612b7757600080fdfea2646970667358221220e7745a08d17366ac76bf7bda49fb00d13d8071ce3635041686ce3f5ed313d0d964736f6c63430008070033
Deployed Bytecode Sourcemap
45777:17855:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48070:31;;;48079:10;9716:51:1;;48091:9:0;9798:2:1;9783:18;;9776:34;48070:31:0;;9689:18:1;48070:31:0;;;;;;;45777:17855;;;;;38902:224;;;;;;;;;;-1:-1:-1;38902:224:0;;;;;:::i;:::-;;:::i;:::-;;;10623:14:1;;10616:22;10598:41;;10586:2;10571:18;38902:224:0;;;;;;;;62865:110;;;;;;;;;;-1:-1:-1;62865:110:0;;;;;:::i;:::-;;:::i;:::-;;60195:647;;;:::i;53268:56::-;;;;;;;;;;-1:-1:-1;53268:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;10796:25:1;;;10784:2;10769:18;53268:56:0;10650:177:1;26343:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;58934:234::-;;;;;;;;;;;;;:::i;27902:221::-;;;;;;;;;;-1:-1:-1;27902:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9005:32:1;;;8987:51;;8975:2;8960:18;27902:221:0;8841:203:1;27425:411:0;;;;;;;;;;-1:-1:-1;27425:411:0;;;;;:::i;:::-;;:::i;54101:365::-;;;;;;;;;;-1:-1:-1;54101:365:0;;;;;:::i;:::-;;:::i;57497:25::-;;;;;;;;;;;;;;;;39542:113;;;;;;;;;;-1:-1:-1;39630:10:0;:17;39542:113;;52611:363;;;;;;;;;;-1:-1:-1;52611:363:0;;;;;:::i;:::-;;:::i;49248:1405::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;46286:48::-;;;;;;;;;;;;;;;;28652:339;;;;;;;;;;-1:-1:-1;28652:339:0;;;;;:::i;:::-;;:::i;61350:277::-;;;;;;;;;;-1:-1:-1;61350:277:0;;;;;:::i;:::-;;:::i;54847:857::-;;;:::i;55745:94::-;;;;;;;;;;;;;;;;39210:256;;;;;;;;;;-1:-1:-1;39210:256:0;;;;;:::i;:::-;;:::i;62757:102::-;;;;;;;;;;-1:-1:-1;62757:102:0;;;;;:::i;:::-;;:::i;61633:634::-;;;;;;:::i;:::-;;:::i;52135:470::-;;;;;;;;;;-1:-1:-1;52135:470:0;;;;;:::i;:::-;;:::i;53366:32::-;;;;;;;;;;-1:-1:-1;53366:32:0;;;;;;;;61239:105;;;;;;;;;;-1:-1:-1;61239:105:0;;;;;:::i;:::-;;:::i;60914:33::-;;;;;;;;;;;;;;;;29062:185;;;;;;;;;;-1:-1:-1;29062:185:0;;;;;:::i;:::-;;:::i;63247:382::-;;;;;;;;;;-1:-1:-1;63247:382:0;;;;;:::i;:::-;;:::i;53566:108::-;;;;;;;;;;-1:-1:-1;53566:108:0;;;;;:::i;:::-;;:::i;46443:39::-;;;;;;;;;;;;;;;;39732:233;;;;;;;;;;-1:-1:-1;39732:233:0;;;;;:::i;:::-;;:::i;58542:262::-;;;;;;;;;;;;;:::i;46237:40::-;;;;;;;;;;;;;;;;46341:43;;;;;;;;;;;;;;;;53010:36;;;;;;;;;;;;;;;;26037:239;;;;;;;;;;-1:-1:-1;26037:239:0;;;;;:::i;:::-;;:::i;53085:39::-;;;;;;;;;;;;;;;;25767:208;;;;;;;;;;-1:-1:-1;25767:208:0;;;;;:::i;:::-;;:::i;4889:103::-;;;;;;;;;;;;;:::i;48141:1099::-;;;;;;;;;;;;;:::i;57287:41::-;;;;;;;;;;;;;;;;46393:43;;;;;;;;;;;;;;;;55848:104;;;;;;;;;;-1:-1:-1;55848:104:0;;;;;:::i;:::-;;:::i;51134:138::-;;;;;;;;;;;;;:::i;56369:878::-;;;;;;:::i;:::-;;:::i;4238:87::-;;;;;;;;;;-1:-1:-1;4311:6:0;;-1:-1:-1;;;;;4311:6:0;4238:87;;26512:104;;;;;;;;;;;;;:::i;28195:155::-;;;;;;;;;;-1:-1:-1;28195:155:0;;;;;:::i;:::-;;:::i;46185:45::-;;;;;;;;;;;;;;;;57988:514;;;;;;;;;;-1:-1:-1;57988:514:0;;;;;:::i;:::-;;:::i;59174:127::-;;;;;;;;;;;;;:::i;29318:328::-;;;;;;;;;;-1:-1:-1;29318:328:0;;;;;:::i;:::-;;:::i;60955:31::-;;;;;;;;;;-1:-1:-1;60955:31:0;;;;;;;;51911:157;;;;;;;;;;-1:-1:-1;51911:157:0;;;;;:::i;:::-;;:::i;57439:26::-;;;;;;;;;;;;;;;;57552:24;;;;;;;;;;;;;;;;55960:401;;;;;;;;;;-1:-1:-1;55960:401:0;;;;;:::i;:::-;;:::i;57837:111::-;;;;;;;;;;-1:-1:-1;57837:111:0;;;;;:::i;:::-;;:::i;62983:258::-;;;;;;;;;;-1:-1:-1;62983:258:0;;;;;:::i;:::-;;:::i;59326:861::-;;;;;;:::i;:::-;;:::i;60993:36::-;;;;;;;;;;;;;;;;53680:415;;;;;;;;;;-1:-1:-1;53680:415:0;;;;;:::i;:::-;;:::i;53172:55::-;;;;;;;;;;-1:-1:-1;53172:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;54472:369;;;;;;;;;;-1:-1:-1;54472:369:0;;;;;:::i;:::-;;:::i;58810:116::-;;;;;;;;;;;;;:::i;57335:32::-;;;;;;;;;;;;;;;;51730:136;;;;;;;;;;;;;:::i;57606:31::-;;;;;;;;;;-1:-1:-1;57606:31:0;;;;;;;;60878:29;;;;;;;;;;;;;;;;46147;;;;;;;;;;;;;;;;28421:164;;;;;;;;;;-1:-1:-1;28421:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;28542:25:0;;;28518:4;28542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28421:164;5147:201;;;;;;;;;;-1:-1:-1;5147:201:0;;;;;:::i;:::-;;:::i;62273:441::-;;;:::i;38902:224::-;39004:4;-1:-1:-1;;;;;;39028:50:0;;-1:-1:-1;;;39028:50:0;;:90;;;39082:36;39106:11;39082:23;:36::i;:::-;39021:97;38902:224;-1:-1:-1;;38902:224:0:o;62865:110::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;;;;;;;;;62944:23;;::::1;::::0;:16:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;:::-;;62865:110:::0;:::o;60195:647::-;46883:10;46897:9;46883:23;46874:56;;;;-1:-1:-1;;;46874:56:0;;;;;;;:::i;:::-;57716:19:::1;::::0;::::1;;:56:::0;::::1;;;;57758:14;;57739:15;:33;;57716:56;57708:103;;;;-1:-1:-1::0;;;57708:103:0::1;;;;;;;:::i;:::-;60313:27:::2;;60281:29;;:59;60273:105;;;;-1:-1:-1::0;;;60273:105:0::2;;;;;;;:::i;:::-;39630:10:::0;:17;60397:9:::2;;:25;60389:63;;;;-1:-1:-1::0;;;60389:63:0::2;;;;;;;:::i;:::-;60484:22;:20;:22::i;:::-;60471:9;:35;;60463:67;;;;-1:-1:-1::0;;;60463:67:0::2;;;;;;;:::i;:::-;60543:27;:29:::0;;;:27:::2;:29;::::0;::::2;:::i;:::-;;;;;;60637:12;60652:13;39630:10:::0;:17;;39542:113;60652:13:::2;60637:28;;60676:18;60697:22;:20;:22::i;:::-;60676:43;;60730:26;60736:10;60748:7;60730:5;:26::i;:::-;60782:52;::::0;;24633:25:1;;;24689:2;24674:18;;24667:34;;;60799:10:0::2;::::0;60782:52:::2;::::0;24606:18:1;60782:52:0::2;;;;;;;;60262:580;;60195:647::o:0;26343:100::-;26397:13;26430:5;26423:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26343:100;:::o;58934:234::-;58985:4;59009:80;59075:13;;59009:61;59049:20;;59009:35;59027:16;:14;:16::i;:::-;59009:13;;;:17;:35::i;:::-;:39;;:61::i;:::-;:65;;:80::i;:::-;59002:87;;58934:234;:::o;27902:221::-;27978:7;31245:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31245:16:0;27998:73;;;;-1:-1:-1;;;27998:73:0;;20128:2:1;27998:73:0;;;20110:21:1;20167:2;20147:18;;;20140:30;20206:34;20186:18;;;20179:62;-1:-1:-1;;;20257:18:1;;;20250:42;20309:19;;27998:73:0;19926:408:1;27998:73:0;-1:-1:-1;28091:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28091:24:0;;27902:221::o;27425:411::-;27506:13;27522:23;27537:7;27522:14;:23::i;:::-;27506:39;;27570:5;-1:-1:-1;;;;;27564:11:0;:2;-1:-1:-1;;;;;27564:11:0;;;27556:57;;;;-1:-1:-1;;;27556:57:0;;21714:2:1;27556:57:0;;;21696:21:1;21753:2;21733:18;;;21726:30;21792:34;21772:18;;;21765:62;-1:-1:-1;;;21843:18:1;;;21836:31;21884:19;;27556:57:0;21512:397:1;27556:57:0;2989:10;-1:-1:-1;;;;;27648:21:0;;;;:62;;-1:-1:-1;27673:37:0;27690:5;2989:10;28421:164;:::i;27673:37::-;27626:168;;;;-1:-1:-1;;;27626:168:0;;17004:2:1;27626:168:0;;;16986:21:1;17043:2;17023:18;;;17016:30;17082:34;17062:18;;;17055:62;17153:26;17133:18;;;17126:54;17197:19;;27626:168:0;16802:420:1;27626:168:0;27807:21;27816:2;27820:7;27807:8;:21::i;:::-;27495:341;27425:411;;:::o;54101:365::-;4311:6;;54198:4;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;54241:17;;54215:23:::1;54269:168;54290:18;54286:1;:22;54269:168;;;54334:23;:38;54358:10;54369:1;54358:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;54334:38:0::1;-1:-1:-1::0;;;;;54334:38:0::1;;;;;;;;;;;;;54376:1;54334:43;54330:96;;;-1:-1:-1::0;54405:5:0::1;::::0;54101:365;-1:-1:-1;;;54101:365:0:o;54330:96::-:1;54310:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54269:168;;;;54454:4;54447:11;;;4529:1;54101:365:::0;;;:::o;52611:363::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;52712:23:::1;;52684:25;;:51;52676:88;;;::::0;-1:-1:-1;;;52676:88:0;;23301:2:1;52676:88:0::1;::::0;::::1;23283:21:1::0;23340:2;23320:18;;;23313:30;-1:-1:-1;;;23359:18:1;;;23352:54;23423:18;;52676:88:0::1;23099:348:1::0;52676:88:0::1;52777:23;:25:::0;;;:23:::1;:25;::::0;::::1;:::i;:::-;;;;;;52855:12;52870:13;39630:10:::0;:17;;39542:113;52870:13:::1;52855:28;;52894:24;52900:8;52910:7;52894:5;:24::i;:::-;52948:8;-1:-1:-1::0;;;;;52936:30:0::1;;52958:7;52936:30;;;;10796:25:1::0;;10784:2;10769:18;;10650:177;49248:1405:0;4311:6;;49315:13;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;49422:13:::1;::::0;;49433:1:::1;49422:13:::0;;;;;::::1;::::0;;;49358:21:::1;::::0;49341:14:::1;::::0;49422:13;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;49422:13:0::1;49390:45;;49456:23;49519:3;49496:19;;49484:9;:31;;;;:::i;:::-;49483:39;;;;:::i;:::-;49456:67;;49534:23;49597:3;49574:19;;49562:9;:31;;;;:::i;:::-;49561:39;;;;:::i;:::-;49534:67;;49612:23;49675:3;49652:19;;49640:9;:31;;;;:::i;:::-;49639:39;;;;:::i;:::-;49612:67;;49690:23;49753:3;49730:19;;49718:9;:31;;;;:::i;:::-;49717:39;;;;:::i;:::-;49690:67;;49768:23;49831:3;49808:19;;49796:9;:31;;;;:::i;:::-;49795:39;;;;:::i;:::-;49768:67;;49846:23;49909:3;49886:19;;49874:9;:31;;;;:::i;:::-;49873:39;;;;:::i;:::-;49846:67;;49924:23;49987:3;49964:19;;49952:9;:31;;;;:::i;:::-;49951:39;;;;:::i;:::-;49924:67;;50025:18;50004:15;50020:1;50004:18;;;;;;;;:::i;:::-;;;;;;:39;;;::::0;::::1;50075:18;50054:15;50070:1;50054:18;;;;;;;;:::i;:::-;;;;;;:39;;;::::0;::::1;50125:18;50104:15;50120:1;50104:18;;;;;;;;:::i;:::-;;;;;;:39;;;::::0;::::1;50175:18;50154:15;50170:1;50154:18;;;;;;;;:::i;:::-;;;;;;:39;;;::::0;::::1;50225:18;50204:15;50220:1;50204:18;;;;;;;;:::i;:::-;;;;;;:39;;;::::0;::::1;50275:18;50254:15;50270:1;50254:18;;;;;;;;:::i;:::-;;;;;;:39;;;::::0;::::1;50325:18;50304:15;50320:1;50304:18;;;;;;;;:::i;:::-;;;;;;:39;;;::::0;::::1;50375:9;50354:15;50370:1;50354:18;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:30;50555:18;50534;50513;50492;50471;50429:39:::1;50450:18:::0;50429;:39:::1;:::i;:::-;:60;;;;:::i;:::-;:81;;;;:::i;:::-;:102;;;;:::i;:::-;:123;;;;:::i;:::-;:144;;;;:::i;:::-;50408:15;50424:1;50408:18;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:165;-1:-1:-1;50630:15:0;;-1:-1:-1;;;;;;;;49248:1405:0;:::o;28652:339::-;28847:41;2989:10;28880:7;28847:18;:41::i;:::-;28839:103;;;;-1:-1:-1;;;28839:103:0;;;;;;;:::i;:::-;28955:28;28965:4;28971:2;28975:7;28955:9;:28::i;61350:277::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;61458:17:::1;::::0;61450:74:::1;;;::::0;-1:-1:-1;;;61450:74:0;;17429:2:1;61450:74:0::1;::::0;::::1;17411:21:1::0;17468:2;17448:18;;;17441:30;17507:34;17487:18;;;17480:62;-1:-1:-1;;;17558:18:1;;;17551:37;17605:19;;61450:74:0::1;17227:403:1::0;61450:74:0::1;61535:21;:46:::0;;;;61592:19:::1;:27:::0;;-1:-1:-1;;61592:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61350:277::o;54847:857::-;46883:10;46897:9;46883:23;46874:56;;;;-1:-1:-1;;;46874:56:0;;;;;;;:::i;:::-;53449:20:::1;::::0;::::1;;53441:69;;;;-1:-1:-1::0;;;53441:69:0::1;;;;;;;:::i;:::-;54955:10:::2;54969:1;54931:35:::0;;;:23:::2;:35;::::0;;;;;54923:76:::2;;;::::0;-1:-1:-1;;;54923:76:0;;13610:2:1;54923:76:0::2;::::0;::::2;13592:21:1::0;13649:2;13629:18;;;13622:30;-1:-1:-1;;;13668:18:1;;;13661:54;13732:18;;54923:76:0::2;13408:348:1::0;54923:76:0::2;55043:10;55018:36;::::0;;;:24:::2;:36;::::0;;;;;:41;55010:92:::2;;;;-1:-1:-1::0;;;55010:92:0::2;;;;;;;:::i;:::-;55134:14;;55121:9;:27;55113:59;;;;-1:-1:-1::0;;;55113:59:0::2;;;;;;;:::i;:::-;55220:24;;55191:26;;:53;55183:91;;;::::0;-1:-1:-1;;;55183:91:0;;22116:2:1;55183:91:0::2;::::0;::::2;22098:21:1::0;22155:2;22135:18;;;22128:30;-1:-1:-1;;;22174:18:1;;;22167:55;22239:18;;55183:91:0::2;21914:349:1::0;55183:91:0::2;39630:10:::0;:17;55293:9:::2;;:25;55285:63;;;;-1:-1:-1::0;;;55285:63:0::2;;;;;;;:::i;:::-;55386:10;55361:36;::::0;;;:24:::2;:36;::::0;;;;:38;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;55467:24:0::2;:26:::0;;;:24:::2;:26;::::0;::::2;:::i;:::-;;;;;;55579:12;55594:13;39630:10:::0;:17;;39542:113;55594:13:::2;55579:28;;55618:26;55624:10;55636:7;55618:5;:26::i;:::-;55662:34;::::0;10796:25:1;;;55676:10:0::2;::::0;55662:34:::2;::::0;10784:2:1;10769:18;55662:34:0::2;;;;;;;;54912:792;54847:857::o:0;39210:256::-;39307:7;39343:23;39360:5;39343:16;:23::i;:::-;39335:5;:31;39327:87;;;;-1:-1:-1;;;39327:87:0;;11661:2:1;39327:87:0;;;11643:21:1;11700:2;11680:18;;;11673:30;11739:34;11719:18;;;11712:62;-1:-1:-1;;;11790:18:1;;;11783:41;11841:19;;39327:87:0;11459:407:1;39327:87:0;-1:-1:-1;;;;;;39432:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;39210:256::o;62757:102::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;62832:19;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;61633:634::-:0;46883:10;46897:9;46883:23;46874:56;;;;-1:-1:-1;;;46874:56:0;;;;;;;:::i;:::-;61079:19:::1;::::0;::::1;;:63:::0;::::1;;;;61121:21;;61102:15;:40;;61079:63;61071:110;;;;-1:-1:-1::0;;;61071:110:0::1;;;;;;;:::i;:::-;61764:7:::2;61748:13;39630:10:::0;:17;;39542:113;61748:13:::2;:23;;;;:::i;:::-;61735:9;;:36;;61727:74;;;::::0;-1:-1:-1;;;61727:74:0;;12492:2:1;61727:74:0::2;::::0;::::2;12474:21:1::0;12531:2;12511:18;;;12504:30;-1:-1:-1;;;12550:18:1;;;12543:55;12615:18;;61727:74:0::2;12290:349:1::0;61727:74:0::2;61825:7;61820:1;:12;;61812:67;;;;-1:-1:-1::0;;;61812:67:0::2;;;;;;;:::i;:::-;61931:7;61911:17;;:27;;;;:::i;:::-;61898:9;:40;61890:72;;;;-1:-1:-1::0;;;61890:72:0::2;;;;;;;:::i;:::-;62003:7;61975:24;;:35;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;62075:6:0::2;::::0;-1:-1:-1;62070:190:0::2;62091:7;62087:1;:11;62070:190;;;62120:12;62135:13;39630:10:::0;:17;;39542:113;62135:13:::2;62120:28;;62163:26;62169:10;62181:7;62163:5;:26::i;:::-;62211:37;::::0;10796:25:1;;;62228:10:0::2;::::0;62211:37:::2;::::0;10784:2:1;10769:18;62211:37:0::2;;;;;;;-1:-1:-1::0;62100:3:0;::::2;::::0;::::2;:::i;:::-;;;;62070:190;;52135:470:::0;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;52281:7:::1;52255:23;;:33;;;;:::i;:::-;52226:25;;:62;;52218:99;;;::::0;-1:-1:-1;;;52218:99:0;;23301:2:1;52218:99:0::1;::::0;::::1;23283:21:1::0;23340:2;23320:18;;;23313:30;-1:-1:-1;;;23359:18:1;;;23352:54;23423:18;;52218:99:0::1;23099:348:1::0;52218:99:0::1;52357:7;52330:23;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;52422:6:0::1;::::0;-1:-1:-1;52417:181:0::1;52438:7;52434:1;:11;52417:181;;;52467:12;52482:13;39630:10:::0;:17;;39542:113;52482:13:::1;52467:28;;52510:24;52516:8;52526:7;52510:5;:24::i;:::-;52568:8;-1:-1:-1::0;;;;;52556:30:0::1;;52578:7;52556:30;;;;10796:25:1::0;;10784:2;10769:18;;10650:177;52556:30:0::1;;;;;;;;-1:-1:-1::0;52447:3:0;::::1;::::0;::::1;:::i;:::-;;;;52417:181;;61239:105:::0;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;61310:17:::1;:26:::0;61239:105::o;29062:185::-;29200:39;29217:4;29223:2;29227:7;29200:39;;;;;;;;;;;;:16;:39::i;63247:382::-;63309:13;63335;63351:19;63361:8;63351:9;:19::i;:::-;63335:35;;63407:23;63444:8;63433:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63433:20:0;;63407:46;;63490:6;63485:110;63506:8;63502:1;:12;63485:110;;;63551:32;63571:8;63581:1;63551:19;:32::i;:::-;63536:9;63546:1;63536:12;;;;;;;;:::i;:::-;;;;;;;;;;:47;63516:3;;;;:::i;:::-;;;;63485:110;;;-1:-1:-1;63612:9:0;63247:382;-1:-1:-1;;;63247:382:0:o;53566:108::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;53638:20:::1;:28:::0;;-1:-1:-1;;53638:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53566:108::o;39732:233::-;39807:7;39843:30;39630:10;:17;;39542:113;39843:30;39835:5;:38;39827:95;;;;-1:-1:-1;;;39827:95:0;;22888:2:1;39827:95:0;;;22870:21:1;22927:2;22907:18;;;22900:30;22966:34;22946:18;;;22939:62;-1:-1:-1;;;23017:18:1;;;23010:42;23069:19;;39827:95:0;22686:408:1;39827:95:0;39940:10;39951:5;39940:17;;;;;;;;:::i;:::-;;;;;;;;;39933:24;;39732:233;;;:::o;58542:262::-;58589:4;58630:1;58613:14;;:18;:131;;-1:-1:-1;58743:1:0;;58934:234::o;58613:131::-;58671:15;58634:33;58653:13;;58634:14;;:18;;:33;;;;:::i;:::-;:52;;:106;;-1:-1:-1;58727:13:0;;;58934:234::o;58634:106::-;58709:14;;58689:35;;:15;;:19;:35::i;26037:239::-;26109:7;26145:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26145:16:0;26180:19;26172:73;;;;-1:-1:-1;;;26172:73:0;;18248:2:1;26172:73:0;;;18230:21:1;18287:2;18267:18;;;18260:30;18326:34;18306:18;;;18299:62;-1:-1:-1;;;18377:18:1;;;18370:39;18426:19;;26172:73:0;18046:405:1;25767:208:0;25839:7;-1:-1:-1;;;;;25867:19:0;;25859:74;;;;-1:-1:-1;;;25859:74:0;;17837:2:1;25859:74:0;;;17819:21:1;17876:2;17856:18;;;17849:30;17915:34;17895:18;;;17888:62;-1:-1:-1;;;17966:18:1;;;17959:40;18016:19;;25859:74:0;17635:406:1;25859:74:0;-1:-1:-1;;;;;;25951:16:0;;;;;:9;:16;;;;;;;25767:208::o;4889:103::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;4954:30:::1;4981:1;4954:18;:30::i;:::-;4889:103::o:0;48141:1099::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;48293:19:::1;::::0;48211:21:::1;::::0;48194:14:::1;::::0;48316:3:::1;::::0;48281:31:::1;::::0;48211:21;48281:31:::1;:::i;:::-;48280:39;;;;:::i;:::-;48253:67;;48331:23;48394:3;48371:19;;48359:9;:31;;;;:::i;:::-;48358:39;;;;:::i;:::-;48331:67;;48409:23;48472:3;48449:19;;48437:9;:31;;;;:::i;:::-;48436:39;;;;:::i;:::-;48409:67;;48487:23;48550:3;48527:19;;48515:9;:31;;;;:::i;:::-;48514:39;;;;:::i;:::-;48487:67;;48565:23;48628:3;48605:19;;48593:9;:31;;;;:::i;:::-;48592:39;;;;:::i;:::-;48565:67;;48643:23;48706:3;48683:19;;48671:9;:31;;;;:::i;:::-;48670:39;;;;:::i;:::-;48643:67;;48721:23;48784:3;48761:19;;48749:9;:31;;;;:::i;:::-;48748:39;;;;:::i;:::-;48817:13;::::0;48809:51:::1;::::0;48721:67;;-1:-1:-1;;;;;;48817:13:0::1;::::0;48809:51;::::1;;;::::0;48841:18;;48817:13:::1;48809:51:::0;48817:13;48809:51;48841:18;48817:13;48809:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;48879:13:0::1;::::0;48871:51:::1;::::0;-1:-1:-1;;;;;48879:13:0;;::::1;::::0;48871:51;::::1;;;::::0;48903:18;;48879:13:::1;48871:51:::0;48879:13;48871:51;48903:18;48879:13;48871:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;48941:13:0::1;::::0;48933:51:::1;::::0;-1:-1:-1;;;;;48941:13:0;;::::1;::::0;48933:51;::::1;;;::::0;48965:18;;48941:13:::1;48933:51:::0;48941:13;48933:51;48965:18;48941:13;48933:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;49003:13:0::1;::::0;48995:51:::1;::::0;-1:-1:-1;;;;;49003:13:0;;::::1;::::0;48995:51;::::1;;;::::0;49027:18;;49003:13:::1;48995:51:::0;49003:13;48995:51;49027:18;49003:13;48995:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;49065:13:0::1;::::0;49057:51:::1;::::0;-1:-1:-1;;;;;49065:13:0;;::::1;::::0;49057:51;::::1;;;::::0;49089:18;;49065:13:::1;49057:51:::0;49065:13;49057:51;49089:18;49065:13;49057:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;49127:13:0::1;::::0;49119:51:::1;::::0;-1:-1:-1;;;;;49127:13:0;;::::1;::::0;49119:51;::::1;;;::::0;49151:18;;49127:13:::1;49119:51:::0;49127:13;49119:51;49151:18;49127:13;49119:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;49189:13:0::1;::::0;49181:51:::1;::::0;-1:-1:-1;;;;;49189:13:0;;::::1;::::0;49181:51;::::1;;;::::0;49213:18;;49189:13:::1;49181:51:::0;49189:13;49181:51;49213:18;49189:13;49181:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;48183:1057;;;;;;;;48141:1099::o:0;55848:104::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;55920:10:::1;:24:::0;55848:104::o;51134:138::-;50878:13;;-1:-1:-1;;;;;50878:13:0;50864:10;:27;;:58;;-1:-1:-1;50909:13:0;;-1:-1:-1;;;;;50909:13:0;50895:10;:27;50864:58;:89;;;-1:-1:-1;50940:13:0;;-1:-1:-1;;;;;50940:13:0;50926:10;:27;50864:89;:120;;;-1:-1:-1;50971:13:0;;-1:-1:-1;;;;;50971:13:0;50957:10;:27;50864:120;:151;;;-1:-1:-1;51002:13:0;;-1:-1:-1;;;;;51002:13:0;50988:10;:27;50864:151;:182;;;-1:-1:-1;51033:13:0;;-1:-1:-1;;;;;51033:13:0;51019:10;:27;50864:182;:213;;;-1:-1:-1;51064:13:0;;-1:-1:-1;;;;;51064:13:0;51050:10;:27;50864:213;50856:252;;;;-1:-1:-1;;;50856:252:0;;16649:2:1;50856:252:0;;;16631:21:1;16688:2;16668:18;;;16661:30;16727:28;16707:18;;;16700:56;16773:18;;50856:252:0;16447:350:1;50856:252:0;51246:10:::1;51216:41;::::0;;;:29:::1;:41;::::0;;;;:48;;-1:-1:-1;;51216:48:0::1;51260:4;51216:48;::::0;;51134:138::o;56369:878::-;46883:10;46897:9;46883:23;46874:56;;;;-1:-1:-1;;;46874:56:0;;;;;;;:::i;:::-;53449:20:::1;::::0;::::1;;53441:69;;;;-1:-1:-1::0;;;53441:69:0::1;;;;;;;:::i;:::-;56486:27:::2;56506:6;56486:19;:27::i;:::-;56478:64;;;::::0;-1:-1:-1;;;56478:64:0;;13610:2:1;56478:64:0::2;::::0;::::2;13592:21:1::0;13649:2;13629:18;;;13622:30;-1:-1:-1;;;13668:18:1;;;13661:54;13732:18;;56478:64:0::2;13408:348:1::0;56478:64:0::2;56586:10;56561:36;::::0;;;:24:::2;:36;::::0;;;;;:41;56553:92:::2;;;;-1:-1:-1::0;;;56553:92:0::2;;;;;;;:::i;:::-;56677:14;;56664:9;:27;56656:59;;;;-1:-1:-1::0;;;56656:59:0::2;;;;;;;:::i;:::-;56763:24;;56734:26;;:53;56726:91;;;::::0;-1:-1:-1;;;56726:91:0;;22116:2:1;56726:91:0::2;::::0;::::2;22098:21:1::0;22155:2;22135:18;;;22128:30;-1:-1:-1;;;22174:18:1;;;22167:55;22239:18;;56726:91:0::2;21914:349:1::0;56726:91:0::2;39630:10:::0;:17;56836:9:::2;;:25;56828:63;;;;-1:-1:-1::0;;;56828:63:0::2;;;;;;;:::i;:::-;56929:10;56904:36;::::0;;;:24:::2;:36;::::0;;;;:38;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;57010:24:0::2;:26:::0;;;:24:::2;:26;::::0;::::2;:::i;:::-;;;;;;57122:12;57137:13;39630:10:::0;:17;;39542:113;57137:13:::2;57122:28;;57161:26;57167:10;57179:7;57161:5;:26::i;:::-;57205:34;::::0;10796:25:1;;;57219:10:0::2;::::0;57205:34:::2;::::0;10784:2:1;10769:18;57205:34:0::2;10650:177:1::0;26512:104:0;26568:13;26601:7;26594:14;;;;;:::i;28195:155::-;28290:52;2989:10;28323:8;28333;28290:18;:52::i;57988:514::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;58112:20:::1;:44:::0;;;58214:14:::1;:32:::0;;;58308:13:::1;:30:::0;;;58419:33:::1;58231:15:::0;58324:14;58419:18:::1;:33::i;:::-;58404:12;:48:::0;-1:-1:-1;;;57988:514:0:o;59174:127::-;59227:4;59251:42;59272:20;:18;:20::i;:::-;59251:16;;;:20;:42::i;29318:328::-;29493:41;2989:10;29526:7;29493:18;:41::i;:::-;29485:103;;;;-1:-1:-1;;;29485:103:0;;;;;;;:::i;:::-;29599:39;29613:4;29619:2;29623:7;29632:5;29599:13;:39::i;:::-;29318:328;;;;:::o;51911:157::-;50878:13;;51997:4;;-1:-1:-1;;;;;50878:13:0;50864:10;:27;;:58;;-1:-1:-1;50909:13:0;;-1:-1:-1;;;;;50909:13:0;50895:10;:27;50864:58;:89;;;-1:-1:-1;50940:13:0;;-1:-1:-1;;;;;50940:13:0;50926:10;:27;50864:89;:120;;;-1:-1:-1;50971:13:0;;-1:-1:-1;;;;;50971:13:0;50957:10;:27;50864:120;:151;;;-1:-1:-1;51002:13:0;;-1:-1:-1;;;;;51002:13:0;50988:10;:27;50864:151;:182;;;-1:-1:-1;51033:13:0;;-1:-1:-1;;;;;51033:13:0;51019:10;:27;50864:182;:213;;;-1:-1:-1;51064:13:0;;-1:-1:-1;;;;;51064:13:0;51050:10;:27;50864:213;50856:252;;;;-1:-1:-1;;;50856:252:0;;16649:2:1;50856:252:0;;;16631:21:1;16688:2;16668:18;;;16661:30;16727:28;16707:18;;;16700:56;16773:18;;50856:252:0;16447:350:1;50856:252:0;-1:-1:-1;;;;;;52021:39:0::1;;::::0;;;:29:::1;:39;::::0;;;;;::::1;;::::0;51911:157::o;55960:401::-;56078:28;;-1:-1:-1;;56095:10:0;8043:2:1;8039:15;8035:53;56078:28:0;;;8023:66:1;56035:4:0;;;;8105:12:1;;56078:28:0;;;;;;;;;;;;56068:39;;;;;;56052:55;;56133:6;56128:189;56149:6;:13;56145:1;:17;56128:189;;;56200:6;56207:1;56200:9;;;;;;;;:::i;:::-;;;;;;;56192:5;:17;:113;;56287:6;56294:1;56287:9;;;;;;;;:::i;:::-;;;;;;;56298:5;56270:34;;;;;;;;8285:19:1;;;8329:2;8320:12;;8313:28;8366:2;8357:12;;8128:247;56270:34:0;;;;;;;;;;;;;56260:45;;;;;;56192:113;;;56239:5;56246:6;56253:1;56246:9;;;;;;;;:::i;:::-;;;;;;;56222:34;;;;;;;;8285:19:1;;;8329:2;8320:12;;8313:28;8366:2;8357:12;;8128:247;56222:34:0;;;;;;;;;;;;;56212:45;;;;;;56192:113;56184:121;-1:-1:-1;56164:3:0;;;;:::i;:::-;;;;56128:189;;;-1:-1:-1;56343:10:0;;56334:19;;55960:401;-1:-1:-1;;55960:401:0:o;57837:111::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;57913:19:::1;:27:::0;;-1:-1:-1;;57913:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57837:111::o;62983:258::-;31221:4;31245:16;;;:7;:16;;;;;;63046:13;;-1:-1:-1;;;;;31245:16:0;63072:59;;;;-1:-1:-1;;;63072:59:0;;19770:2:1;63072:59:0;;;19752:21:1;19809:2;19789:18;;;19782:30;19848:31;19828:18;;;19821:59;19897:18;;63072:59:0;19568:353:1;63072:59:0;63173:12;63187:26;63204:8;63187:16;:26::i;:::-;63215:16;63156:76;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63142:91;;62983:258;;;:::o;59326:861::-;46883:10;46897:9;46883:23;46874:56;;;;-1:-1:-1;;;46874:56:0;;;;;;;:::i;:::-;57716:19:::1;::::0;::::1;;:56:::0;::::1;;;;57758:14;;57739:15;:33;;57716:56;57708:103;;;;-1:-1:-1::0;;;57708:103:0::1;;;;;;;:::i;:::-;59491:7:::2;59461:27;;:37;;;;:::i;:::-;59428:29;;:70;;59420:116;;;;-1:-1:-1::0;;;59420:116:0::2;;;;;;;:::i;:::-;59584:7;59568:13;39630:10:::0;:17;;39542:113;59568:13:::2;:23;;;;:::i;:::-;59555:9;;:36;;59547:74;;;;-1:-1:-1::0;;;59547:74:0::2;;;;;;;:::i;:::-;59645:7;59640:1;:12;;59632:67;;;;-1:-1:-1::0;;;59632:67:0::2;;;;;;;:::i;:::-;59756:7;59731:22;:20;:22::i;:::-;:32;;;;:::i;:::-;59718:9;:45;;59710:77;;;;-1:-1:-1::0;;;59710:77:0::2;;;;;;;:::i;:::-;59831:7;59800:27;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;59908:6:0::2;::::0;-1:-1:-1;59903:277:0::2;59924:7;59920:1;:11;59903:277;;;59955:12;59970:13;39630:10:::0;:17;;39542:113;59970:13:::2;59955:28;;59998:18;60019:22;:20;:22::i;:::-;59998:43;;60056:26;60062:10;60074:7;60056:5;:26::i;:::-;60116:52;::::0;;24633:25:1;;;24689:2;24674:18;;24667:34;;;60133:10:0::2;::::0;60116:52:::2;::::0;24606:18:1;60116:52:0::2;;;;;;;59938:242;;59933:3;;;;;:::i;:::-;;;;59903:277;;53680:415:::0;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;53794:17;;53768:23:::1;53822:159;53843:18;53839:1;:22;53822:159;;;53924:1;53883:23;:38;53907:10;53918:1;53907:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;53883:38:0::1;-1:-1:-1::0;;;;;53883:38:0::1;;;;;;;;;;;;:42;;;;53863:3;;;;;:::i;:::-;;;;53822:159;;;;54015:18;53991:20;;:42;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;53680:415:0:o;54472:369::-;4311:6;;54575:4;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;54618:17;;54592:23:::1;54646:166;54667:18;54663:1;:22;54646:166;;;54736:10;54711:36;::::0;;;:24:::1;:36;::::0;;;;;:41;54707:94:::1;;-1:-1:-1::0;54780:5:0::1;::::0;54101:365;-1:-1:-1;;;54101:365:0:o;54707:94::-:1;54687:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54646:166;;58810:116:::0;58859:4;58883:35;58901:16;:14;:16::i;51730:136::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;51352:13:::1;::::0;-1:-1:-1;;;;;51352:13:0::1;51322:44;::::0;;;:29:::1;:44;::::0;;;;;::::1;;:92:::0;::::1;;;-1:-1:-1::0;51400:13:0::1;::::0;-1:-1:-1;;;;;51400:13:0::1;51370:44;::::0;;;:29:::1;:44;::::0;;;;;::::1;;51322:92;:140;;;;-1:-1:-1::0;51448:13:0::1;::::0;-1:-1:-1;;;;;51448:13:0::1;51418:44;::::0;;;:29:::1;:44;::::0;;;;;::::1;;51322:140;:188;;;;-1:-1:-1::0;51496:13:0::1;::::0;-1:-1:-1;;;;;51496:13:0::1;51466:44;::::0;;;:29:::1;:44;::::0;;;;;::::1;;51322:188;:236;;;;-1:-1:-1::0;51544:13:0::1;::::0;-1:-1:-1;;;;;51544:13:0::1;51514:44;::::0;;;:29:::1;:44;::::0;;;;;::::1;;51322:236;:284;;;;-1:-1:-1::0;51592:13:0::1;::::0;-1:-1:-1;;;;;51592:13:0::1;51562:44;::::0;;;:29:::1;:44;::::0;;;;;::::1;;51322:284;:332;;;;-1:-1:-1::0;51640:13:0::1;::::0;-1:-1:-1;;;;;51640:13:0::1;51610:44;::::0;;;:29:::1;:44;::::0;;;;;::::1;;51322:332;51314:390;;;::::0;-1:-1:-1;;;51314:390:0;;23654:2:1;51314:390:0::1;::::0;::::1;23636:21:1::0;23693:2;23673:18;;;23666:30;23732:34;23712:18;;;23705:62;-1:-1:-1;;;23783:18:1;;;23776:43;23836:19;;51314:390:0::1;23452:409:1::0;51314:390:0::1;51806:51:::2;::::0;51814:10:::2;::::0;51835:21:::2;51806:51:::0;::::2;;;::::0;::::2;::::0;;;51835:21;51814:10;51806:51;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;51730:136::o:0;5147:201::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5236:22:0;::::1;5228:73;;;::::0;-1:-1:-1;;;5228:73:0;;12846:2:1;5228:73:0::1;::::0;::::1;12828:21:1::0;12885:2;12865:18;;;12858:30;12924:34;12904:18;;;12897:62;-1:-1:-1;;;12975:18:1;;;12968:36;13021:19;;5228:73:0::1;12644:402:1::0;5228:73:0::1;5312:28;5331:8;5312:18;:28::i;62273:441::-:0;46883:10;46897:9;46883:23;46874:56;;;;-1:-1:-1;;;46874:56:0;;;;;;;:::i;:::-;61079:19:::1;::::0;::::1;;:63:::0;::::1;;;;61121:21;;61102:15;:40;;61079:63;61071:110;;;;-1:-1:-1::0;;;61071:110:0::1;;;;;;;:::i;:::-;39630:10:::0;:17;62359:9:::2;;:25;62351:63;;;::::0;-1:-1:-1;;;62351:63:0;;12492:2:1;62351:63:0::2;::::0;::::2;12474:21:1::0;12531:2;12511:18;;;12504:30;-1:-1:-1;;;12550:18:1;;;12543:55;12615:18;;62351:63:0::2;12290:349:1::0;62351:63:0::2;62446:17;;62433:9;:30;62425:62;;;;-1:-1:-1::0;;;62425:62:0::2;;;;;;;:::i;:::-;62500:24;:26:::0;;;:24:::2;:26;::::0;::::2;:::i;:::-;;;;;;62586:12;62601:13;39630:10:::0;:17;;39542:113;62601:13:::2;62586:28;;62625:26;62631:10;62643:7;62625:5;:26::i;:::-;62669:37;::::0;10796:25:1;;;62686:10:0::2;::::0;62669:37:::2;::::0;10784:2:1;10769:18;62669:37:0::2;10650:177:1::0;25398:305:0;25500:4;-1:-1:-1;;;;;;25537:40:0;;-1:-1:-1;;;25537:40:0;;:105;;-1:-1:-1;;;;;;;25594:48:0;;-1:-1:-1;;;25594:48:0;25537:105;:158;;;-1:-1:-1;;;;;;;;;;16991:40:0;;;25659:36;16882:157;33134:382;-1:-1:-1;;;;;33214:16:0;;33206:61;;;;-1:-1:-1;;;33206:61:0;;19409:2:1;33206:61:0;;;19391:21:1;;;19428:18;;;19421:30;19487:34;19467:18;;;19460:62;19539:18;;33206:61:0;19207:356:1;33206:61:0;31221:4;31245:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31245:16:0;:30;33278:58;;;;-1:-1:-1;;;33278:58:0;;13253:2:1;33278:58:0;;;13235:21:1;13292:2;13272:18;;;13265:30;13331;13311:18;;;13304:58;13379:18;;33278:58:0;13051:352:1;33278:58:0;33349:45;33378:1;33382:2;33386:7;33349:20;:45::i;:::-;-1:-1:-1;;;;;33407:13:0;;;;;;:9;:13;;;;;:18;;33424:1;;33407:13;:18;;33424:1;;33407:18;:::i;:::-;;;;-1:-1:-1;;33436:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33436:21:0;-1:-1:-1;;;;;33436:21:0;;;;;;;;33475:33;;33436:16;;;33475:33;;33436:16;;33475:33;33134:382;;:::o;45498:124::-;45556:7;45589:1;45584;:6;;45576:15;;;;;;45609:5;45613:1;45609;:5;:::i;:::-;45602:12;45498:124;-1:-1:-1;;;45498:124:0:o;45207:181::-;45265:9;45291:6;45287:25;;-1:-1:-1;45308:1:0;45301:8;;45287:25;45326:5;45330:1;45326;:5;:::i;:::-;45322:9;-1:-1:-1;45359:1:0;45350:5;45354:1;45322:9;45350:5;:::i;:::-;:10;45342:19;;;;;45394:98;45452:7;45479:5;45483:1;45479;:5;:::i;35138:174::-;35213:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35213:29:0;-1:-1:-1;;;;;35213:29:0;;;;;;;;:24;;35267:23;35213:24;35267:14;:23::i;:::-;-1:-1:-1;;;;;35258:46:0;;;;;;;;;;;35138:174;;:::o;31450:348::-;31543:4;31245:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31245:16:0;31560:73;;;;-1:-1:-1;;;31560:73:0;;15076:2:1;31560:73:0;;;15058:21:1;15115:2;15095:18;;;15088:30;15154:34;15134:18;;;15127:62;-1:-1:-1;;;15205:18:1;;;15198:42;15257:19;;31560:73:0;14874:408:1;31560:73:0;31644:13;31660:23;31675:7;31660:14;:23::i;:::-;31644:39;;31713:5;-1:-1:-1;;;;;31702:16:0;:7;-1:-1:-1;;;;;31702:16:0;;:51;;;;31746:7;-1:-1:-1;;;;;31722:31:0;:20;31734:7;31722:11;:20::i;:::-;-1:-1:-1;;;;;31722:31:0;;31702:51;:87;;;-1:-1:-1;;;;;;28542:25:0;;;28518:4;28542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31757:32;31694:96;31450:348;-1:-1:-1;;;;31450:348:0:o;34442:578::-;34601:4;-1:-1:-1;;;;;34574:31:0;:23;34589:7;34574:14;:23::i;:::-;-1:-1:-1;;;;;34574:31:0;;34566:85;;;;-1:-1:-1;;;34566:85:0;;20902:2:1;34566:85:0;;;20884:21:1;20941:2;20921:18;;;20914:30;20980:34;20960:18;;;20953:62;-1:-1:-1;;;21031:18:1;;;21024:39;21080:19;;34566:85:0;20700:405:1;34566:85:0;-1:-1:-1;;;;;34670:16:0;;34662:65;;;;-1:-1:-1;;;34662:65:0;;13963:2:1;34662:65:0;;;13945:21:1;14002:2;13982:18;;;13975:30;14041:34;14021:18;;;14014:62;-1:-1:-1;;;14092:18:1;;;14085:34;14136:19;;34662:65:0;13761:400:1;34662:65:0;34740:39;34761:4;34767:2;34771:7;34740:20;:39::i;:::-;34844:29;34861:1;34865:7;34844:8;:29::i;:::-;-1:-1:-1;;;;;34886:15:0;;;;;;:9;:15;;;;;:20;;34905:1;;34886:15;:20;;34905:1;;34886:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34917:13:0;;;;;;:9;:13;;;;;:18;;34934:1;;34917:13;:18;;34934:1;;34917:18;:::i;:::-;;;;-1:-1:-1;;34946:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34946:21:0;-1:-1:-1;;;;;34946:21:0;;;;;;;;;34985:27;;34946:16;;34985:27;;;;;;;34442:578;;;:::o;45628:142::-;45686:9;45712:5;45716:1;45712;:5;:::i;:::-;45708:9;;45741:1;45736;:6;;45728:15;;;;;5508:191;5601:6;;;-1:-1:-1;;;;;5618:17:0;;;-1:-1:-1;;;;;;5618:17:0;;;;;;;5651:40;;5601:6;;;5618:17;5601:6;;5651:40;;5582:16;;5651:40;5571:128;5508:191;:::o;35454:315::-;35609:8;-1:-1:-1;;;;;35600:17:0;:5;-1:-1:-1;;;;;35600:17:0;;;35592:55;;;;-1:-1:-1;;;35592:55:0;;14368:2:1;35592:55:0;;;14350:21:1;14407:2;14387:18;;;14380:30;14446:27;14426:18;;;14419:55;14491:18;;35592:55:0;14166:349:1;35592:55:0;-1:-1:-1;;;;;35658:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;35658:46:0;;;;;;;;;;35720:41;;10598::1;;;35720::0;;10571:18:1;35720:41:0;;;;;;;35454:315;;;:::o;30528:::-;30685:28;30695:4;30701:2;30705:7;30685:9;:28::i;:::-;30732:48;30755:4;30761:2;30765:7;30774:5;30732:22;:48::i;:::-;30724:111;;;;-1:-1:-1;;;30724:111:0;;;;;;;:::i;418:723::-;474:13;695:10;691:53;;-1:-1:-1;;722:10:0;;;;;;;;;;;;-1:-1:-1;;;722:10:0;;;;;418:723::o;691:53::-;769:5;754:12;810:78;817:9;;810:78;;843:8;;;;:::i;:::-;;-1:-1:-1;866:10:0;;-1:-1:-1;874:2:0;866:10;;:::i;:::-;;;810:78;;;898:19;930:6;920:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;920:17:0;;898:39;;948:154;955:10;;948:154;;982:11;992:1;982:11;;:::i;:::-;;-1:-1:-1;1051:10:0;1059:2;1051:5;:10;:::i;:::-;1038:24;;:2;:24;:::i;:::-;1025:39;;1008:6;1015;1008:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1008:56:0;;;;;;;;-1:-1:-1;1079:11:0;1088:2;1079:11;;:::i;:::-;;;948:154;;40578:589;-1:-1:-1;;;;;40784:18:0;;40780:187;;40819:40;40851:7;41994:10;:17;;41967:24;;;;:15;:24;;;;;:44;;;42022:24;;;;;;;;;;;;41890:164;40819:40;40780:187;;;40889:2;-1:-1:-1;;;;;40881:10:0;:4;-1:-1:-1;;;;;40881:10:0;;40877:90;;40908:47;40941:4;40947:7;40908:32;:47::i;:::-;-1:-1:-1;;;;;40981:16:0;;40977:183;;41014:45;41051:7;41014:36;:45::i;40977:183::-;41087:4;-1:-1:-1;;;;;41081:10:0;:2;-1:-1:-1;;;;;41081:10:0;;41077:83;;41108:40;41136:2;41140:7;41108:27;:40::i;36334:799::-;36489:4;-1:-1:-1;;;;;36510:13:0;;6902:20;6950:8;36506:620;;36546:72;;-1:-1:-1;;;36546:72:0;;-1:-1:-1;;;;;36546:36:0;;;;;:72;;2989:10;;36597:4;;36603:7;;36612:5;;36546:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36546:72:0;;;;;;;;-1:-1:-1;;36546:72:0;;;;;;;;;;;;:::i;:::-;;;36542:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36788:13:0;;36784:272;;36831:60;;-1:-1:-1;;;36831:60:0;;;;;;;:::i;36784:272::-;37006:6;37000:13;36991:6;36987:2;36983:15;36976:38;36542:529;-1:-1:-1;;;;;;36669:51:0;-1:-1:-1;;;36669:51:0;;-1:-1:-1;36662:58:0;;36506:620;-1:-1:-1;37110:4:0;36334:799;;;;;;:::o;42681:988::-;42947:22;42997:1;42972:22;42989:4;42972:16;:22::i;:::-;:26;;;;:::i;:::-;43009:18;43030:26;;;:17;:26;;;;;;42947:51;;-1:-1:-1;43163:28:0;;;43159:328;;-1:-1:-1;;;;;43230:18:0;;43208:19;43230:18;;;:12;:18;;;;;;;;:34;;;;;;;;;43281:30;;;;;;:44;;;43398:30;;:17;:30;;;;;:43;;;43159:328;-1:-1:-1;43583:26:0;;;;:17;:26;;;;;;;;43576:33;;;-1:-1:-1;;;;;43627:18:0;;;;;:12;:18;;;;;:34;;;;;;;43620:41;42681:988::o;43964:1079::-;44242:10;:17;44217:22;;44242:21;;44262:1;;44242:21;:::i;:::-;44274:18;44295:24;;;:15;:24;;;;;;44668:10;:26;;44217:46;;-1:-1:-1;44295:24:0;;44217:46;;44668:26;;;;;;:::i;:::-;;;;;;;;;44646:48;;44732:11;44707:10;44718;44707:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;44812:28;;;:15;:28;;;;;;;:41;;;44984:24;;;;;44977:31;45019:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;44035:1008;;;43964:1079;:::o;41468:221::-;41553:14;41570:20;41587:2;41570:16;:20::i;:::-;-1:-1:-1;;;;;41601:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41646:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;41468:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;603:160;668:20;;724:13;;717:21;707:32;;697:60;;753:1;750;743:12;768:186;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;919:29;938:9;919:29;:::i;959:260::-;1027:6;1035;1088:2;1076:9;1067:7;1063:23;1059:32;1056:52;;;1104:1;1101;1094:12;1056:52;1127:29;1146:9;1127:29;:::i;:::-;1117:39;;1175:38;1209:2;1198:9;1194:18;1175:38;:::i;:::-;1165:48;;959:260;;;;;:::o;1224:328::-;1301:6;1309;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;;1457:38;1491:2;1480:9;1476:18;1457:38;:::i;:::-;1447:48;;1542:2;1531:9;1527:18;1514:32;1504:42;;1224:328;;;;;:::o;1557:666::-;1652:6;1660;1668;1676;1729:3;1717:9;1708:7;1704:23;1700:33;1697:53;;;1746:1;1743;1736:12;1697:53;1769:29;1788:9;1769:29;:::i;:::-;1759:39;;1817:38;1851:2;1840:9;1836:18;1817:38;:::i;:::-;1807:48;;1902:2;1891:9;1887:18;1874:32;1864:42;;1957:2;1946:9;1942:18;1929:32;1984:18;1976:6;1973:30;1970:50;;;2016:1;2013;2006:12;1970:50;2039:22;;2092:4;2084:13;;2080:27;-1:-1:-1;2070:55:1;;2121:1;2118;2111:12;2070:55;2144:73;2209:7;2204:2;2191:16;2186:2;2182;2178:11;2144:73;:::i;:::-;2134:83;;;1557:666;;;;;;;:::o;2228:254::-;2293:6;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2393:29;2412:9;2393:29;:::i;:::-;2383:39;;2441:35;2472:2;2461:9;2457:18;2441:35;:::i;2487:254::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2655:29;2674:9;2655:29;:::i;:::-;2645:39;2731:2;2716:18;;;;2703:32;;-1:-1:-1;;;2487:254:1:o;2746:908::-;2830:6;2861:2;2904;2892:9;2883:7;2879:23;2875:32;2872:52;;;2920:1;2917;2910:12;2872:52;2960:9;2947:23;2993:18;2985:6;2982:30;2979:50;;;3025:1;3022;3015:12;2979:50;3048:22;;3101:4;3093:13;;3089:27;-1:-1:-1;3079:55:1;;3130:1;3127;3120:12;3079:55;3166:2;3153:16;3189:60;3205:43;3245:2;3205:43;:::i;:::-;3189:60;:::i;:::-;3271:3;3295:2;3290:3;3283:15;3323:2;3318:3;3314:12;3307:19;;3354:2;3350;3346:11;3402:7;3397:2;3391;3388:1;3384:10;3380:2;3376:19;3372:28;3369:41;3366:61;;;3423:1;3420;3413:12;3366:61;3445:1;3436:10;;3455:169;3469:2;3466:1;3463:9;3455:169;;;3526:23;3545:3;3526:23;:::i;:::-;3514:36;;3487:1;3480:9;;;;;3570:12;;;;3602;;3455:169;;;-1:-1:-1;3643:5:1;2746:908;-1:-1:-1;;;;;;;2746:908:1:o;3659:902::-;3743:6;3774:2;3817;3805:9;3796:7;3792:23;3788:32;3785:52;;;3833:1;3830;3823:12;3785:52;3873:9;3860:23;3906:18;3898:6;3895:30;3892:50;;;3938:1;3935;3928:12;3892:50;3961:22;;4014:4;4006:13;;4002:27;-1:-1:-1;3992:55:1;;4043:1;4040;4033:12;3992:55;4079:2;4066:16;4102:60;4118:43;4158:2;4118:43;:::i;4102:60::-;4184:3;4208:2;4203:3;4196:15;4236:2;4231:3;4227:12;4220:19;;4267:2;4263;4259:11;4315:7;4310:2;4304;4301:1;4297:10;4293:2;4289:19;4285:28;4282:41;4279:61;;;4336:1;4333;4326:12;4279:61;4358:1;4349:10;;4368:163;4382:2;4379:1;4376:9;4368:163;;;4439:17;;4427:30;;4400:1;4393:9;;;;;4477:12;;;;4509;;4368:163;;4566:180;4622:6;4675:2;4663:9;4654:7;4650:23;4646:32;4643:52;;;4691:1;4688;4681:12;4643:52;4714:26;4730:9;4714:26;:::i;4751:180::-;4810:6;4863:2;4851:9;4842:7;4838:23;4834:32;4831:52;;;4879:1;4876;4869:12;4831:52;-1:-1:-1;4902:23:1;;4751:180;-1:-1:-1;4751:180:1:o;4936:245::-;4994:6;5047:2;5035:9;5026:7;5022:23;5018:32;5015:52;;;5063:1;5060;5053:12;5015:52;5102:9;5089:23;5121:30;5145:5;5121:30;:::i;5186:249::-;5255:6;5308:2;5296:9;5287:7;5283:23;5279:32;5276:52;;;5324:1;5321;5314:12;5276:52;5356:9;5350:16;5375:30;5399:5;5375:30;:::i;5440:450::-;5509:6;5562:2;5550:9;5541:7;5537:23;5533:32;5530:52;;;5578:1;5575;5568:12;5530:52;5618:9;5605:23;5651:18;5643:6;5640:30;5637:50;;;5683:1;5680;5673:12;5637:50;5706:22;;5759:4;5751:13;;5747:27;-1:-1:-1;5737:55:1;;5788:1;5785;5778:12;5737:55;5811:73;5876:7;5871:2;5858:16;5853:2;5849;5845:11;5811:73;:::i;6080:248::-;6145:6;6153;6206:2;6194:9;6185:7;6181:23;6177:32;6174:52;;;6222:1;6219;6212:12;6174:52;6258:9;6245:23;6235:33;;6287:35;6318:2;6307:9;6303:18;6287:35;:::i;6333:316::-;6410:6;6418;6426;6479:2;6467:9;6458:7;6454:23;6450:32;6447:52;;;6495:1;6492;6485:12;6447:52;-1:-1:-1;;6518:23:1;;;6588:2;6573:18;;6560:32;;-1:-1:-1;6639:2:1;6624:18;;;6611:32;;6333:316;-1:-1:-1;6333:316:1:o;6654:257::-;6695:3;6733:5;6727:12;6760:6;6755:3;6748:19;6776:63;6832:6;6825:4;6820:3;6816:14;6809:4;6802:5;6798:16;6776:63;:::i;:::-;6893:2;6872:15;-1:-1:-1;;6868:29:1;6859:39;;;;6900:4;6855:50;;6654:257;-1:-1:-1;;6654:257:1:o;6916:973::-;7001:12;;6966:3;;7056:1;7076:18;;;;7129;;;;7156:61;;7210:4;7202:6;7198:17;7188:27;;7156:61;7236:2;7284;7276:6;7273:14;7253:18;7250:38;7247:161;;;7330:10;7325:3;7321:20;7318:1;7311:31;7365:4;7362:1;7355:15;7393:4;7390:1;7383:15;7247:161;7424:18;7451:104;;;;7569:1;7564:319;;;;7417:466;;7451:104;-1:-1:-1;;7484:24:1;;7472:37;;7529:16;;;;-1:-1:-1;7451:104:1;;7564:319;25253:1;25246:14;;;25290:4;25277:18;;7658:1;7672:165;7686:6;7683:1;7680:13;7672:165;;;7764:14;;7751:11;;;7744:35;7807:16;;;;7701:10;;7672:165;;;7676:3;;7866:6;7861:3;7857:16;7850:23;;7417:466;;;;;;;6916:973;;;;:::o;8380:456::-;8601:3;8629:38;8663:3;8655:6;8629:38;:::i;:::-;8696:6;8690:13;8712:52;8757:6;8753:2;8746:4;8738:6;8734:17;8712:52;:::i;:::-;8780:50;8822:6;8818:2;8814:15;8806:6;8780:50;:::i;:::-;8773:57;8380:456;-1:-1:-1;;;;;;;8380:456:1:o;9049:488::-;-1:-1:-1;;;;;9318:15:1;;;9300:34;;9370:15;;9365:2;9350:18;;9343:43;9417:2;9402:18;;9395:34;;;9465:3;9460:2;9445:18;;9438:31;;;9243:4;;9486:45;;9511:19;;9503:6;9486:45;:::i;:::-;9478:53;9049:488;-1:-1:-1;;;;;;9049:488:1:o;9821:632::-;9992:2;10044:21;;;10114:13;;10017:18;;;10136:22;;;9963:4;;9992:2;10215:15;;;;10189:2;10174:18;;;9963:4;10258:169;10272:6;10269:1;10266:13;10258:169;;;10333:13;;10321:26;;10402:15;;;;10367:12;;;;10294:1;10287:9;10258:169;;;-1:-1:-1;10444:3:1;;9821:632;-1:-1:-1;;;;;;9821:632:1:o;10832:219::-;10981:2;10970:9;10963:21;10944:4;11001:44;11041:2;11030:9;11026:18;11018:6;11001:44;:::i;11056:398::-;11258:2;11240:21;;;11297:2;11277:18;;;11270:30;11336:34;11331:2;11316:18;;11309:62;-1:-1:-1;;;11402:2:1;11387:18;;11380:32;11444:3;11429:19;;11056:398::o;11871:414::-;12073:2;12055:21;;;12112:2;12092:18;;;12085:30;12151:34;12146:2;12131:18;;12124:62;-1:-1:-1;;;12217:2:1;12202:18;;12195:48;12275:3;12260:19;;11871:414::o;14520:349::-;14722:2;14704:21;;;14761:2;14741:18;;;14734:30;14800:27;14795:2;14780:18;;14773:55;14860:2;14845:18;;14520:349::o;15287:402::-;15489:2;15471:21;;;15528:2;15508:18;;;15501:30;15567:34;15562:2;15547:18;;15540:62;-1:-1:-1;;;15633:2:1;15618:18;;15611:36;15679:3;15664:19;;15287:402::o;15694:400::-;15896:2;15878:21;;;15935:2;15915:18;;;15908:30;15974:34;15969:2;15954:18;;15947:62;-1:-1:-1;;;16040:2:1;16025:18;;16018:34;16084:3;16069:19;;15694:400::o;16099:343::-;16301:2;16283:21;;;16340:2;16320:18;;;16313:30;-1:-1:-1;;;16374:2:1;16359:18;;16352:49;16433:2;16418:18;;16099:343::o;18456:398::-;18658:2;18640:21;;;18697:2;18677:18;;;18670:30;18736:34;18731:2;18716:18;;18709:62;-1:-1:-1;;;18802:2:1;18787:18;;18780:32;18844:3;18829:19;;18456:398::o;18859:343::-;19061:2;19043:21;;;19100:2;19080:18;;;19073:30;-1:-1:-1;;;19134:2:1;19119:18;;19112:49;19193:2;19178:18;;18859:343::o;20339:356::-;20541:2;20523:21;;;20560:18;;;20553:30;20619:34;20614:2;20599:18;;20592:62;20686:2;20671:18;;20339:356::o;21110:397::-;21312:2;21294:21;;;21351:2;21331:18;;;21324:30;21390:34;21385:2;21370:18;;21363:62;-1:-1:-1;;;21456:2:1;21441:18;;21434:31;21497:3;21482:19;;21110:397::o;22268:413::-;22470:2;22452:21;;;22509:2;22489:18;;;22482:30;22548:34;22543:2;22528:18;;22521:62;-1:-1:-1;;;22614:2:1;22599:18;;22592:47;22671:3;22656:19;;22268:413::o;23866:406::-;24068:2;24050:21;;;24107:2;24087:18;;;24080:30;24146:34;24141:2;24126:18;;24119:62;-1:-1:-1;;;24212:2:1;24197:18;;24190:40;24262:3;24247:19;;23866:406::o;24712:275::-;24783:2;24777:9;24848:2;24829:13;;-1:-1:-1;;24825:27:1;24813:40;;24883:18;24868:34;;24904:22;;;24865:62;24862:88;;;24930:18;;:::i;:::-;24966:2;24959:22;24712:275;;-1:-1:-1;24712:275:1:o;24992:183::-;25052:4;25085:18;25077:6;25074:30;25071:56;;;25107:18;;:::i;:::-;-1:-1:-1;25152:1:1;25148:14;25164:4;25144:25;;24992:183::o;25306:128::-;25346:3;25377:1;25373:6;25370:1;25367:13;25364:39;;;25383:18;;:::i;:::-;-1:-1:-1;25419:9:1;;25306:128::o;25439:120::-;25479:1;25505;25495:35;;25510:18;;:::i;:::-;-1:-1:-1;25544:9:1;;25439:120::o;25564:168::-;25604:7;25670:1;25666;25662:6;25658:14;25655:1;25652:21;25647:1;25640:9;25633:17;25629:45;25626:71;;;25677:18;;:::i;:::-;-1:-1:-1;25717:9:1;;25564:168::o;25737:125::-;25777:4;25805:1;25802;25799:8;25796:34;;;25810:18;;:::i;:::-;-1:-1:-1;25847:9:1;;25737:125::o;25867:258::-;25939:1;25949:113;25963:6;25960:1;25957:13;25949:113;;;26039:11;;;26033:18;26020:11;;;26013:39;25985:2;25978:10;25949:113;;;26080:6;26077:1;26074:13;26071:48;;;-1:-1:-1;;26115:1:1;26097:16;;26090:27;25867:258::o;26130:380::-;26209:1;26205:12;;;;26252;;;26273:61;;26327:4;26319:6;26315:17;26305:27;;26273:61;26380:2;26372:6;26369:14;26349:18;26346:38;26343:161;;;26426:10;26421:3;26417:20;26414:1;26407:31;26461:4;26458:1;26451:15;26489:4;26486:1;26479:15;26343:161;;26130:380;;;:::o;26515:135::-;26554:3;-1:-1:-1;;26575:17:1;;26572:43;;;26595:18;;:::i;:::-;-1:-1:-1;26642:1:1;26631:13;;26515:135::o;26655:112::-;26687:1;26713;26703:35;;26718:18;;:::i;:::-;-1:-1:-1;26752:9:1;;26655:112::o;26772:127::-;26833:10;26828:3;26824:20;26821:1;26814:31;26864:4;26861:1;26854:15;26888:4;26885:1;26878:15;26904:127;26965:10;26960:3;26956:20;26953:1;26946:31;26996:4;26993:1;26986:15;27020:4;27017:1;27010:15;27036:127;27097:10;27092:3;27088:20;27085:1;27078:31;27128:4;27125:1;27118:15;27152:4;27149:1;27142:15;27168:127;27229:10;27224:3;27220:20;27217:1;27210:31;27260:4;27257:1;27250:15;27284:4;27281:1;27274:15;27300:127;27361:10;27356:3;27352:20;27349:1;27342:31;27392:4;27389:1;27382:15;27416:4;27413:1;27406:15;27432:131;-1:-1:-1;;;;;;27506:32:1;;27496:43;;27486:71;;27553:1;27550;27543:12
Swarm Source
ipfs://e7745a08d17366ac76bf7bda49fb00d13d8071ce3635041686ce3f5ed313d0d9
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.