Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 13732788 | 991 days ago | IN | 0 ETH | 0.49058516 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract contains unverified libraries: Looting
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
EvoSnailsV2
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-03 */ // Sources flattened with hardhat v2.6.5 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // SPDX-License-Identifier: MIT 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 IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] 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 IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/[email protected] 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 IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] 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 ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] 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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal initializer { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal initializer { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] 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 ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable 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. */ function __ERC721_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).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 = ERC721Upgradeable.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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public 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 = ERC721Upgradeable.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 = ERC721Upgradeable.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(ERC721Upgradeable.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(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.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 {} uint256[44] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/[email protected] 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 IERC721EnumerableUpgradeable is IERC721Upgradeable { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/[email protected] 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 ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable { function __ERC721Enumerable_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721Enumerable_init_unchained(); } function __ERC721Enumerable_init_unchained() internal initializer { } // 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(IERC165Upgradeable, ERC721Upgradeable) returns (bool) { return interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721Upgradeable.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 < ERC721EnumerableUpgradeable.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 = ERC721Upgradeable.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 = ERC721Upgradeable.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(); } uint256[46] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] 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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721BurnableUpgradeable is Initializable, ContextUpgradeable, ERC721Upgradeable { function __ERC721Burnable_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721Burnable_init_unchained(); } function __ERC721Burnable_init_unchained() internal initializer { } /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library CountersUpgradeable { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts-upgradeable/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts-upgradeable/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} uint256[45] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20BurnableUpgradeable is Initializable, ContextUpgradeable, ERC20Upgradeable { function __ERC20Burnable_init() internal initializer { __Context_init_unchained(); __ERC20Burnable_init_unchained(); } function __ERC20Burnable_init_unchained() internal initializer { } /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 currentAllowance = allowance(account, _msgSender()); require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); unchecked { _approve(account, _msgSender(), currentAllowance - amount); } _burn(account, amount); } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev ERC20 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable { function __ERC20Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); __ERC20Pausable_init_unchained(); } function __ERC20Pausable_init_unchained() internal initializer { } /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); require(!paused(), "ERC20Pausable: token transfer while paused"); } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts-upgradeable/access/[email protected] pragma solidity ^0.8.0; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerableUpgradeable is IAccessControlUpgradeable { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // File @openzeppelin/contracts-upgradeable/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); } function __AccessControl_init_unchained() internal initializer { } struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", StringsUpgradeable.toHexString(uint160(account), 20), " is missing role ", StringsUpgradeable.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/structs/[email protected] pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } // File @openzeppelin/contracts-upgradeable/access/[email protected] pragma solidity ^0.8.0; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerableUpgradeable, AccessControlUpgradeable { function __AccessControlEnumerable_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); __AccessControlEnumerable_init_unchained(); } function __AccessControlEnumerable_init_unchained() internal initializer { } using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; mapping(bytes32 => EnumerableSetUpgradeable.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {grantRole} to track enumerable memberships */ function grantRole(bytes32 role, address account) public virtual override(AccessControlUpgradeable, IAccessControlUpgradeable) { super.grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {revokeRole} to track enumerable memberships */ function revokeRole(bytes32 role, address account) public virtual override(AccessControlUpgradeable, IAccessControlUpgradeable) { super.revokeRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {renounceRole} to track enumerable memberships */ function renounceRole(bytes32 role, address account) public virtual override(AccessControlUpgradeable, IAccessControlUpgradeable) { super.renounceRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {_setupRole} to track enumerable memberships */ function _setupRole(bytes32 role, address account) internal virtual override { super._setupRole(role, account); _roleMembers[role].add(account); } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/presets/[email protected] pragma solidity ^0.8.0; /** * @dev {ERC20} token, including: * * - ability for holders to burn (destroy) their tokens * - a minter role that allows for token minting (creation) * - a pauser role that allows to stop all token transfers * * This contract uses {AccessControl} to lock permissioned functions using the * different roles - head to its documentation for details. * * The account that deploys the contract will be granted the minter and pauser * roles, as well as the default admin role, which will let it grant both minter * and pauser roles to other accounts. */ contract ERC20PresetMinterPauserUpgradeable is Initializable, ContextUpgradeable, AccessControlEnumerableUpgradeable, ERC20BurnableUpgradeable, ERC20PausableUpgradeable { function initialize(string memory name, string memory symbol) public virtual initializer { __ERC20PresetMinterPauser_init(name, symbol); } bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); /** * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the * account that deploys the contract. * * See {ERC20-constructor}. */ function __ERC20PresetMinterPauser_init(string memory name, string memory symbol) internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); __AccessControlEnumerable_init_unchained(); __ERC20_init_unchained(name, symbol); __ERC20Burnable_init_unchained(); __Pausable_init_unchained(); __ERC20Pausable_init_unchained(); __ERC20PresetMinterPauser_init_unchained(name, symbol); } function __ERC20PresetMinterPauser_init_unchained(string memory name, string memory symbol) internal initializer { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); } /** * @dev Creates `amount` new tokens for `to`. * * See {ERC20-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to, uint256 amount) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint"); _mint(to, amount); } /** * @dev Pauses all token transfers. * * See {ERC20Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause"); _pause(); } /** * @dev Unpauses all token transfers. * * See {ERC20Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause"); _unpause(); } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override(ERC20Upgradeable, ERC20PausableUpgradeable) { super._beforeTokenTransfer(from, to, amount); } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/cryptography/[email protected] pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProofUpgradeable { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // File contracts/NFT.sol pragma solidity ^0.8.2; interface InventoryManager { function getTokenURI( uint16 id, uint8 background_, uint8 trail_, uint8 body_, uint8 shell_, uint8 eyes_, uint8 mouth_, uint8 accessory_, bool staked_, uint8 modifier_ ) external view returns (string memory); } contract Leaf is ERC20PresetMinterPauserUpgradeable { function init() public initializer { __ERC20PresetMinterPauser_init("Leaf", "LEAF"); } function burnFrom(address from, uint256 amount) public override { require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint"); _burn(from, amount); } } struct LootPool { uint16 cost; uint16 total; uint8 minTier; uint16 tier1; uint16 tier2; uint16 tier3; uint16 tier4; } struct Snail { uint8 background; uint8 trail; uint8 body; uint8 shell; uint8 eyes; uint8 mouth; uint8 accessory; } library Looting { function init(mapping(uint8 => LootPool) storage pools, mapping(uint8 => uint8[]) storage bodyToEyesMouth) public { pools[0] = LootPool({cost: 0, total: 100, minTier: 0, tier1: 95, tier2: 5, tier3: 0, tier4: 0}); pools[1] = LootPool({cost: 1, total: 100, minTier: 1, tier1: 80, tier2: 15, tier3: 5, tier4: 0}); pools[2] = LootPool({cost: 3, total: 30000, minTier: 1, tier1: 3900, tier2: 21000, tier3: 5100, tier4: 0}); pools[3] = LootPool({cost: 6, total: 20300, minTier: 2, tier1: 3048, tier2: 15222, tier3: 2030, tier4: 0}); pools[4] = LootPool({cost: 12, total: 13500, minTier: 3, tier1: 6750, tier2: 6750, tier3: 0, tier4: 0}); pools[5] = LootPool({cost: 24, total: 1666, minTier: 4, tier1: 833, tier2: 833, tier3: 0, tier4: 0}); pools[6] = LootPool({cost: 48, total: 3333, minTier: 5, tier1: 3328, tier2: 5, tier3: 0, tier4: 0}); bodyToEyesMouth[1] = [4, 6, 18, 8, 16, 20]; bodyToEyesMouth[2] = [4, 21, 26, 5, 16, 23]; bodyToEyesMouth[3] = [6, 21, 33, 2, 14, 23]; bodyToEyesMouth[4] = [21, 22, 33, 5, 8, 16]; bodyToEyesMouth[5] = [4, 6, 26, 20, 22, 23]; bodyToEyesMouth[6] = [8, 13, 26, 5, 12, 16]; bodyToEyesMouth[7] = [4, 25, 33, 3, 8, 18]; bodyToEyesMouth[8] = [2, 6, 25, 3, 10, 14]; bodyToEyesMouth[9] = [15, 21, 29, 3, 4, 17]; bodyToEyesMouth[10] = [18, 25, 31, 5, 19, 20]; bodyToEyesMouth[11] = [5, 10, 12, 9, 15, 16]; bodyToEyesMouth[12] = [1, 16, 29, 3, 7, 19]; bodyToEyesMouth[13] = [3, 8, 17, 10, 15, 20]; bodyToEyesMouth[14] = [2, 18, 30, 2, 5, 21]; bodyToEyesMouth[15] = [1, 4, 14, 10, 19, 21]; bodyToEyesMouth[16] = [6, 10, 28, 1, 9, 16]; bodyToEyesMouth[17] = [5, 8, 18, 9, 19, 21]; bodyToEyesMouth[18] = [1, 25, 26, 4, 7, 19]; bodyToEyesMouth[19] = [10, 13, 18, 1, 8, 15]; bodyToEyesMouth[20] = [1, 7, 33, 8, 9, 10]; bodyToEyesMouth[21] = [1, 3, 25, 9, 10, 22]; bodyToEyesMouth[22] = [2, 11, 18, 6, 9, 21]; bodyToEyesMouth[23] = [1, 3, 28, 9, 13, 18]; bodyToEyesMouth[24] = [26, 27, 32, 4, 10, 19]; bodyToEyesMouth[25] = [8, 14, 28, 1, 6, 7]; bodyToEyesMouth[26] = [1, 20, 28, 1, 10, 19]; bodyToEyesMouth[27] = [7, 25, 28, 8, 9, 15]; bodyToEyesMouth[28] = [7, 9, 25, 1, 7, 16]; bodyToEyesMouth[29] = [3, 10, 23, 15, 19, 23]; bodyToEyesMouth[30] = [7, 27, 32, 6, 9, 21]; } function checkFullSet(Snail storage snail, mapping(uint8 => bool) storage setClaimed) public { uint8[5][5] memory sets = [ [23, 16, 27, 13, 36], [25, 26, 29, 14, 37], [30, 29, 23, 29, 38], [27, 20, 20, 25, 40], [26, 30, 15, 27, 39] ]; for (uint8 i = 0; i < 5; i++) { if (setClaimed[i]) continue; if (snail.background == sets[i][0] && snail.body == sets[i][1] && snail.shell == sets[i][2] && snail.trail == sets[i][3]) { snail.accessory = sets[i][4]; setClaimed[i] = true; break; } } } } contract EvoSnails is ERC721Upgradeable, ERC721EnumerableUpgradeable, PausableUpgradeable, OwnableUpgradeable { using CountersUpgradeable for CountersUpgradeable.Counter; CountersUpgradeable.Counter private _tokenIdCounter; ///////////////////////////////////////////////////////////// // CONFIGURATION ///////////////////////////////////////////////////////////// uint256 public constant cost = 0.00 ether; uint256 public constant maxSupply = 5555; uint256 public constant maxMintAmount = 1; uint256 internal constant partsPerTier = 5; bool internal cooldownEnabled; bool internal gamePaused; uint88 public whitelistMintStartTime; uint88 public publicMintStartTime; uint88 public startTime; bytes32 public merkleRoot; mapping(address => uint256) snailsMinted; ERC20PresetMinterPauserUpgradeable public leaf; InventoryManager inventoryManager; ///////////////////////////////////////////////////////////// // UTILS ///////////////////////////////////////////////////////////// uint256 entropy; ///////////////////////////////////////////////////////////// // STRUCTURES ///////////////////////////////////////////////////////////// mapping(uint256 => Snail) public snails; enum ActivityState { UNSTAKED, GREENHOUSE } struct Activity { ActivityState state; address user; uint48 since; uint40 lastRoll; } mapping(uint256 => Activity) public snailActivities; enum Part { ACCESSORY, BACKGROUND, BODY, EYES, MOUTH, SHELL, TRAIL } mapping(uint8 => LootPool) public pools; mapping(uint8 => bool) public setClaimed; mapping(uint8 => uint8[]) internal bodyToEyesMouth; ///////////////////////////////////////////////////////////// // SET UP ///////////////////////////////////////////////////////////// function initialize() public initializer { __ERC721_init("EvoSnails", "EVOSNAIL"); __ERC721Enumerable_init(); __Pausable_init(); __Ownable_init(); cooldownEnabled = true; gamePaused = false; whitelistMintStartTime = 1635753600; publicMintStartTime = 1635796800; startTime = 1635800400; Looting.init(pools, bodyToEyesMouth); } function setInventoryManager(address manager) public onlyOwner { inventoryManager = InventoryManager(manager); } function setLeaf(address leaf_) public onlyOwner { leaf = Leaf(leaf_); } ///////////////////////////////////////////////////////////// // MINTING ///////////////////////////////////////////////////////////// function mint(uint256 _mintAmount) public payable noCheaters { uint256 supply = totalSupply(); require(block.timestamp > publicMintStartTime, "mint locked"); require(_mintAmount > 0, "amount must be >0"); require(_mintAmount <= maxMintAmount, "amount must < max"); require(supply + _mintAmount <= maxSupply, "sold out!"); if (msg.sender != owner()) { require(msg.value >= cost * _mintAmount, "no funds"); } for (uint256 i = 1; i <= _mintAmount; i++) { _mintSnail(msg.sender); } } function mintWhitelist( address account, uint256 tokenId, bytes32[] calldata proof ) public payable noCheaters { require(block.timestamp > whitelistMintStartTime, "mint locked"); if (msg.sender != owner() && tokenId > 113) { require(msg.value >= cost, "no funds"); } require(_verify(_leaf(account, tokenId), proof), "Invalid proof"); require(snailsMinted[account] == 0, "already minted"); snailsMinted[account]++; _mintSnail(account); } ///////////////////////////////////////////////////////////// // STAKING ///////////////////////////////////////////////////////////// function claimableLeaf(uint256 id) public view returns (uint256 _claimable) { Activity memory currentActivity = snailActivities[id]; uint256 diff = uint48(block.timestamp) - snailActivities[id].since; if (currentActivity.state == ActivityState.UNSTAKED) { _claimable = 0; return _claimable; } _claimable = ((diff * (leafModifier(id)) * 1 ether)) / 1 days; return _claimable; } function greenhouseSnails(uint256[] calldata ids) public noCheaters { require(block.timestamp > startTime, "not started"); require(!gamePaused, "game paused"); for (uint256 index = 0; index < ids.length; index++) { _greenhouse(ids[index]); } } function _greenhouse(uint256 id) private { Activity memory currentActivity = snailActivities[id]; require(currentActivity.state != ActivityState.GREENHOUSE, "already staked"); require(msg.sender == ownerOf(id), "not yours"); _transfer(msg.sender, address(this), id); snailActivities[id] = Activity({ state: ActivityState.GREENHOUSE, since: uint48(block.timestamp), user: msg.sender, lastRoll: currentActivity.lastRoll }); } function returnSnails(uint256[] calldata ids) public noCheaters { for (uint256 index = 0; index < ids.length; index++) { _returnSnail(ids[index]); } } function _returnSnail(uint256 id) private { Activity memory currentActivity = snailActivities[id]; require(currentActivity.state != ActivityState.UNSTAKED, "already unstaked"); require(msg.sender == snailActivities[id].user); _transfer(address(this), msg.sender, id); _withdrawLeaf(id); snailActivities[id] = Activity({ state: ActivityState.UNSTAKED, since: uint48(block.timestamp), user: msg.sender, lastRoll: currentActivity.lastRoll }); } function withdrawLeaf(uint256[] calldata ids) public noCheaters { for (uint256 index = 0; index < ids.length; index++) { _withdrawLeaf(ids[index]); } } function _withdrawLeaf(uint256 id) private { Activity memory currentActivity = snailActivities[id]; if (currentActivity.state == ActivityState.UNSTAKED) { require(msg.sender == ownerOf(id)); } else if (currentActivity.state == ActivityState.GREENHOUSE) { require(msg.sender == currentActivity.user); } uint256 claimable = claimableLeaf(id); if (claimable == 0) return; leaf.mint(msg.sender, claimableLeaf(id)); snailActivities[id].since = uint48(block.timestamp); } function leafModifier(uint256 id) public view returns (uint256 mod) { Snail memory snail = snails[id]; // Check to see if this is a 1 of 1 if (_getTier(snail.body) >= 6) return 60; mod = 5; uint256 a_t = _getTier(snail.accessory); if (a_t == 7) mod += 25; else if (a_t >= 2) mod += a_t; mod += _getTier(snail.background); mod += _getTier(snail.body); mod += _getTier(snail.shell); mod += _getTier(snail.trail); return mod; } function stakedSnailsCount(address _owner) public view returns (uint256) { uint256 numIds = 0; Activity memory activity; for (uint256 i = 1; i <= _tokenIdCounter.current(); i++) { activity = snailActivities[i]; if (activity.user == _owner && activity.state == ActivityState.GREENHOUSE) numIds++; } return numIds; } function stakedSnailByIndex(address _owner, uint256 index) public view returns (uint256) { uint256 numIds = 0; Activity memory activity; for (uint256 i = 1; i <= _tokenIdCounter.current(); i++) { activity = snailActivities[i]; if (activity.user == _owner && activity.state == ActivityState.GREENHOUSE) { if (numIds == index) return i; numIds++; } } return 0; } ///////////////////////////////////////////////////////////// // LOOTING ///////////////////////////////////////////////////////////// function lootForSnail( uint256 id, uint8 rollTier, bool rollAccessory, bool rollBackground, bool rollBody, bool rollShell, bool rollTrail ) public noCheaters { Activity memory currentActivity = snailActivities[id]; if (currentActivity.state == ActivityState.UNSTAKED) { require(msg.sender == ownerOf(id)); } else if (currentActivity.state == ActivityState.GREENHOUSE) { require(msg.sender == currentActivity.user); } Snail memory snail = snails[id]; require(!gamePaused, "game paused"); require(rollAccessory || rollBackground || rollBody || rollShell || rollTrail, "roll >0 parts"); require(canLoot(id, rollTier), "cooldown"); require(rollTier > 0 && rollTier <= 6, "invalid tier"); require(tierUnlocked(rollTier), "tier locked"); require(_getTier(snail.body) < 6, "can't roll a unique"); snailActivities[id].lastRoll = uint40(block.timestamp); // Withdraw current rewards to avoid multiplying _withdrawLeaf(id); leaf.burnFrom(msg.sender, _costToRoll(rollTier, rollAccessory, rollBackground, rollBody, rollShell, rollTrail)); uint8 newItem; if (rollAccessory) { newItem = _rollPart(id, rollTier, Part.ACCESSORY); if (_getTier(newItem) == 6) { _setUnique(id); return; } } if (rollBackground) { newItem = _rollPart(id, rollTier, Part.BACKGROUND); if (_getTier(newItem) == 6) { _setUnique(id); return; } } if (rollBody) { newItem = _rollPart(id, rollTier, Part.BODY); if (_getTier(newItem) == 6) { _setUnique(id); return; } } if (rollShell) { newItem = _rollPart(id, rollTier, Part.SHELL); if (_getTier(newItem) == 6) { _setUnique(id); return; } } if (rollTrail) { newItem = _rollPart(id, rollTier, Part.TRAIL); if (_getTier(newItem) == 6) { _setUnique(id); return; } } _checkFullSet(id); } function canLoot(uint256 id, uint8 rollTier) public view returns (bool) { Activity memory currentActivity = snailActivities[id]; return block.timestamp - currentActivity.lastRoll > uint40(_cooldownForTier(rollTier)); } function _costToRoll( uint8 rollTier, bool rollAccessory, bool rollBackground, bool rollBody, bool rollShell, bool rollTrail ) internal view returns (uint256) { uint8 numberOfTraits = 0; if (rollAccessory) numberOfTraits++; if (rollBackground) numberOfTraits++; if (rollBody) numberOfTraits++; if (rollShell) numberOfTraits++; if (rollTrail) numberOfTraits++; return uint256(pools[rollTier].cost) * uint256(numberOfTraits) * 1 ether; } function _rollPart( uint256 id, uint8 rollTier, Part part ) internal returns (uint8) { uint256 seed = _rand(); uint256 rand = _randomiseFromSeed(seed, uint256(part), id); LootPool memory lootPool = pools[rollTier]; require(lootPool.total > 0, "pool empty"); (uint8 newItem, LootPool memory newLootPool) = _getItem(rand, lootPool); Snail memory snail = snails[id]; if (part == Part.ACCESSORY) snail.accessory = newItem; else if (part == Part.BACKGROUND) snail.background = newItem; else if (part == Part.BODY) { snail.body = newItem; if (newItem < 31) { uint8 eyeIdx = uint8(_randomiseFromSeed(seed, "eyes", 0) % 3); uint8 mouthIdx = uint8((_randomiseFromSeed(seed, "eyes", 0) % 3) + 3); snail.eyes = bodyToEyesMouth[newItem][eyeIdx]; snail.mouth = bodyToEyesMouth[newItem][mouthIdx]; } } else if (part == Part.SHELL) snail.shell = newItem; else if (part == Part.TRAIL) snail.trail = newItem; snails[id] = snail; if (rollTier >= 2) pools[rollTier] = newLootPool; return newItem; } function _getItem(uint256 rand, LootPool memory lootPool) internal pure returns (uint8, LootPool memory) { uint256 roll = rand % lootPool.total; lootPool.total--; uint8 item; if (roll >= lootPool.tier1 + lootPool.tier2 + lootPool.tier3 && lootPool.tier4 > 0) { item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier + 3) * partsPerTier); lootPool.tier4--; } else if (roll >= lootPool.tier1 + lootPool.tier2 && lootPool.tier3 > 0) { item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier + 2) * partsPerTier); lootPool.tier3--; } else if (roll >= lootPool.tier1 && lootPool.tier2 > 0) { item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier + 1) * partsPerTier); lootPool.tier2--; } else if (lootPool.tier1 >= 0) { item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier) * partsPerTier); lootPool.tier1--; } return (item, lootPool); } function _setUnique(uint256 id) internal { uint8 newItem = uint8(pools[6].tier2) + 1 + 30; Snail memory snail = snails[id]; snail.accessory = newItem; snail.background = newItem; snail.body = newItem; snail.shell = newItem; snail.trail = newItem; snails[id] = snail; } function _checkFullSet(uint256 id) internal { Looting.checkFullSet(snails[id], setClaimed); } function _getTier(uint256 partId) internal pure returns (uint8) { if (partId == 0) return 0; return uint8((partId - 1) / partsPerTier); } function _cooldownForTier(uint8 _tier) internal view returns (uint256) { if (!cooldownEnabled) return 0; return 8 hours; } function tierUnlocked(uint8 tier) public view returns (bool) { if (tier == 0) return true; return block.timestamp > (startTime + 1 * uint88(tier - 1) * 27 hours); } ///////////////////////////////////////////////////////////// // TOKEN FUNCTIONALITY ///////////////////////////////////////////////////////////// function tokenURI(uint256 id) public view override returns (string memory) { Snail memory snail = snails[id]; Activity memory activity = snailActivities[id]; uint8 modifier_ = uint8(leafModifier(id)); return inventoryManager.getTokenURI( uint16(id), snail.background, snail.trail, snail.body, snail.shell, snail.eyes, snail.mouth, snail.accessory, activity.state == ActivityState.GREENHOUSE, modifier_ ); } ///////////////////////////////////////////////////////////// // INTERNAL HELPERS ///////////////////////////////////////////////////////////// function withdraw() public payable onlyOwner { require(payable(msg.sender).send(address(this).balance), "could not withdraw"); } function mintLeaf(address _to, uint256 _amount) public onlyOwner { leaf.mint(_to, _amount); } function _mintSnail(address _to) internal { _tokenIdCounter.increment(); uint256 id = _tokenIdCounter.current(); (uint8 accessory, uint8 background, uint8 body, uint8 eyes, uint8 mouth, uint8 shell, uint8 trail) = (1, 1, 0, 0, 0, 0, 0); uint8 numOptions = 3; uint256 seed = _rand(); LootPool memory pool = pools[0]; (body, pool) = _getItem(_randomiseFromSeed(seed, "body", id), pool); (shell, pool) = _getItem(_randomiseFromSeed(seed, "shell", id), pool); (trail, pool) = _getItem(_randomiseFromSeed(seed, "trail", id), pool); eyes = bodyToEyesMouth[body][(_randomiseFromSeed(seed, "eyes", id) % numOptions)]; mouth = bodyToEyesMouth[body][(_randomiseFromSeed(seed, "mouth", id) % numOptions) + 3]; _mint(_to, id); snails[id] = Snail({ accessory: accessory, background: background, body: body, eyes: eyes, mouth: mouth, shell: shell, trail: trail }); snailActivities[id] = Activity({user: _to, since: uint48(block.timestamp), state: ActivityState.UNSTAKED, lastRoll: 0}); } function _randomiseFromSeed( uint256 _seed, uint256 part, uint256 _additional ) internal pure returns (uint256) { return uint256(keccak256(abi.encode(_seed, part, _additional))); } function _randomiseFromSeed( uint256 _seed, string memory part, uint256 _additional ) internal pure returns (uint256) { return uint256(keccak256(abi.encode(_seed, part, _additional))); } function _rand() internal view returns (uint256) { uint256 ret = uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, entropy))); return ret; } modifier noCheaters() { // We thank EtherOrcs for the idea of this function. uint256 size = 0; address acc = msg.sender; assembly { size := extcodesize(acc) } require(msg.sender == tx.origin, "cheater"); require(size == 0, "cheater"); _; entropy = uint256(keccak256(abi.encodePacked(acc, block.coinbase))); } ///////////////////////////////////////////////////////////// // ADMINISTRATIVE ///////////////////////////////////////////////////////////// function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function setWhitelistMintStartTime(uint88 _time) public onlyOwner { whitelistMintStartTime = _time; } function setPublicMintStartTime(uint88 _time) public onlyOwner { publicMintStartTime = _time; } function setStartTime(uint88 _time) public onlyOwner { startTime = _time; } function setCooldownEnabled(bool _enabled) public onlyOwner { cooldownEnabled = _enabled; } function setGamePaused(bool _paused) public onlyOwner { gamePaused = _paused; } function safeMint(address _to, uint256 _tokenId) public onlyOwner { _safeMint(_to, _tokenId); } function adminSetSnail( uint256 id, uint8 accessory, uint8 background, uint8 body, uint8 eyes, uint8 mouth, uint8 shell, uint8 trail ) public onlyOwner { Snail memory snail = snails[id]; snail.accessory = accessory; snail.background = background; snail.body = body; snail.eyes = eyes; snail.mouth = mouth; snail.shell = shell; snail.trail = trail; snails[id] = snail; _checkFullSet(id); } function _leaf(address account, uint256 tokenId) internal pure returns (bytes32) { return keccak256(abi.encodePacked(tokenId, account)); } function _verify(bytes32 _leafNode, bytes32[] memory proof) internal view returns (bool) { return MerkleProofUpgradeable.verify(proof, merkleRoot, _leafNode); } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721Upgradeable, ERC721EnumerableUpgradeable) whenNotPaused { super._beforeTokenTransfer(from, to, tokenId); } // The following functions are overrides required by Solidity. function supportsInterface(bytes4 interfaceId) public view override(ERC721Upgradeable, ERC721EnumerableUpgradeable) returns (bool) { return super.supportsInterface(interfaceId); } } // File contracts/NFTv2.sol pragma solidity ^0.8.2; contract EvoSnailsV2 is ERC721Upgradeable, ERC721EnumerableUpgradeable, PausableUpgradeable, OwnableUpgradeable { using CountersUpgradeable for CountersUpgradeable.Counter; CountersUpgradeable.Counter private _tokenIdCounter; ///////////////////////////////////////////////////////////// // CONFIGURATION ///////////////////////////////////////////////////////////// uint256 public constant cost = 0.00 ether; uint256 public constant maxSupply = 5555; uint256 public constant maxMintAmount = 1; uint256 internal constant partsPerTier = 5; bool internal cooldownEnabled; bool internal gamePaused; uint88 public whitelistMintStartTime; uint88 public publicMintStartTime; uint88 public startTime; bytes32 public merkleRoot; mapping(address => uint256) snailsMinted; ERC20PresetMinterPauserUpgradeable public leaf; InventoryManager inventoryManager; ///////////////////////////////////////////////////////////// // UTILS ///////////////////////////////////////////////////////////// uint256 entropy; ///////////////////////////////////////////////////////////// // STRUCTURES ///////////////////////////////////////////////////////////// mapping(uint256 => Snail) public snails; enum ActivityState { UNSTAKED, GREENHOUSE } struct Activity { ActivityState state; address user; uint48 since; uint40 lastRoll; } mapping(uint256 => Activity) public snailActivities; enum Part { ACCESSORY, BACKGROUND, BODY, EYES, MOUTH, SHELL, TRAIL } mapping(uint8 => LootPool) public pools; mapping(uint8 => bool) public setClaimed; mapping(uint8 => uint8[]) internal bodyToEyesMouth; bool internal rollingPaused; ///////////////////////////////////////////////////////////// // SET UP ///////////////////////////////////////////////////////////// function initialize() public initializer { __ERC721_init("EvoSnails", "EVOSNAIL"); __ERC721Enumerable_init(); __Pausable_init(); __Ownable_init(); cooldownEnabled = true; gamePaused = false; whitelistMintStartTime = 1635753600; publicMintStartTime = 1635796800; startTime = 1635800400; Looting.init(pools, bodyToEyesMouth); } function setInventoryManager(address manager) public onlyOwner { inventoryManager = InventoryManager(manager); } function setLeaf(address leaf_) public onlyOwner { leaf = Leaf(leaf_); } ///////////////////////////////////////////////////////////// // MINTING ///////////////////////////////////////////////////////////// function mint(uint256 _mintAmount) public payable noCheaters { uint256 supply = totalSupply(); require(block.timestamp > publicMintStartTime, "mint locked"); require(_mintAmount > 0, "amount must be >0"); require(_mintAmount <= maxMintAmount, "amount must < max"); require(supply + _mintAmount <= maxSupply, "sold out!"); if (msg.sender != owner()) { require(msg.value >= cost * _mintAmount, "no funds"); } for (uint256 i = 1; i <= _mintAmount; i++) { _mintSnail(msg.sender); } } function mintWhitelist( address account, uint256 tokenId, bytes32[] calldata proof ) public payable noCheaters { require(block.timestamp > whitelistMintStartTime, "mint locked"); if (msg.sender != owner() && tokenId > 113) { require(msg.value >= cost, "no funds"); } require(_verify(_leaf(account, tokenId), proof), "Invalid proof"); require(snailsMinted[account] == 0, "already minted"); snailsMinted[account]++; _mintSnail(account); } ///////////////////////////////////////////////////////////// // STAKING ///////////////////////////////////////////////////////////// function claimableLeaf(uint256 id) public view returns (uint256 _claimable) { Activity memory currentActivity = snailActivities[id]; uint256 diff = uint48(block.timestamp) - snailActivities[id].since; if (currentActivity.state == ActivityState.UNSTAKED) { _claimable = 0; return _claimable; } _claimable = ((diff * (leafModifier(id)) * 1 ether)) / 1 days; return _claimable; } function greenhouseSnails(uint256[] calldata ids) public noCheaters { require(block.timestamp > startTime, "not started"); require(!gamePaused, "game paused"); for (uint256 index = 0; index < ids.length; index++) { _greenhouse(ids[index]); } } function _greenhouse(uint256 id) private { Activity memory currentActivity = snailActivities[id]; require(currentActivity.state != ActivityState.GREENHOUSE, "already staked"); require(msg.sender == ownerOf(id), "not yours"); _transfer(msg.sender, address(this), id); snailActivities[id] = Activity({ state: ActivityState.GREENHOUSE, since: uint48(block.timestamp), user: msg.sender, lastRoll: currentActivity.lastRoll }); } function returnSnails(uint256[] calldata ids) public noCheaters { for (uint256 index = 0; index < ids.length; index++) { _returnSnail(ids[index]); } } function _returnSnail(uint256 id) private { Activity memory currentActivity = snailActivities[id]; require(currentActivity.state != ActivityState.UNSTAKED, "already unstaked"); require(msg.sender == snailActivities[id].user); _transfer(address(this), msg.sender, id); _withdrawLeaf(id); snailActivities[id] = Activity({ state: ActivityState.UNSTAKED, since: uint48(block.timestamp), user: msg.sender, lastRoll: currentActivity.lastRoll }); } function withdrawLeaf(uint256[] calldata ids) public noCheaters { for (uint256 index = 0; index < ids.length; index++) { _withdrawLeaf(ids[index]); } } function _withdrawLeaf(uint256 id) private { Activity memory currentActivity = snailActivities[id]; if (currentActivity.state == ActivityState.UNSTAKED) { require(msg.sender == ownerOf(id)); } else if (currentActivity.state == ActivityState.GREENHOUSE) { require(msg.sender == currentActivity.user); } uint256 claimable = claimableLeaf(id); if (claimable == 0) return; leaf.mint(msg.sender, claimableLeaf(id)); snailActivities[id].since = uint48(block.timestamp); } function leafModifier(uint256 id) public view returns (uint256 mod) { Snail memory snail = snails[id]; // Check to see if this is a 1 of 1 if (_getTier(snail.body) >= 6) return 60; mod = 5; uint256 a_t = _getTier(snail.accessory); if (a_t == 7) mod += 25; else if (a_t >= 2) mod += a_t; mod += _getTier(snail.background); mod += _getTier(snail.body); mod += _getTier(snail.shell); mod += _getTier(snail.trail); return mod; } function stakedSnailsCount(address _owner) public view returns (uint256) { uint256 numIds = 0; Activity memory activity; for (uint256 i = 1; i <= _tokenIdCounter.current(); i++) { activity = snailActivities[i]; if (activity.user == _owner && activity.state == ActivityState.GREENHOUSE) numIds++; } return numIds; } function stakedSnailByIndex(address _owner, uint256 index) public view returns (uint256) { uint256 numIds = 0; Activity memory activity; for (uint256 i = 1; i <= _tokenIdCounter.current(); i++) { activity = snailActivities[i]; if (activity.user == _owner && activity.state == ActivityState.GREENHOUSE) { if (numIds == index) return i; numIds++; } } return 0; } ///////////////////////////////////////////////////////////// // LOOTING ///////////////////////////////////////////////////////////// function lootForSnail( uint256 id, uint8 rollTier, bool rollAccessory, bool rollBackground, bool rollBody, bool rollShell, bool rollTrail ) public noCheaters { Activity memory currentActivity = snailActivities[id]; if (currentActivity.state == ActivityState.UNSTAKED) { require(msg.sender == ownerOf(id)); } else if (currentActivity.state == ActivityState.GREENHOUSE) { require(msg.sender == currentActivity.user); } Snail memory snail = snails[id]; require(!rollingPaused, "looting paused"); require(!gamePaused, "game paused"); require(rollAccessory || rollBackground || rollBody || rollShell || rollTrail, "roll >0 parts"); require(canLoot(id, rollTier), "cooldown"); require(rollTier > 0 && rollTier <= 6, "invalid tier"); require(tierUnlocked(rollTier), "tier locked"); require(_getTier(snail.body) < 6, "can't roll a unique"); snailActivities[id].lastRoll = uint40(block.timestamp); // Withdraw current rewards to avoid multiplying _withdrawLeaf(id); leaf.burnFrom(msg.sender, _costToRoll(rollTier, rollAccessory, rollBackground, rollBody, rollShell, rollTrail)); uint8 newItem; if (rollAccessory) { newItem = _rollPart(id, rollTier, Part.ACCESSORY); if (_getTier(newItem) == 6) { _setUnique(id); return; } } if (rollBackground) { newItem = _rollPart(id, rollTier, Part.BACKGROUND); if (_getTier(newItem) == 6) { _setUnique(id); return; } } if (rollBody) { newItem = _rollPart(id, rollTier, Part.BODY); if (_getTier(newItem) == 6) { _setUnique(id); return; } } if (rollShell) { newItem = _rollPart(id, rollTier, Part.SHELL); if (_getTier(newItem) == 6) { _setUnique(id); return; } } if (rollTrail) { newItem = _rollPart(id, rollTier, Part.TRAIL); if (_getTier(newItem) == 6) { _setUnique(id); return; } } _checkFullSet(id); } function canLoot(uint256 id, uint8 rollTier) public view returns (bool) { Activity memory currentActivity = snailActivities[id]; return block.timestamp - currentActivity.lastRoll > uint40(_cooldownForTier(rollTier)); } function _costToRoll( uint8 rollTier, bool rollAccessory, bool rollBackground, bool rollBody, bool rollShell, bool rollTrail ) internal view returns (uint256) { uint8 numberOfTraits = 0; if (rollAccessory) numberOfTraits++; if (rollBackground) numberOfTraits++; if (rollBody) numberOfTraits++; if (rollShell) numberOfTraits++; if (rollTrail) numberOfTraits++; return uint256(pools[rollTier].cost) * uint256(numberOfTraits) * 1 ether; } function _rollPart( uint256 id, uint8 rollTier, Part part ) internal returns (uint8) { uint256 seed = _rand(); uint256 rand = _randomiseFromSeed(seed, uint256(part), id); LootPool memory lootPool = pools[rollTier]; require(lootPool.total > 0, "pool empty"); (uint8 newItem, LootPool memory newLootPool) = _getItem(rand, lootPool); Snail memory snail = snails[id]; if (part == Part.ACCESSORY) snail.accessory = newItem; else if (part == Part.BACKGROUND) snail.background = newItem; else if (part == Part.BODY) { snail.body = newItem; if (newItem < 31) { uint8 eyeIdx = uint8(_randomiseFromSeed(seed, "eyes", 0) % 3); uint8 mouthIdx = uint8((_randomiseFromSeed(seed, "eyes", 0) % 3) + 3); snail.eyes = bodyToEyesMouth[newItem][eyeIdx]; snail.mouth = bodyToEyesMouth[newItem][mouthIdx]; } } else if (part == Part.SHELL) snail.shell = newItem; else if (part == Part.TRAIL) snail.trail = newItem; snails[id] = snail; if (rollTier >= 2) pools[rollTier] = newLootPool; return newItem; } function _getItem(uint256 rand, LootPool memory lootPool) internal pure returns (uint8, LootPool memory) { uint256 roll = rand % lootPool.total; lootPool.total--; uint8 item; if (roll >= lootPool.tier1 + lootPool.tier2 + lootPool.tier3 && lootPool.tier4 > 0) { item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier + 3) * partsPerTier); lootPool.tier4--; } else if (roll >= lootPool.tier1 + lootPool.tier2 && lootPool.tier3 > 0) { item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier + 2) * partsPerTier); lootPool.tier3--; } else if (roll >= lootPool.tier1 && lootPool.tier2 > 0) { item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier + 1) * partsPerTier); lootPool.tier2--; } else if (lootPool.tier1 >= 0) { item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier) * partsPerTier); lootPool.tier1--; } return (item, lootPool); } function _setUnique(uint256 id) internal { uint8 newItem = uint8(pools[6].tier2) + 1 + 30; Snail memory snail = snails[id]; snail.accessory = newItem; snail.background = newItem; snail.body = newItem; snail.shell = newItem; snail.trail = newItem; snails[id] = snail; } function _checkFullSet(uint256 id) internal { Looting.checkFullSet(snails[id], setClaimed); } function _getTier(uint256 partId) internal pure returns (uint8) { if (partId == 0) return 0; return uint8((partId - 1) / partsPerTier); } function _cooldownForTier(uint8 _tier) internal view returns (uint256) { if (!cooldownEnabled) return 0; return 8 hours; } function tierUnlocked(uint8 tier) public view returns (bool) { if (tier == 0) return true; return block.timestamp > (startTime + 1 * uint88(tier - 1) * 27 hours); } ///////////////////////////////////////////////////////////// // TOKEN FUNCTIONALITY ///////////////////////////////////////////////////////////// function tokenURI(uint256 id) public view override returns (string memory) { Snail memory snail = snails[id]; Activity memory activity = snailActivities[id]; uint8 modifier_ = uint8(leafModifier(id)); return inventoryManager.getTokenURI( uint16(id), snail.background, snail.trail, snail.body, snail.shell, snail.eyes, snail.mouth, snail.accessory, activity.state == ActivityState.GREENHOUSE, modifier_ ); } ///////////////////////////////////////////////////////////// // INTERNAL HELPERS ///////////////////////////////////////////////////////////// function withdraw() public payable onlyOwner { require(payable(msg.sender).send(address(this).balance), "could not withdraw"); } function mintLeaf(address _to, uint256 _amount) public onlyOwner { leaf.mint(_to, _amount); } function _mintSnail(address _to) internal { _tokenIdCounter.increment(); uint256 id = _tokenIdCounter.current(); (uint8 accessory, uint8 background, uint8 body, uint8 eyes, uint8 mouth, uint8 shell, uint8 trail) = (1, 1, 0, 0, 0, 0, 0); uint8 numOptions = 3; uint256 seed = _rand(); LootPool memory pool = pools[0]; (body, pool) = _getItem(_randomiseFromSeed(seed, "body", id), pool); (shell, pool) = _getItem(_randomiseFromSeed(seed, "shell", id), pool); (trail, pool) = _getItem(_randomiseFromSeed(seed, "trail", id), pool); eyes = bodyToEyesMouth[body][(_randomiseFromSeed(seed, "eyes", id) % numOptions)]; mouth = bodyToEyesMouth[body][(_randomiseFromSeed(seed, "mouth", id) % numOptions) + 3]; _mint(_to, id); snails[id] = Snail({ accessory: accessory, background: background, body: body, eyes: eyes, mouth: mouth, shell: shell, trail: trail }); snailActivities[id] = Activity({user: _to, since: uint48(block.timestamp), state: ActivityState.UNSTAKED, lastRoll: 0}); } function _randomiseFromSeed( uint256 _seed, uint256 part, uint256 _additional ) internal pure returns (uint256) { return uint256(keccak256(abi.encode(_seed, part, _additional))); } function _randomiseFromSeed( uint256 _seed, string memory part, uint256 _additional ) internal pure returns (uint256) { return uint256(keccak256(abi.encode(_seed, part, _additional))); } function _rand() internal view returns (uint256) { uint256 ret = uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, entropy))); return ret; } modifier noCheaters() { // We thank EtherOrcs for the idea of this function. uint256 size = 0; address acc = msg.sender; assembly { size := extcodesize(acc) } require(msg.sender == tx.origin, "cheater"); require(size == 0, "cheater"); _; entropy = uint256(keccak256(abi.encodePacked(acc, block.coinbase))); } ///////////////////////////////////////////////////////////// // ADMINISTRATIVE ///////////////////////////////////////////////////////////// function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function setWhitelistMintStartTime(uint88 _time) public onlyOwner { whitelistMintStartTime = _time; } function setPublicMintStartTime(uint88 _time) public onlyOwner { publicMintStartTime = _time; } function setStartTime(uint88 _time) public onlyOwner { startTime = _time; } function setCooldownEnabled(bool _enabled) public onlyOwner { cooldownEnabled = _enabled; } function setGamePaused(bool _paused) public onlyOwner { gamePaused = _paused; } function safeMint(address _to, uint256 _tokenId) public onlyOwner { _safeMint(_to, _tokenId); } function adminSetSnail( uint256 id, uint8 accessory, uint8 background, uint8 body, uint8 eyes, uint8 mouth, uint8 shell, uint8 trail ) public onlyOwner { Snail memory snail = snails[id]; snail.accessory = accessory; snail.background = background; snail.body = body; snail.eyes = eyes; snail.mouth = mouth; snail.shell = shell; snail.trail = trail; snails[id] = snail; _checkFullSet(id); } function _leaf(address account, uint256 tokenId) internal pure returns (bytes32) { return keccak256(abi.encodePacked(tokenId, account)); } function _verify(bytes32 _leafNode, bytes32[] memory proof) internal view returns (bool) { return MerkleProofUpgradeable.verify(proof, merkleRoot, _leafNode); } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721Upgradeable, ERC721EnumerableUpgradeable) whenNotPaused { super._beforeTokenTransfer(from, to, tokenId); } // The following functions are overrides required by Solidity. function supportsInterface(bytes4 interfaceId) public view override(ERC721Upgradeable, ERC721EnumerableUpgradeable) returns (bool) { return super.supportsInterface(interfaceId); } function setRollingPaused(bool _paused) public onlyOwner { rollingPaused = _paused; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"accessory","type":"uint8"},{"internalType":"uint8","name":"background","type":"uint8"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"mouth","type":"uint8"},{"internalType":"uint8","name":"shell","type":"uint8"},{"internalType":"uint8","name":"trail","type":"uint8"}],"name":"adminSetSnail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"rollTier","type":"uint8"}],"name":"canLoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claimableLeaf","outputs":[{"internalType":"uint256","name":"_claimable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"greenhouseSnails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leaf","outputs":[{"internalType":"contract ERC20PresetMinterPauserUpgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"leafModifier","outputs":[{"internalType":"uint256","name":"mod","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"rollTier","type":"uint8"},{"internalType":"bool","name":"rollAccessory","type":"bool"},{"internalType":"bool","name":"rollBackground","type":"bool"},{"internalType":"bool","name":"rollBody","type":"bool"},{"internalType":"bool","name":"rollShell","type":"bool"},{"internalType":"bool","name":"rollTrail","type":"bool"}],"name":"lootForSnail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintLeaf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"pools","outputs":[{"internalType":"uint16","name":"cost","type":"uint16"},{"internalType":"uint16","name":"total","type":"uint16"},{"internalType":"uint8","name":"minTier","type":"uint8"},{"internalType":"uint16","name":"tier1","type":"uint16"},{"internalType":"uint16","name":"tier2","type":"uint16"},{"internalType":"uint16","name":"tier3","type":"uint16"},{"internalType":"uint16","name":"tier4","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintStartTime","outputs":[{"internalType":"uint88","name":"","type":"uint88"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"returnSnails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"setClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setGamePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setInventoryManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"leaf_","type":"address"}],"name":"setLeaf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint88","name":"_time","type":"uint88"}],"name":"setPublicMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setRollingPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint88","name":"_time","type":"uint88"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint88","name":"_time","type":"uint88"}],"name":"setWhitelistMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"snailActivities","outputs":[{"internalType":"enum EvoSnailsV2.ActivityState","name":"state","type":"uint8"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint48","name":"since","type":"uint48"},{"internalType":"uint40","name":"lastRoll","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"snails","outputs":[{"internalType":"uint8","name":"background","type":"uint8"},{"internalType":"uint8","name":"trail","type":"uint8"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"shell","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"mouth","type":"uint8"},{"internalType":"uint8","name":"accessory","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"stakedSnailByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"stakedSnailsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint88","name":"","type":"uint88"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"tier","type":"uint8"}],"name":"tierUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMintStartTime","outputs":[{"internalType":"uint88","name":"","type":"uint88"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"withdrawLeaf","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50615fbf80620000216000396000f3fe6080604052600436106102a75760003560e01c806301ffc9a7146102ac57806306fdde03146102e1578063081812fc14610303578063095ea7b31461033057806309647dfe146103525780630d0cdee01461037257806313faede61461039257806318160ddd146103b5578063239c70ae146103ca57806323b872dd146103df5780632551cd34146103ff5780632bb1a91a1461041f5780632cc76cec1461045e5780632eb4a7ab1461047e5780632f745c59146104955780633a577ec9146104b55780633ccfd60b146104d55780633f4ba83a146104dd578063421f3d2d146104f257806342842e0e146105125780634c8c3246146105325780634f6ccce7146105525780635932ead1146105725780635bca47d5146105925780635c975abb146105b257806360ef50b9146105ca5780636352211e146105dd578063668e780f146105fd5780636cad4e5a1461062e57806370a082311461064e578063715018a61461066e578063719eb7c71461068357806378e97925146106a35780637cb64759146106c45780638129fc1c146106e45780638456cb59146106f957806386b75b441461070e5780638da5cb5b1461072e57806390494fb71461074357806391d1ea4d1461076357806395d89b4114610784578063972a4b4814610799578063a0712d68146107b9578063a1448194146107cc578063a22cb465146107ec578063ae4046811461080c578063b02e893f1461087c578063b54710c21461089c578063b5c14adb1461094b578063b7911ae61461096b578063b88d4fde1461098b578063c87b56dd146109ab578063d3cf00a3146109cb578063d5abeb01146109f3578063db04c9c514610a09578063de230b9c14610a29578063e985e9c514610a49578063f158783a14610a69578063f2fde38b14610a89578063fb87a63514610aa9575b600080fd5b3480156102b857600080fd5b506102cc6102c7366004615788565b610b60565b60405190151581526020015b60405180910390f35b3480156102ed57600080fd5b506102f6610b71565b6040516102d89190615aa7565b34801561030f57600080fd5b5061032361031e366004615770565b610c03565b6040516102d891906159e7565b34801561033c57600080fd5b5061035061034b366004615697565b610c90565b005b34801561035e57600080fd5b5061035061036d366004615545565b610da1565b34801561037e57600080fd5b5061035061038d36600461584b565b610df3565b34801561039e57600080fd5b506103a7600081565b6040519081526020016102d8565b3480156103c157600080fd5b506099546103a7565b3480156103d657600080fd5b506103a7600181565b3480156103eb57600080fd5b506103506103fa366004615591565b6113dc565b34801561040b57600080fd5b506103a761041a366004615545565b61140d565b34801561042b57600080fd5b5061012e54610446906201000090046001600160581b031681565b6040516001600160581b0390911681526020016102d8565b34801561046a57600080fd5b506103a7610479366004615697565b611533565b34801561048a57600080fd5b506103a76101305481565b3480156104a157600080fd5b506103a76104b0366004615697565b61166e565b3480156104c157600080fd5b506102cc6104d0366004615958565b611704565b610350611764565b3480156104e957600080fd5b506103506117f1565b3480156104fe57600080fd5b5061035061050d366004615717565b611828565b34801561051e57600080fd5b5061035061052d366004615591565b61195d565b34801561053e57600080fd5b5061035061054d366004615717565b611978565b34801561055e57600080fd5b506103a761056d366004615770565b611a05565b34801561057e57600080fd5b5061035061058d366004615756565b611aa6565b34801561059e57600080fd5b506103506105ad366004615697565b611ae9565b3480156105be57600080fd5b5060c95460ff166102cc565b6103506105d83660046156c0565b611b81565b3480156105e957600080fd5b506103236105f8366004615770565b611d61565b34801561060957600080fd5b506102cc610618366004615958565b6101386020526000908152604090205460ff1681565b34801561063a57600080fd5b50610350610649366004615545565b611dd8565b34801561065a57600080fd5b506103a7610669366004615545565b611e2a565b34801561067a57600080fd5b50610350611eb1565b34801561068f57600080fd5b5061035061069e366004615972565b611eea565b3480156106af57600080fd5b5061012f54610446906001600160581b031681565b3480156106d057600080fd5b506103506106df366004615770565b611f44565b3480156106f057600080fd5b50610350611f79565b34801561070557600080fd5b506103506120ef565b34801561071a57600080fd5b50610350610729366004615972565b612126565b34801561073a57600080fd5b50610323612182565b34801561074f57600080fd5b506103a761075e366004615770565b612191565b34801561076f57600080fd5b5061013254610323906001600160a01b031681565b34801561079057600080fd5b506102f66122da565b3480156107a557600080fd5b506103a76107b4366004615770565b6122e9565b6103506107c7366004615770565b612441565b3480156107d857600080fd5b506103506107e7366004615697565b612652565b3480156107f857600080fd5b5061035061080736600461566e565b61268f565b34801561081857600080fd5b5061086c610827366004615770565b6101366020526000908152604090205460ff81169061010081046001600160a01b031690600160a81b810465ffffffffffff1690600160d81b900464ffffffffff1684565b6040516102d89493929190615a51565b34801561088857600080fd5b506102cc610897366004615829565b612750565b3480156108a857600080fd5b506109086108b7366004615770565b6101356020526000908152604090205460ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b8104821691600160301b9091041687565b6040805160ff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e0016102d8565b34801561095757600080fd5b50610350610966366004615756565b612823565b34801561097757600080fd5b50610350610986366004615717565b61286d565b34801561099757600080fd5b506103506109a63660046155cc565b6128fa565b3480156109b757600080fd5b506102f66109c6366004615770565b612932565b3480156109d757600080fd5b5061012e5461044690600160681b90046001600160581b031681565b3480156109ff57600080fd5b506103a76115b381565b348015610a1557600080fd5b50610350610a24366004615756565b612b82565b348015610a3557600080fd5b50610350610a44366004615972565b612bc5565b348015610a5557600080fd5b506102cc610a6436600461555f565b612c17565b348015610a7557600080fd5b50610350610a843660046158c9565b612c45565b348015610a9557600080fd5b50610350610aa4366004615545565b612ef3565b348015610ab557600080fd5b50610b19610ac4366004615958565b6101376020526000908152604090205461ffff8082169162010000810482169160ff600160201b83041691600160281b8104821691600160381b8204811691600160481b8104821691600160581b9091041687565b6040805161ffff9889168152968816602088015260ff90951694860194909452918516606085015284166080840152831660a08301529190911660c082015260e0016102d8565b6000610b6b82612f90565b92915050565b606060658054610b8090615e87565b80601f0160208091040260200160405190810160405280929190818152602001828054610bac90615e87565b8015610bf95780601f10610bce57610100808354040283529160200191610bf9565b820191906000526020600020905b815481529060010190602001808311610bdc57829003601f168201915b5050505050905090565b6000610c0e82612fb5565b610c745760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b6000610c9b82611d61565b9050806001600160a01b0316836001600160a01b03161415610d095760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c6b565b336001600160a01b0382161480610d255750610d258133612c17565b610d925760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610c6b565b610d9c8383612fd2565b505050565b33610daa612182565b6001600160a01b031614610dd05760405162461bcd60e51b8152600401610c6b90615bca565b61013380546001600160a01b0319166001600160a01b0392909216919091179055565b33803b90328114610e165760405162461bcd60e51b8152600401610c6b90615ba9565b8115610e345760405162461bcd60e51b8152600401610c6b90615ba9565b600089815261013660205260408082208151608081019092528054829060ff166001811115610e7357634e487b7160e01b600052602160045260246000fd5b6001811115610e9257634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600081516001811115610ef657634e487b7160e01b600052602160045260246000fd5b1415610f2757610f058a611d61565b6001600160a01b0316336001600160a01b031614610f2257600080fd5b610f72565b600181516001811115610f4a57634e487b7160e01b600052602160045260246000fd5b1415610f725780602001516001600160a01b0316336001600160a01b031614610f7257600080fd5b60008a81526101356020908152604091829020825160e081018452905460ff808216835261010082048116938301939093526201000081048316938201939093526301000000830482166060820152600160201b830482166080820152600160281b8304821660a0820152600160301b909204811660c083015261013a54161561102f5760405162461bcd60e51b815260206004820152600e60248201526d1b1bdbdd1a5b99c81c185d5cd95960921b6044820152606401610c6b565b61012e54610100900460ff16156110585760405162461bcd60e51b8152600401610c6b90615c50565b88806110615750875b806110695750865b806110715750855b806110795750845b6110b55760405162461bcd60e51b815260206004820152600d60248201526c726f6c6c203e3020706172747360981b6044820152606401610c6b565b6110bf8b8b612750565b6110f65760405162461bcd60e51b815260206004820152600860248201526731b7b7b63237bbb760c11b6044820152606401610c6b565b60008a60ff1611801561110d575060068a60ff1611155b6111485760405162461bcd60e51b815260206004820152600c60248201526b34b73b30b634b2103a34b2b960a11b6044820152606401610c6b565b6111518a611704565b61118b5760405162461bcd60e51b815260206004820152600b60248201526a1d1a595c881b1bd8dad95960aa1b6044820152606401610c6b565b600661119d826040015160ff16613040565b60ff16106111e35760405162461bcd60e51b815260206004820152601360248201527263616e277420726f6c6c206120756e6971756560681b6044820152606401610c6b565b60008b81526101366020526040902080546001600160d81b0316600160d81b4264ffffffffff16021790556112178b613066565b610132546001600160a01b03166379cc6790336112388d8d8d8d8d8d613259565b6040518363ffffffff1660e01b8152600401611255929190615a38565b600060405180830381600087803b15801561126f57600080fd5b505af1158015611283573d6000803e3d6000fd5b50505050600089156112c55761129b8c8c6000613303565b90506112a98160ff16613040565b60ff16600614156112c5576112bd8c613873565b5050506113a2565b88156112f9576112d78c8c6001613303565b90506112e58160ff16613040565b60ff16600614156112f9576112bd8c613873565b871561132d5761130b8c8c6002613303565b90506113198160ff16613040565b60ff166006141561132d576112bd8c613873565b86156113615761133f8c8c6005613303565b905061134d8160ff16613040565b60ff1660061415611361576112bd8c613873565b8515611395576113738c8c6006613303565b90506113818160ff16613040565b60ff1660061415611395576112bd8c613873565b61139e8c6139bb565b5050505b80416040516020016113b59291906159c5565b60408051601f19818403018152919052805160209091012061013455505050505050505050565b6113e63382613a3d565b6114025760405162461bcd60e51b8152600401610c6b90615bff565b610d9c838383613aff565b600080611418615404565b60015b61012d54811161152a5760008181526101366020526040908190208151608081019092528054829060ff16600181111561146557634e487b7160e01b600052602160045260246000fd5b600181111561148457634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03908116602080850191909152600160a81b830465ffffffffffff166040850152600160d81b90920464ffffffffff166060909301929092528201519193508681169116148015611505575060018251600181111561150357634e487b7160e01b600052602160045260246000fd5b145b15611518578261151481615ec2565b9350505b8061152281615ec2565b91505061141b565b50909392505050565b60008061153e615404565b60015b61012d5481116116625760008181526101366020526040908190208151608081019092528054829060ff16600181111561158b57634e487b7160e01b600052602160045260246000fd5b60018111156115aa57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03908116602080850191909152600160a81b830465ffffffffffff166040850152600160d81b90920464ffffffffff16606090930192909252820151919350878116911614801561162b575060018251600181111561162957634e487b7160e01b600052602160045260246000fd5b145b156116505784831415611642579250610b6b915050565b8261164c81615ec2565b9350505b8061165a81615ec2565b915050611541565b50600095945050505050565b600061167983611e2a565b82106116db5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c6b565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b600060ff821661171657506001919050565b611721600183615e1a565b61172f9060ff166001615dad565b61173c9062017bb0615dad565b61012f5461175391906001600160581b0316615d58565b6001600160581b0316421192915050565b3361176d612182565b6001600160a01b0316146117935760405162461bcd60e51b8152600401610c6b90615bca565b60405133904780156108fc02916000818181858888f193505050506117ef5760405162461bcd60e51b8152602060048201526012602482015271636f756c64206e6f7420776974686472617760701b6044820152606401610c6b565b565b336117fa612182565b6001600160a01b0316146118205760405162461bcd60e51b8152600401610c6b90615bca565b6117ef613c98565b33803b9032811461184b5760405162461bcd60e51b8152600401610c6b90615ba9565b81156118695760405162461bcd60e51b8152600401610c6b90615ba9565b61012f546001600160581b031642116118b25760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b6044820152606401610c6b565b61012e54610100900460ff16156118db5760405162461bcd60e51b8152600401610c6b90615c50565b60005b838110156119275761191585858381811061190957634e487b7160e01b600052603260045260246000fd5b90506020020135613d25565b8061191f81615ec2565b9150506118de565b50804160405160200161193b9291906159c5565b60408051601f1981840301815291905280516020909101206101345550505050565b610d9c838383604051806020016040528060008152506128fa565b33803b9032811461199b5760405162461bcd60e51b8152600401610c6b90615ba9565b81156119b95760405162461bcd60e51b8152600401610c6b90615ba9565b60005b83811015611927576119f38585838181106119e757634e487b7160e01b600052603260045260246000fd5b90506020020135613f7a565b806119fd81615ec2565b9150506119bc565b6000611a1060995490565b8210611a735760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c6b565b60998281548110611a9457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b33611aaf612182565b6001600160a01b031614611ad55760405162461bcd60e51b8152600401610c6b90615bca565b61012e805460ff1916911515919091179055565b33611af2612182565b6001600160a01b031614611b185760405162461bcd60e51b8152600401610c6b90615bca565b610132546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990611b4b9085908590600401615a38565b600060405180830381600087803b158015611b6557600080fd5b505af1158015611b79573d6000803e3d6000fd5b505050505050565b33803b90328114611ba45760405162461bcd60e51b8152600401610c6b90615ba9565b8115611bc25760405162461bcd60e51b8152600401610c6b90615ba9565b61012e546201000090046001600160581b03164211611bf35760405162461bcd60e51b8152600401610c6b90615aba565b611bfb612182565b6001600160a01b0316336001600160a01b031614158015611c1c5750607185115b50611c63611c2a87876140cd565b85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061411692505050565b611c9f5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610c6b565b6001600160a01b0386166000908152610131602052604090205415611cf75760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481b5a5b9d195960921b6044820152606401610c6b565b6001600160a01b038616600090815261013160205260408120805491611d1c83615ec2565b9190505550611d2a8661412d565b8041604051602001611d3d9291906159c5565b60408051601f19818403018152919052805160209091012061013455505050505050565b6000818152606760205260408120546001600160a01b031680610b6b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c6b565b33611de1612182565b6001600160a01b031614611e075760405162461bcd60e51b8152600401610c6b90615bca565b61013280546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216611e955760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c6b565b506001600160a01b031660009081526068602052604090205490565b33611eba612182565b6001600160a01b031614611ee05760405162461bcd60e51b8152600401610c6b90615bca565b6117ef6000614627565b33611ef3612182565b6001600160a01b031614611f195760405162461bcd60e51b8152600401610c6b90615bca565b61012e80546001600160581b03909216620100000262010000600160681b0319909216919091179055565b33611f4d612182565b6001600160a01b031614611f735760405162461bcd60e51b8152600401610c6b90615bca565b61013055565b600054610100900460ff1680611f92575060005460ff16155b611fae5760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff16158015611fd0576000805461ffff19166101011790555b61201b6040518060400160405280600981526020016845766f536e61696c7360b81b81525060405180604001604052806008815260200167115593d4d390525360c21b815250614679565b612023614700565b61202b614783565b6120336147ea565b61012e80546001600160c01b03191665617f9e800001630186011d606e1b0117905561012f805463618055506001600160581b031990911617905560405163091ce90360e21b81526101376004820152610139602482015273cbab1c973500112c389790a9f0c4c42071ffb4bb90632473a40c9060440160006040518083038186803b1580156120c257600080fd5b505af41580156120d6573d6000803e3d6000fd5b5050505080156120ec576000805461ff00191690555b50565b336120f8612182565b6001600160a01b03161461211e5760405162461bcd60e51b8152600401610c6b90615bca565b6117ef614851565b3361212f612182565b6001600160a01b0316146121555760405162461bcd60e51b8152600401610c6b90615bca565b61012e80546001600160581b03909216600160681b02600160681b600160c01b0319909216919091179055565b60fb546001600160a01b031690565b60008181526101366020526040808220815160808101909252805483929190829060ff1660018111156121d457634e487b7160e01b600052602160045260246000fd5b60018111156121f357634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b0316602080840191909152600160a81b80830465ffffffffffff908116604080870191909152600160d81b90940464ffffffffff1660609095019490945260008881526101369092529181205493945092612262929190041642615df3565b65ffffffffffff16905060008251600181111561228f57634e487b7160e01b600052602160045260246000fd5b141561229f575060009392505050565b620151806122ac856122e9565b6122b69083615d8e565b6122c890670de0b6b3a7640000615d8e565b6122d29190615d7a565b949350505050565b606060668054610b8090615e87565b600081815261013560209081526040808320815160e081018352905460ff8082168352610100820481169483019490945262010000810484169282018390526301000000810484166060830152600160201b810484166080830152600160281b8104841660a0830152600160301b900490921660c083015260069061236d90613040565b60ff161061237e5750603c92915050565b6005915060006123948260c0015160ff16613040565b60ff16905080600714156123b4576123ad601984615d1b565b92506123c9565b600281106123c9576123c68184615d1b565b92505b81516123d79060ff16613040565b6123e49060ff1684615d1b565b92506123f6826040015160ff16613040565b6124039060ff1684615d1b565b9250612415826060015160ff16613040565b6124229060ff1684615d1b565b9250612434826020015160ff16613040565b6122d29060ff1684615d1b565b33803b903281146124645760405162461bcd60e51b8152600401610c6b90615ba9565b81156124825760405162461bcd60e51b8152600401610c6b90615ba9565b600061248d60995490565b61012e54909150600160681b90046001600160581b031642116124c25760405162461bcd60e51b8152600401610c6b90615aba565b600084116125065760405162461bcd60e51b81526020600482015260116024820152700616d6f756e74206d757374206265203e3607c1b6044820152606401610c6b565b600184111561254b5760405162461bcd60e51b81526020600482015260116024820152700c2dadeeadce840daeae6e8407840dac2f607b1b6044820152606401610c6b565b6115b36125588583615d1b565b11156125925760405162461bcd60e51b8152602060048201526009602482015268736f6c64206f75742160b81b6044820152606401610c6b565b61259a612182565b6001600160a01b0316336001600160a01b0316146125f7576125bd846000615d8e565b3410156125f75760405162461bcd60e51b81526020600482015260086024820152676e6f2066756e647360c01b6044820152606401610c6b565b60015b84811161261c5761260a3361412d565b8061261481615ec2565b9150506125fa565b505080416040516020016126319291906159c5565b60408051601f19818403018152919052805160209091012061013455505050565b3361265b612182565b6001600160a01b0316146126815760405162461bcd60e51b8152600401610c6b90615bca565b61268b82826148a9565b5050565b6001600160a01b0382163314156126e45760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610c6b565b336000818152606a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008281526101366020526040808220815160808101909252805483929190829060ff16600181111561279357634e487b7160e01b600052602160045260246000fd5b60018111156127b257634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff1660609091015290506127fc836148c3565b64ffffffffff16816060015164ffffffffff164261281a9190615ddc565b11949350505050565b3361282c612182565b6001600160a01b0316146128525760405162461bcd60e51b8152600401610c6b90615bca565b61012e80549115156101000261ff0019909216919091179055565b33803b903281146128905760405162461bcd60e51b8152600401610c6b90615ba9565b81156128ae5760405162461bcd60e51b8152600401610c6b90615ba9565b60005b83811015611927576128e88585838181106128dc57634e487b7160e01b600052603260045260246000fd5b90506020020135613066565b806128f281615ec2565b9150506128b1565b6129043383613a3d565b6129205760405162461bcd60e51b8152600401610c6b90615bff565b61292c848484846148e2565b50505050565b600081815261013560209081526040808320815160e081018352905460ff80821683526101008204811683860152620100008204811683850152630100000082048116606084810191909152600160201b83048216608080860191909152600160281b8404831660a0860152600160301b909304821660c085015287875261013690955283862084519283019094528354949592949293919283911660018111156129ed57634e487b7160e01b600052602160045260246000fd5b6001811115612a0c57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff1660609091015290506000612a58856122e9565b610133548451602086015160408701516060880151608089015160a08a015160c08b01519798506001600160a01b0390961696635d7d0289968d96959493929160018c516001811115612abb57634e487b7160e01b600052602160045260246000fd5b6040516001600160e01b031960e08d901b16815261ffff909a1660048b015260ff98891660248b015296881660448a01529487166064890152928616608488015290851660a4870152841660c4860152831660e48501521461010483015284166101248201526101440160006040518083038186803b158015612b3d57600080fd5b505afa158015612b51573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b7991908101906157c0565b95945050505050565b33612b8b612182565b6001600160a01b031614612bb15760405162461bcd60e51b8152600401610c6b90615bca565b61013a805460ff1916911515919091179055565b33612bce612182565b6001600160a01b031614612bf45760405162461bcd60e51b8152600401610c6b90615bca565b61012f80546001600160581b0319166001600160581b0392909216919091179055565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b33612c4e612182565b6001600160a01b031614612c745760405162461bcd60e51b8152600401610c6b90615bca565b600061013560008a81526020019081526020016000206040518060e00160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900460ff1660ff1660ff1681526020016000820160049054906101000a900460ff1660ff1660ff1681526020016000820160059054906101000a900460ff1660ff1660ff1681526020016000820160069054906101000a900460ff1660ff1660ff16815250509050878160c0019060ff16908160ff168152505086816000019060ff16908160ff168152505085816040019060ff16908160ff168152505084816080019060ff16908160ff1681525050838160a0019060ff16908160ff168152505082816060019060ff16908160ff168152505081816020019060ff16908160ff16815250508061013560008b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff160217905550905050612ee8896139bb565b505050505050505050565b33612efc612182565b6001600160a01b031614612f225760405162461bcd60e51b8152600401610c6b90615bca565b6001600160a01b038116612f875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c6b565b6120ec81614627565b60006001600160e01b0319821663780e9d6360e01b1480610b6b5750610b6b82614915565b6000908152606760205260409020546001600160a01b0316151590565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061300782611d61565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008161304f57506000919050565b600561305c600184615ddc565b610b6b9190615d7a565b600081815261013660205260408082208151608081019092528054829060ff1660018111156130a557634e487b7160e01b600052602160045260246000fd5b60018111156130c457634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff16606090910152905060008151600181111561312857634e487b7160e01b600052602160045260246000fd5b14156131595761313782611d61565b6001600160a01b0316336001600160a01b03161461315457600080fd5b6131a4565b60018151600181111561317c57634e487b7160e01b600052602160045260246000fd5b14156131a45780602001516001600160a01b0316336001600160a01b0316146131a457600080fd5b60006131af83612191565b9050806131bb57505050565b610132546001600160a01b03166340c10f19336131d786612191565b6040518363ffffffff1660e01b81526004016131f4929190615a38565b600060405180830381600087803b15801561320e57600080fd5b505af1158015613222573d6000803e3d6000fd5b505050600093845250506101366020525060409020805465ffffffffffff60a81b1916600160a81b4265ffffffffffff1602179055565b6000808615613270578061326c81615edd565b9150505b8515613284578061328081615edd565b9150505b8415613298578061329481615edd565b9150505b83156132ac57806132a881615edd565b9150505b82156132c057806132bc81615edd565b9150505b60ff888116600090815261013760205260409020546132e59183169061ffff16615d8e565b6132f790670de0b6b3a7640000615d8e565b98975050505050505050565b60008061330e614965565b9050600061333c8285600681111561333657634e487b7160e01b600052602160045260246000fd5b886149ad565b60ff80871660009081526101376020908152604091829020825160e081018452905461ffff80821683526201000082048116938301849052600160201b820490951693820193909352600160281b830484166060820152600160381b830484166080820152600160481b8304841660a0820152600160581b90920490921660c08201529192506133fb5760405162461bcd60e51b815260206004820152600a602482015269706f6f6c20656d70747960b01b6044820152606401610c6b565b60008061340884846149ec565b60008b815261013560209081526040808320815160e081018352905460ff808216835261010082048116948301949094526201000081048416928201929092526301000000820483166060820152600160201b820483166080820152600160281b8204831660a0820152600160301b90910490911660c08201529294509092508860068111156134a857634e487b7160e01b600052602160045260246000fd5b14156134bc5760ff831660c08201526136c7565b60018860068111156134de57634e487b7160e01b600052602160045260246000fd5b14156134ef5760ff831681526136c7565b600288600681111561351157634e487b7160e01b600052602160045260246000fd5b141561365f5760ff831660408201819052601f111561365a576000600361355688604051806040016040528060048152602001636579657360e01b8152506000614c50565b6135609190615efd565b90506000600361358e89604051806040016040528060048152602001636579657360e01b8152506000614c50565b6135989190615efd565b6135a3906003615d1b565b60ff8087166000908152610139602052604090208054929350919084169081106135dd57634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015460ff601f9093166101000a90048216608087015287821683526101399052604090912080549091831690811061363257634e487b7160e01b600052603260045260246000fd5b60009182526020918290209181049091015460ff601f9092166101000a90041660a084015250505b6136c7565b600588600681111561368157634e487b7160e01b600052602160045260246000fd5b14156136955760ff831660608201526136c7565b60068860068111156136b757634e487b7160e01b600052602160045260246000fd5b14156136c75760ff831660208201525b60008a815261013560209081526040918290208351815492850151938501516060860151608087015160a088015160c089015160ff95861661ffff1990981697909717610100988616989098029790971763ffff00001916620100009385169390930263ff0000001916929092176301000000918416919091021761ffff60201b1916600160201b9183169190910260ff60281b191617600160281b948216949094029390931760ff60301b1916600160301b928416929092029190911790556002908a16106138655760ff808a16600090815261013760209081526040918290208551815492870151938701516060880151608089015160a08a015160c08b015161ffff908116600160581b0261ffff60581b19928216600160481b0261ffff60481b19948316600160381b029490941663ffffffff60381b19958316600160281b0261ffff60281b1997909c16600160201b029690961662ffffff60201b199a8316620100000263ffffffff19909a16929097169190911797909717979097169390931796909617959095169490941793909317919091161790555b509098975050505050505050565b600660009081526101376020527fe61ba6d5276b1f0e4decff92b6d57a453a7d0d5c2a55a75aaf612a522da84e67546138b890600160381b900461ffff166001615d33565b6138c390601e615d33565b600083815261013560208181526040808420815160e081018352815460ff600160201b808304821660808501908152600160281b808504841660a087019081529b841660c0870181815281885298870181815260608801828152888c019283529f909c52999098529351975198519b5193519951955197821661ffff1990931692909217610100988216989098029790971763ffff00001916620100009a88169a909a0263ff0000001916999099176301000000918716919091021761ffff60201b191695851690970260ff60281b191694909417938316029290921760ff60301b1916600160301b92909116919091021790915550565b600081815261013560205260409081902090516001620f4f8b60e31b031981526004810191909152610138602482015273cbab1c973500112c389790a9f0c4c42071ffb4bb9063ff8583a89060440160006040518083038186803b158015613a2257600080fd5b505af4158015613a36573d6000803e3d6000fd5b5050505050565b6000613a4882612fb5565b613aa95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c6b565b6000613ab483611d61565b9050806001600160a01b0316846001600160a01b03161480613aef5750836001600160a01b0316613ae484610c03565b6001600160a01b0316145b806122d257506122d28185612c17565b826001600160a01b0316613b1282611d61565b6001600160a01b031614613b7a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c6b565b6001600160a01b038216613bdc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c6b565b613be7838383614c67565b613bf2600082612fd2565b6001600160a01b0383166000908152606860205260408120805460019290613c1b908490615ddc565b90915550506001600160a01b0382166000908152606860205260408120805460019290613c49908490615d1b565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b038681169182179092559151849391871691600080516020615f6a83398151915291a4505050565b60c95460ff16613ce15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c6b565b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051613d1b91906159e7565b60405180910390a1565b600081815261013660205260408082208151608081019092528054829060ff166001811115613d6457634e487b7160e01b600052602160045260246000fd5b6001811115613d8357634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600181516001811115613de757634e487b7160e01b600052602160045260246000fd5b1415613e265760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481cdd185ad95960921b6044820152606401610c6b565b613e2f82611d61565b6001600160a01b0316336001600160a01b031614613e7b5760405162461bcd60e51b81526020600482015260096024820152686e6f7420796f75727360b81b6044820152606401610c6b565b613e86333084613aff565b60408051608081019091528060015b81523360208083019190915265ffffffffffff421660408084019190915260608581015164ffffffffff1693019290925260008581526101369091522081518154829060ff191660018381811115613efd57634e487b7160e01b600052602160045260246000fd5b021790555060208201518154604084015160609094015164ffffffffff16600160d81b026001600160d81b0365ffffffffffff909516600160a81b0265ffffffffffff60a81b196001600160a01b039094166101000293909316610100600160d81b03199092169190911791909117929092169190911790555050565b600081815261013660205260408082208151608081019092528054829060ff166001811115613fb957634e487b7160e01b600052602160045260246000fd5b6001811115613fd857634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff16606090910152905060008151600181111561403c57634e487b7160e01b600052602160045260246000fd5b141561407d5760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481d5b9cdd185ad95960821b6044820152606401610c6b565b6000828152610136602052604090205461010090046001600160a01b031633146140a657600080fd5b6140b1303384613aff565b6140ba82613066565b6040805160808101909152806000613e95565b600081836040516020016140f892919091825260601b6001600160601b031916602082015260340190565b60405160208183030381529060405280519060200120905092915050565b6000614126826101305485614c95565b9392505050565b61413c61012d80546001019055565b600061414861012d5490565b905060018060008080808060038161415e614965565b6000805261013760209081526040805160e0810182527f9656a38e5b8bf16175eb4bca28ffa04d5646d4e9da9a5df333165c7cb8a8693f5461ffff8082168352620100008204811683860152600160201b820460ff1683850152600160281b820481166060840152600160381b820481166080840152600160481b8204811660a0840152600160581b9091041660c082015281518083019092526004825263626f647960e01b92820192909252919250906142259061421f9084908e614c50565b826149ec565b809250819950505061425861421f83604051806040016040528060058152602001641cda195b1b60da1b8152508e614c50565b809250819650505061428b61421f83604051806040016040528060058152602001641d1c985a5b60da1b8152508e614c50565b809250819550505061013960008960ff1660ff1681526020019081526020016000208360ff166142d884604051806040016040528060048152602001636579657360e01b8152508f614c50565b6142e29190615efd565b8154811061430057634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16965061013960008960ff1660ff1681526020019081526020016000208360ff1661436884604051806040016040528060058152602001640dadeeae8d60db1b8152508f614c50565b6143729190615efd565b61437d906003615d1b565b8154811061439b57634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1695506143c78c8c614d52565b6040518060e001604052808a60ff1681526020018560ff1681526020018960ff1681526020018660ff1681526020018860ff1681526020018760ff1681526020018b60ff1681525061013560008d815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff16021790555090505060405180608001604052806000600181111561453957634e487b7160e01b600052602160045260246000fd5b81526001600160a01b038e1660208083019190915265ffffffffffff4216604080840191909152600060609093018390528e8352610136909152902081518154829060ff1916600183818111156145a057634e487b7160e01b600052602160045260246000fd5b021790555060208201518154604084015160609094015164ffffffffff16600160d81b026001600160d81b0365ffffffffffff909516600160a81b0265ffffffffffff60a81b196001600160a01b039094166101000293909316610100600160d81b0319909216919091179190911792909216919091179055505050505050505050505050565b60fb80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1680614692575060005460ff16155b6146ae5760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff161580156146d0576000805461ffff19166101011790555b6146d8614e7e565b6146e0614e7e565b6146ea8383614ee8565b8015610d9c576000805461ff0019169055505050565b600054610100900460ff1680614719575060005460ff16155b6147355760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff16158015614757576000805461ffff19166101011790555b61475f614e7e565b614767614e7e565b61476f614e7e565b80156120ec576000805461ff001916905550565b600054610100900460ff168061479c575060005460ff16155b6147b85760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff161580156147da576000805461ffff19166101011790555b6147e2614e7e565b61476f614f7d565b600054610100900460ff1680614803575060005460ff16155b61481f5760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff16158015614841576000805461ffff19166101011790555b614849614e7e565b61476f614ff2565b60c95460ff16156148745760405162461bcd60e51b8152600401610c6b90615b31565b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d0e3390565b61268b828260405180602001604052806000815250615052565b61012e5460009060ff166148d957506000919050565b50617080919050565b6148ed848484613aff565b6148f984848484615085565b61292c5760405162461bcd60e51b8152600401610c6b90615adf565b60006001600160e01b031982166380ac58cd60e01b148061494657506001600160e01b03198216635b5e139f60e01b145b80610b6b57506301ffc9a760e01b6001600160e01b0319831614610b6b565b61013454604080513360601b6001600160601b031916602080830191909152426034830152605480830194909452825180830390940184526074909101909152815191012090565b6040805160208101859052908101839052606081018290526000906080015b60408051601f198184030181529190528051602090910120949350505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290526000836020015161ffff1685614a3a9190615efd565b602085018051919250614a4c82615e69565b61ffff1690525060a08401516080850151606086015160009291614a6f91615cf5565b614a799190615cf5565b61ffff168210158015614a94575060008560c0015161ffff16115b15614af757600585604001516003614aac9190615d33565b60ff16614ab99190615d8e565b614ac4600584615efd565b614acf906001615d1b565b614ad99190615d1b565b60c086018051919250614aeb82615e69565b61ffff16905250614c42565b84608001518560600151614b0b9190615cf5565b61ffff168210158015614b26575060008560a0015161ffff16115b15614b7d57600585604001516002614b3e9190615d33565b60ff16614b4b9190615d8e565b614b56600584615efd565b614b61906001615d1b565b614b6b9190615d1b565b60a086018051919250614aeb82615e69565b846060015161ffff168210158015614b9d57506000856080015161ffff16115b15614bf457600585604001516001614bb59190615d33565b60ff16614bc29190615d8e565b614bcd600584615efd565b614bd8906001615d1b565b614be29190615d1b565b608086018051919250614aeb82615e69565b6005856040015160ff16614c089190615d8e565b614c13600584615efd565b614c1e906001615d1b565b614c289190615d1b565b606086018051919250614c3a82615e69565b61ffff169052505b9250839150505b9250929050565b60008383836040516020016149cc93929190615c75565b60c95460ff1615614c8a5760405162461bcd60e51b8152600401610c6b90615b31565b610d9c838383615192565b600081815b8551811015614d47576000868281518110614cc557634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311614d07576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250614d34565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080614d3f81615ec2565b915050614c9a565b509092149392505050565b6001600160a01b038216614da85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c6b565b614db181612fb5565b15614dfd5760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610c6b565b614e0960008383614c67565b6001600160a01b0382166000908152606860205260408120805460019290614e32908490615d1b565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020615f6a833981519152908290a45050565b600054610100900460ff1680614e97575060005460ff16155b614eb35760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff1615801561476f576000805461ffff191661010117905580156120ec576000805461ff001916905550565b600054610100900460ff1680614f01575060005460ff16155b614f1d5760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff16158015614f3f576000805461ffff19166101011790555b8251614f5290606590602086019061542d565b508151614f6690606690602085019061542d565b508015610d9c576000805461ff0019169055505050565b600054610100900460ff1680614f96575060005460ff16155b614fb25760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff16158015614fd4576000805461ffff19166101011790555b60c9805460ff1916905580156120ec576000805461ff001916905550565b600054610100900460ff168061500b575060005460ff16155b6150275760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff16158015615049576000805461ffff19166101011790555b61476f33614627565b61505c8383614d52565b6150696000848484615085565b610d9c5760405162461bcd60e51b8152600401610c6b90615adf565b60006001600160a01b0384163b1561518757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906150c99033908990889088906004016159fb565b602060405180830381600087803b1580156150e357600080fd5b505af1925050508015615113575060408051601f3d908101601f19168201909252615110918101906157a4565b60015b61516d573d808015615141576040519150601f19603f3d011682016040523d82523d6000602084013e615146565b606091505b5080516151655760405162461bcd60e51b8152600401610c6b90615adf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122d2565b506001949350505050565b6001600160a01b0383166151ed576151e881609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b615210565b816001600160a01b0316836001600160a01b03161461521057615210838261524a565b6001600160a01b03821661522757610d9c816152e7565b826001600160a01b0316826001600160a01b031614610d9c57610d9c82826153c0565b6000600161525784611e2a565b6152619190615ddc565b6000838152609860205260409020549091508082146152b4576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b6099546000906152f990600190615ddc565b6000838152609a60205260408120546099805493945090928490811061532f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806099838154811061535e57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152609a909152604080822084905585825281205560998054806153a457634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006153cb83611e2a565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b82805461543990615e87565b90600052602060002090601f01602090048101928261545b57600085556154a1565b82601f1061547457805160ff19168380011785556154a1565b828001600101855582156154a1579182015b828111156154a1578251825591602001919060010190615486565b506154ad9291506154b1565b5090565b5b808211156154ad57600081556001016154b2565b80356001600160a01b03811681146154dd57600080fd5b919050565b60008083601f8401126154f3578081fd5b5081356001600160401b03811115615509578182fd5b6020830191508360208260051b8501011115614c4957600080fd5b803580151581146154dd57600080fd5b803560ff811681146154dd57600080fd5b600060208284031215615556578081fd5b614126826154c6565b60008060408385031215615571578081fd5b61557a836154c6565b9150615588602084016154c6565b90509250929050565b6000806000606084860312156155a5578081fd5b6155ae846154c6565b92506155bc602085016154c6565b9150604084013590509250925092565b600080600080608085870312156155e1578081fd5b6155ea856154c6565b93506155f8602086016154c6565b92506040850135915060608501356001600160401b03811115615619578182fd5b8501601f81018713615629578182fd5b803561563c61563782615cce565b615c9e565b818152886020838501011115615650578384fd5b81602084016020830137908101602001929092525092959194509250565b60008060408385031215615680578182fd5b615689836154c6565b915061558860208401615524565b600080604083850312156156a9578182fd5b6156b2836154c6565b946020939093013593505050565b600080600080606085870312156156d5578384fd5b6156de856154c6565b93506020850135925060408501356001600160401b038111156156ff578283fd5b61570b878288016154e2565b95989497509550505050565b60008060208385031215615729578182fd5b82356001600160401b0381111561573e578283fd5b61574a858286016154e2565b90969095509350505050565b600060208284031215615767578081fd5b61412682615524565b600060208284031215615781578081fd5b5035919050565b600060208284031215615799578081fd5b813561412681615f53565b6000602082840312156157b5578081fd5b815161412681615f53565b6000602082840312156157d1578081fd5b81516001600160401b038111156157e6578182fd5b8201601f810184136157f6578182fd5b805161580461563782615cce565b818152856020838501011115615818578384fd5b612b79826020830160208601615e3d565b6000806040838503121561583b578182fd5b8235915061558860208401615534565b600080600080600080600060e0888a031215615865578485fd5b8735965061587560208901615534565b955061588360408901615524565b945061589160608901615524565b935061589f60808901615524565b92506158ad60a08901615524565b91506158bb60c08901615524565b905092959891949750929550565b600080600080600080600080610100898b0312156158e5578182fd5b883597506158f560208a01615534565b965061590360408a01615534565b955061591160608a01615534565b945061591f60808a01615534565b935061592d60a08a01615534565b925061593b60c08a01615534565b915061594960e08a01615534565b90509295985092959890939650565b600060208284031215615969578081fd5b61412682615534565b600060208284031215615983578081fd5b81356001600160581b0381168114614126578182fd5b600081518084526159b1816020860160208601615e3d565b601f01601f19169290920160200192915050565b6001600160601b0319606093841b811682529190921b16601482015260280190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615a2e90830184615999565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6080810160028610615a7357634e487b7160e01b600052602160045260246000fd5b9481526001600160a01b0393909316602084015265ffffffffffff91909116604083015264ffffffffff1660609091015290565b6020815260006141266020830184615999565b6020808252600b908201526a1b5a5b9d081b1bd8dad95960aa1b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526007908201526631b432b0ba32b960c91b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600b908201526a19d85b59481c185d5cd95960aa1b604082015260600190565b838152606060208201526000615c8e6060830185615999565b9050826040830152949350505050565b604051601f8201601f191681016001600160401b0381118282101715615cc657615cc6615f3d565b604052919050565b60006001600160401b03821115615ce757615ce7615f3d565b50601f01601f191660200190565b600061ffff808316818516808303821115615d1257615d12615f11565b01949350505050565b60008219821115615d2e57615d2e615f11565b500190565b600060ff821660ff84168060ff03821115615d5057615d50615f11565b019392505050565b60006001600160581b03828116848216808303821115615d1257615d12615f11565b600082615d8957615d89615f27565b500490565b6000816000190483118215151615615da857615da8615f11565b500290565b60006001600160581b0382811684821681151582840482111615615dd357615dd3615f11565b02949350505050565b600082821015615dee57615dee615f11565b500390565b600065ffffffffffff83811690831681811015615e1257615e12615f11565b039392505050565b600060ff821660ff841680821015615e3457615e34615f11565b90039392505050565b60005b83811015615e58578181015183820152602001615e40565b8381111561292c5750506000910152565b600061ffff821680615e7d57615e7d615f11565b6000190192915050565b600181811c90821680615e9b57607f821691505b60208210811415615ebc57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615ed657615ed6615f11565b5060010190565b600060ff821660ff811415615ef457615ef4615f11565b60010192915050565b600082615f0c57615f0c615f27565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146120ec57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204ed681feea016191b7d90f1577c6a6b861cae537abe1263a9d2ed9d90593e94764736f6c63430008040033
Deployed Bytecode
0x6080604052600436106102a75760003560e01c806301ffc9a7146102ac57806306fdde03146102e1578063081812fc14610303578063095ea7b31461033057806309647dfe146103525780630d0cdee01461037257806313faede61461039257806318160ddd146103b5578063239c70ae146103ca57806323b872dd146103df5780632551cd34146103ff5780632bb1a91a1461041f5780632cc76cec1461045e5780632eb4a7ab1461047e5780632f745c59146104955780633a577ec9146104b55780633ccfd60b146104d55780633f4ba83a146104dd578063421f3d2d146104f257806342842e0e146105125780634c8c3246146105325780634f6ccce7146105525780635932ead1146105725780635bca47d5146105925780635c975abb146105b257806360ef50b9146105ca5780636352211e146105dd578063668e780f146105fd5780636cad4e5a1461062e57806370a082311461064e578063715018a61461066e578063719eb7c71461068357806378e97925146106a35780637cb64759146106c45780638129fc1c146106e45780638456cb59146106f957806386b75b441461070e5780638da5cb5b1461072e57806390494fb71461074357806391d1ea4d1461076357806395d89b4114610784578063972a4b4814610799578063a0712d68146107b9578063a1448194146107cc578063a22cb465146107ec578063ae4046811461080c578063b02e893f1461087c578063b54710c21461089c578063b5c14adb1461094b578063b7911ae61461096b578063b88d4fde1461098b578063c87b56dd146109ab578063d3cf00a3146109cb578063d5abeb01146109f3578063db04c9c514610a09578063de230b9c14610a29578063e985e9c514610a49578063f158783a14610a69578063f2fde38b14610a89578063fb87a63514610aa9575b600080fd5b3480156102b857600080fd5b506102cc6102c7366004615788565b610b60565b60405190151581526020015b60405180910390f35b3480156102ed57600080fd5b506102f6610b71565b6040516102d89190615aa7565b34801561030f57600080fd5b5061032361031e366004615770565b610c03565b6040516102d891906159e7565b34801561033c57600080fd5b5061035061034b366004615697565b610c90565b005b34801561035e57600080fd5b5061035061036d366004615545565b610da1565b34801561037e57600080fd5b5061035061038d36600461584b565b610df3565b34801561039e57600080fd5b506103a7600081565b6040519081526020016102d8565b3480156103c157600080fd5b506099546103a7565b3480156103d657600080fd5b506103a7600181565b3480156103eb57600080fd5b506103506103fa366004615591565b6113dc565b34801561040b57600080fd5b506103a761041a366004615545565b61140d565b34801561042b57600080fd5b5061012e54610446906201000090046001600160581b031681565b6040516001600160581b0390911681526020016102d8565b34801561046a57600080fd5b506103a7610479366004615697565b611533565b34801561048a57600080fd5b506103a76101305481565b3480156104a157600080fd5b506103a76104b0366004615697565b61166e565b3480156104c157600080fd5b506102cc6104d0366004615958565b611704565b610350611764565b3480156104e957600080fd5b506103506117f1565b3480156104fe57600080fd5b5061035061050d366004615717565b611828565b34801561051e57600080fd5b5061035061052d366004615591565b61195d565b34801561053e57600080fd5b5061035061054d366004615717565b611978565b34801561055e57600080fd5b506103a761056d366004615770565b611a05565b34801561057e57600080fd5b5061035061058d366004615756565b611aa6565b34801561059e57600080fd5b506103506105ad366004615697565b611ae9565b3480156105be57600080fd5b5060c95460ff166102cc565b6103506105d83660046156c0565b611b81565b3480156105e957600080fd5b506103236105f8366004615770565b611d61565b34801561060957600080fd5b506102cc610618366004615958565b6101386020526000908152604090205460ff1681565b34801561063a57600080fd5b50610350610649366004615545565b611dd8565b34801561065a57600080fd5b506103a7610669366004615545565b611e2a565b34801561067a57600080fd5b50610350611eb1565b34801561068f57600080fd5b5061035061069e366004615972565b611eea565b3480156106af57600080fd5b5061012f54610446906001600160581b031681565b3480156106d057600080fd5b506103506106df366004615770565b611f44565b3480156106f057600080fd5b50610350611f79565b34801561070557600080fd5b506103506120ef565b34801561071a57600080fd5b50610350610729366004615972565b612126565b34801561073a57600080fd5b50610323612182565b34801561074f57600080fd5b506103a761075e366004615770565b612191565b34801561076f57600080fd5b5061013254610323906001600160a01b031681565b34801561079057600080fd5b506102f66122da565b3480156107a557600080fd5b506103a76107b4366004615770565b6122e9565b6103506107c7366004615770565b612441565b3480156107d857600080fd5b506103506107e7366004615697565b612652565b3480156107f857600080fd5b5061035061080736600461566e565b61268f565b34801561081857600080fd5b5061086c610827366004615770565b6101366020526000908152604090205460ff81169061010081046001600160a01b031690600160a81b810465ffffffffffff1690600160d81b900464ffffffffff1684565b6040516102d89493929190615a51565b34801561088857600080fd5b506102cc610897366004615829565b612750565b3480156108a857600080fd5b506109086108b7366004615770565b6101356020526000908152604090205460ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b8104821691600160301b9091041687565b6040805160ff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e0016102d8565b34801561095757600080fd5b50610350610966366004615756565b612823565b34801561097757600080fd5b50610350610986366004615717565b61286d565b34801561099757600080fd5b506103506109a63660046155cc565b6128fa565b3480156109b757600080fd5b506102f66109c6366004615770565b612932565b3480156109d757600080fd5b5061012e5461044690600160681b90046001600160581b031681565b3480156109ff57600080fd5b506103a76115b381565b348015610a1557600080fd5b50610350610a24366004615756565b612b82565b348015610a3557600080fd5b50610350610a44366004615972565b612bc5565b348015610a5557600080fd5b506102cc610a6436600461555f565b612c17565b348015610a7557600080fd5b50610350610a843660046158c9565b612c45565b348015610a9557600080fd5b50610350610aa4366004615545565b612ef3565b348015610ab557600080fd5b50610b19610ac4366004615958565b6101376020526000908152604090205461ffff8082169162010000810482169160ff600160201b83041691600160281b8104821691600160381b8204811691600160481b8104821691600160581b9091041687565b6040805161ffff9889168152968816602088015260ff90951694860194909452918516606085015284166080840152831660a08301529190911660c082015260e0016102d8565b6000610b6b82612f90565b92915050565b606060658054610b8090615e87565b80601f0160208091040260200160405190810160405280929190818152602001828054610bac90615e87565b8015610bf95780601f10610bce57610100808354040283529160200191610bf9565b820191906000526020600020905b815481529060010190602001808311610bdc57829003601f168201915b5050505050905090565b6000610c0e82612fb5565b610c745760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b6000610c9b82611d61565b9050806001600160a01b0316836001600160a01b03161415610d095760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c6b565b336001600160a01b0382161480610d255750610d258133612c17565b610d925760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610c6b565b610d9c8383612fd2565b505050565b33610daa612182565b6001600160a01b031614610dd05760405162461bcd60e51b8152600401610c6b90615bca565b61013380546001600160a01b0319166001600160a01b0392909216919091179055565b33803b90328114610e165760405162461bcd60e51b8152600401610c6b90615ba9565b8115610e345760405162461bcd60e51b8152600401610c6b90615ba9565b600089815261013660205260408082208151608081019092528054829060ff166001811115610e7357634e487b7160e01b600052602160045260246000fd5b6001811115610e9257634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600081516001811115610ef657634e487b7160e01b600052602160045260246000fd5b1415610f2757610f058a611d61565b6001600160a01b0316336001600160a01b031614610f2257600080fd5b610f72565b600181516001811115610f4a57634e487b7160e01b600052602160045260246000fd5b1415610f725780602001516001600160a01b0316336001600160a01b031614610f7257600080fd5b60008a81526101356020908152604091829020825160e081018452905460ff808216835261010082048116938301939093526201000081048316938201939093526301000000830482166060820152600160201b830482166080820152600160281b8304821660a0820152600160301b909204811660c083015261013a54161561102f5760405162461bcd60e51b815260206004820152600e60248201526d1b1bdbdd1a5b99c81c185d5cd95960921b6044820152606401610c6b565b61012e54610100900460ff16156110585760405162461bcd60e51b8152600401610c6b90615c50565b88806110615750875b806110695750865b806110715750855b806110795750845b6110b55760405162461bcd60e51b815260206004820152600d60248201526c726f6c6c203e3020706172747360981b6044820152606401610c6b565b6110bf8b8b612750565b6110f65760405162461bcd60e51b815260206004820152600860248201526731b7b7b63237bbb760c11b6044820152606401610c6b565b60008a60ff1611801561110d575060068a60ff1611155b6111485760405162461bcd60e51b815260206004820152600c60248201526b34b73b30b634b2103a34b2b960a11b6044820152606401610c6b565b6111518a611704565b61118b5760405162461bcd60e51b815260206004820152600b60248201526a1d1a595c881b1bd8dad95960aa1b6044820152606401610c6b565b600661119d826040015160ff16613040565b60ff16106111e35760405162461bcd60e51b815260206004820152601360248201527263616e277420726f6c6c206120756e6971756560681b6044820152606401610c6b565b60008b81526101366020526040902080546001600160d81b0316600160d81b4264ffffffffff16021790556112178b613066565b610132546001600160a01b03166379cc6790336112388d8d8d8d8d8d613259565b6040518363ffffffff1660e01b8152600401611255929190615a38565b600060405180830381600087803b15801561126f57600080fd5b505af1158015611283573d6000803e3d6000fd5b50505050600089156112c55761129b8c8c6000613303565b90506112a98160ff16613040565b60ff16600614156112c5576112bd8c613873565b5050506113a2565b88156112f9576112d78c8c6001613303565b90506112e58160ff16613040565b60ff16600614156112f9576112bd8c613873565b871561132d5761130b8c8c6002613303565b90506113198160ff16613040565b60ff166006141561132d576112bd8c613873565b86156113615761133f8c8c6005613303565b905061134d8160ff16613040565b60ff1660061415611361576112bd8c613873565b8515611395576113738c8c6006613303565b90506113818160ff16613040565b60ff1660061415611395576112bd8c613873565b61139e8c6139bb565b5050505b80416040516020016113b59291906159c5565b60408051601f19818403018152919052805160209091012061013455505050505050505050565b6113e63382613a3d565b6114025760405162461bcd60e51b8152600401610c6b90615bff565b610d9c838383613aff565b600080611418615404565b60015b61012d54811161152a5760008181526101366020526040908190208151608081019092528054829060ff16600181111561146557634e487b7160e01b600052602160045260246000fd5b600181111561148457634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03908116602080850191909152600160a81b830465ffffffffffff166040850152600160d81b90920464ffffffffff166060909301929092528201519193508681169116148015611505575060018251600181111561150357634e487b7160e01b600052602160045260246000fd5b145b15611518578261151481615ec2565b9350505b8061152281615ec2565b91505061141b565b50909392505050565b60008061153e615404565b60015b61012d5481116116625760008181526101366020526040908190208151608081019092528054829060ff16600181111561158b57634e487b7160e01b600052602160045260246000fd5b60018111156115aa57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03908116602080850191909152600160a81b830465ffffffffffff166040850152600160d81b90920464ffffffffff16606090930192909252820151919350878116911614801561162b575060018251600181111561162957634e487b7160e01b600052602160045260246000fd5b145b156116505784831415611642579250610b6b915050565b8261164c81615ec2565b9350505b8061165a81615ec2565b915050611541565b50600095945050505050565b600061167983611e2a565b82106116db5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c6b565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b600060ff821661171657506001919050565b611721600183615e1a565b61172f9060ff166001615dad565b61173c9062017bb0615dad565b61012f5461175391906001600160581b0316615d58565b6001600160581b0316421192915050565b3361176d612182565b6001600160a01b0316146117935760405162461bcd60e51b8152600401610c6b90615bca565b60405133904780156108fc02916000818181858888f193505050506117ef5760405162461bcd60e51b8152602060048201526012602482015271636f756c64206e6f7420776974686472617760701b6044820152606401610c6b565b565b336117fa612182565b6001600160a01b0316146118205760405162461bcd60e51b8152600401610c6b90615bca565b6117ef613c98565b33803b9032811461184b5760405162461bcd60e51b8152600401610c6b90615ba9565b81156118695760405162461bcd60e51b8152600401610c6b90615ba9565b61012f546001600160581b031642116118b25760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b6044820152606401610c6b565b61012e54610100900460ff16156118db5760405162461bcd60e51b8152600401610c6b90615c50565b60005b838110156119275761191585858381811061190957634e487b7160e01b600052603260045260246000fd5b90506020020135613d25565b8061191f81615ec2565b9150506118de565b50804160405160200161193b9291906159c5565b60408051601f1981840301815291905280516020909101206101345550505050565b610d9c838383604051806020016040528060008152506128fa565b33803b9032811461199b5760405162461bcd60e51b8152600401610c6b90615ba9565b81156119b95760405162461bcd60e51b8152600401610c6b90615ba9565b60005b83811015611927576119f38585838181106119e757634e487b7160e01b600052603260045260246000fd5b90506020020135613f7a565b806119fd81615ec2565b9150506119bc565b6000611a1060995490565b8210611a735760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c6b565b60998281548110611a9457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b33611aaf612182565b6001600160a01b031614611ad55760405162461bcd60e51b8152600401610c6b90615bca565b61012e805460ff1916911515919091179055565b33611af2612182565b6001600160a01b031614611b185760405162461bcd60e51b8152600401610c6b90615bca565b610132546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990611b4b9085908590600401615a38565b600060405180830381600087803b158015611b6557600080fd5b505af1158015611b79573d6000803e3d6000fd5b505050505050565b33803b90328114611ba45760405162461bcd60e51b8152600401610c6b90615ba9565b8115611bc25760405162461bcd60e51b8152600401610c6b90615ba9565b61012e546201000090046001600160581b03164211611bf35760405162461bcd60e51b8152600401610c6b90615aba565b611bfb612182565b6001600160a01b0316336001600160a01b031614158015611c1c5750607185115b50611c63611c2a87876140cd565b85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061411692505050565b611c9f5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610c6b565b6001600160a01b0386166000908152610131602052604090205415611cf75760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481b5a5b9d195960921b6044820152606401610c6b565b6001600160a01b038616600090815261013160205260408120805491611d1c83615ec2565b9190505550611d2a8661412d565b8041604051602001611d3d9291906159c5565b60408051601f19818403018152919052805160209091012061013455505050505050565b6000818152606760205260408120546001600160a01b031680610b6b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c6b565b33611de1612182565b6001600160a01b031614611e075760405162461bcd60e51b8152600401610c6b90615bca565b61013280546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216611e955760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c6b565b506001600160a01b031660009081526068602052604090205490565b33611eba612182565b6001600160a01b031614611ee05760405162461bcd60e51b8152600401610c6b90615bca565b6117ef6000614627565b33611ef3612182565b6001600160a01b031614611f195760405162461bcd60e51b8152600401610c6b90615bca565b61012e80546001600160581b03909216620100000262010000600160681b0319909216919091179055565b33611f4d612182565b6001600160a01b031614611f735760405162461bcd60e51b8152600401610c6b90615bca565b61013055565b600054610100900460ff1680611f92575060005460ff16155b611fae5760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff16158015611fd0576000805461ffff19166101011790555b61201b6040518060400160405280600981526020016845766f536e61696c7360b81b81525060405180604001604052806008815260200167115593d4d390525360c21b815250614679565b612023614700565b61202b614783565b6120336147ea565b61012e80546001600160c01b03191665617f9e800001630186011d606e1b0117905561012f805463618055506001600160581b031990911617905560405163091ce90360e21b81526101376004820152610139602482015273cbab1c973500112c389790a9f0c4c42071ffb4bb90632473a40c9060440160006040518083038186803b1580156120c257600080fd5b505af41580156120d6573d6000803e3d6000fd5b5050505080156120ec576000805461ff00191690555b50565b336120f8612182565b6001600160a01b03161461211e5760405162461bcd60e51b8152600401610c6b90615bca565b6117ef614851565b3361212f612182565b6001600160a01b0316146121555760405162461bcd60e51b8152600401610c6b90615bca565b61012e80546001600160581b03909216600160681b02600160681b600160c01b0319909216919091179055565b60fb546001600160a01b031690565b60008181526101366020526040808220815160808101909252805483929190829060ff1660018111156121d457634e487b7160e01b600052602160045260246000fd5b60018111156121f357634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b0316602080840191909152600160a81b80830465ffffffffffff908116604080870191909152600160d81b90940464ffffffffff1660609095019490945260008881526101369092529181205493945092612262929190041642615df3565b65ffffffffffff16905060008251600181111561228f57634e487b7160e01b600052602160045260246000fd5b141561229f575060009392505050565b620151806122ac856122e9565b6122b69083615d8e565b6122c890670de0b6b3a7640000615d8e565b6122d29190615d7a565b949350505050565b606060668054610b8090615e87565b600081815261013560209081526040808320815160e081018352905460ff8082168352610100820481169483019490945262010000810484169282018390526301000000810484166060830152600160201b810484166080830152600160281b8104841660a0830152600160301b900490921660c083015260069061236d90613040565b60ff161061237e5750603c92915050565b6005915060006123948260c0015160ff16613040565b60ff16905080600714156123b4576123ad601984615d1b565b92506123c9565b600281106123c9576123c68184615d1b565b92505b81516123d79060ff16613040565b6123e49060ff1684615d1b565b92506123f6826040015160ff16613040565b6124039060ff1684615d1b565b9250612415826060015160ff16613040565b6124229060ff1684615d1b565b9250612434826020015160ff16613040565b6122d29060ff1684615d1b565b33803b903281146124645760405162461bcd60e51b8152600401610c6b90615ba9565b81156124825760405162461bcd60e51b8152600401610c6b90615ba9565b600061248d60995490565b61012e54909150600160681b90046001600160581b031642116124c25760405162461bcd60e51b8152600401610c6b90615aba565b600084116125065760405162461bcd60e51b81526020600482015260116024820152700616d6f756e74206d757374206265203e3607c1b6044820152606401610c6b565b600184111561254b5760405162461bcd60e51b81526020600482015260116024820152700c2dadeeadce840daeae6e8407840dac2f607b1b6044820152606401610c6b565b6115b36125588583615d1b565b11156125925760405162461bcd60e51b8152602060048201526009602482015268736f6c64206f75742160b81b6044820152606401610c6b565b61259a612182565b6001600160a01b0316336001600160a01b0316146125f7576125bd846000615d8e565b3410156125f75760405162461bcd60e51b81526020600482015260086024820152676e6f2066756e647360c01b6044820152606401610c6b565b60015b84811161261c5761260a3361412d565b8061261481615ec2565b9150506125fa565b505080416040516020016126319291906159c5565b60408051601f19818403018152919052805160209091012061013455505050565b3361265b612182565b6001600160a01b0316146126815760405162461bcd60e51b8152600401610c6b90615bca565b61268b82826148a9565b5050565b6001600160a01b0382163314156126e45760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610c6b565b336000818152606a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008281526101366020526040808220815160808101909252805483929190829060ff16600181111561279357634e487b7160e01b600052602160045260246000fd5b60018111156127b257634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff1660609091015290506127fc836148c3565b64ffffffffff16816060015164ffffffffff164261281a9190615ddc565b11949350505050565b3361282c612182565b6001600160a01b0316146128525760405162461bcd60e51b8152600401610c6b90615bca565b61012e80549115156101000261ff0019909216919091179055565b33803b903281146128905760405162461bcd60e51b8152600401610c6b90615ba9565b81156128ae5760405162461bcd60e51b8152600401610c6b90615ba9565b60005b83811015611927576128e88585838181106128dc57634e487b7160e01b600052603260045260246000fd5b90506020020135613066565b806128f281615ec2565b9150506128b1565b6129043383613a3d565b6129205760405162461bcd60e51b8152600401610c6b90615bff565b61292c848484846148e2565b50505050565b600081815261013560209081526040808320815160e081018352905460ff80821683526101008204811683860152620100008204811683850152630100000082048116606084810191909152600160201b83048216608080860191909152600160281b8404831660a0860152600160301b909304821660c085015287875261013690955283862084519283019094528354949592949293919283911660018111156129ed57634e487b7160e01b600052602160045260246000fd5b6001811115612a0c57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff1660609091015290506000612a58856122e9565b610133548451602086015160408701516060880151608089015160a08a015160c08b01519798506001600160a01b0390961696635d7d0289968d96959493929160018c516001811115612abb57634e487b7160e01b600052602160045260246000fd5b6040516001600160e01b031960e08d901b16815261ffff909a1660048b015260ff98891660248b015296881660448a01529487166064890152928616608488015290851660a4870152841660c4860152831660e48501521461010483015284166101248201526101440160006040518083038186803b158015612b3d57600080fd5b505afa158015612b51573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b7991908101906157c0565b95945050505050565b33612b8b612182565b6001600160a01b031614612bb15760405162461bcd60e51b8152600401610c6b90615bca565b61013a805460ff1916911515919091179055565b33612bce612182565b6001600160a01b031614612bf45760405162461bcd60e51b8152600401610c6b90615bca565b61012f80546001600160581b0319166001600160581b0392909216919091179055565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b33612c4e612182565b6001600160a01b031614612c745760405162461bcd60e51b8152600401610c6b90615bca565b600061013560008a81526020019081526020016000206040518060e00160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900460ff1660ff1660ff1681526020016000820160049054906101000a900460ff1660ff1660ff1681526020016000820160059054906101000a900460ff1660ff1660ff1681526020016000820160069054906101000a900460ff1660ff1660ff16815250509050878160c0019060ff16908160ff168152505086816000019060ff16908160ff168152505085816040019060ff16908160ff168152505084816080019060ff16908160ff1681525050838160a0019060ff16908160ff168152505082816060019060ff16908160ff168152505081816020019060ff16908160ff16815250508061013560008b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff160217905550905050612ee8896139bb565b505050505050505050565b33612efc612182565b6001600160a01b031614612f225760405162461bcd60e51b8152600401610c6b90615bca565b6001600160a01b038116612f875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c6b565b6120ec81614627565b60006001600160e01b0319821663780e9d6360e01b1480610b6b5750610b6b82614915565b6000908152606760205260409020546001600160a01b0316151590565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061300782611d61565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008161304f57506000919050565b600561305c600184615ddc565b610b6b9190615d7a565b600081815261013660205260408082208151608081019092528054829060ff1660018111156130a557634e487b7160e01b600052602160045260246000fd5b60018111156130c457634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff16606090910152905060008151600181111561312857634e487b7160e01b600052602160045260246000fd5b14156131595761313782611d61565b6001600160a01b0316336001600160a01b03161461315457600080fd5b6131a4565b60018151600181111561317c57634e487b7160e01b600052602160045260246000fd5b14156131a45780602001516001600160a01b0316336001600160a01b0316146131a457600080fd5b60006131af83612191565b9050806131bb57505050565b610132546001600160a01b03166340c10f19336131d786612191565b6040518363ffffffff1660e01b81526004016131f4929190615a38565b600060405180830381600087803b15801561320e57600080fd5b505af1158015613222573d6000803e3d6000fd5b505050600093845250506101366020525060409020805465ffffffffffff60a81b1916600160a81b4265ffffffffffff1602179055565b6000808615613270578061326c81615edd565b9150505b8515613284578061328081615edd565b9150505b8415613298578061329481615edd565b9150505b83156132ac57806132a881615edd565b9150505b82156132c057806132bc81615edd565b9150505b60ff888116600090815261013760205260409020546132e59183169061ffff16615d8e565b6132f790670de0b6b3a7640000615d8e565b98975050505050505050565b60008061330e614965565b9050600061333c8285600681111561333657634e487b7160e01b600052602160045260246000fd5b886149ad565b60ff80871660009081526101376020908152604091829020825160e081018452905461ffff80821683526201000082048116938301849052600160201b820490951693820193909352600160281b830484166060820152600160381b830484166080820152600160481b8304841660a0820152600160581b90920490921660c08201529192506133fb5760405162461bcd60e51b815260206004820152600a602482015269706f6f6c20656d70747960b01b6044820152606401610c6b565b60008061340884846149ec565b60008b815261013560209081526040808320815160e081018352905460ff808216835261010082048116948301949094526201000081048416928201929092526301000000820483166060820152600160201b820483166080820152600160281b8204831660a0820152600160301b90910490911660c08201529294509092508860068111156134a857634e487b7160e01b600052602160045260246000fd5b14156134bc5760ff831660c08201526136c7565b60018860068111156134de57634e487b7160e01b600052602160045260246000fd5b14156134ef5760ff831681526136c7565b600288600681111561351157634e487b7160e01b600052602160045260246000fd5b141561365f5760ff831660408201819052601f111561365a576000600361355688604051806040016040528060048152602001636579657360e01b8152506000614c50565b6135609190615efd565b90506000600361358e89604051806040016040528060048152602001636579657360e01b8152506000614c50565b6135989190615efd565b6135a3906003615d1b565b60ff8087166000908152610139602052604090208054929350919084169081106135dd57634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015460ff601f9093166101000a90048216608087015287821683526101399052604090912080549091831690811061363257634e487b7160e01b600052603260045260246000fd5b60009182526020918290209181049091015460ff601f9092166101000a90041660a084015250505b6136c7565b600588600681111561368157634e487b7160e01b600052602160045260246000fd5b14156136955760ff831660608201526136c7565b60068860068111156136b757634e487b7160e01b600052602160045260246000fd5b14156136c75760ff831660208201525b60008a815261013560209081526040918290208351815492850151938501516060860151608087015160a088015160c089015160ff95861661ffff1990981697909717610100988616989098029790971763ffff00001916620100009385169390930263ff0000001916929092176301000000918416919091021761ffff60201b1916600160201b9183169190910260ff60281b191617600160281b948216949094029390931760ff60301b1916600160301b928416929092029190911790556002908a16106138655760ff808a16600090815261013760209081526040918290208551815492870151938701516060880151608089015160a08a015160c08b015161ffff908116600160581b0261ffff60581b19928216600160481b0261ffff60481b19948316600160381b029490941663ffffffff60381b19958316600160281b0261ffff60281b1997909c16600160201b029690961662ffffff60201b199a8316620100000263ffffffff19909a16929097169190911797909717979097169390931796909617959095169490941793909317919091161790555b509098975050505050505050565b600660009081526101376020527fe61ba6d5276b1f0e4decff92b6d57a453a7d0d5c2a55a75aaf612a522da84e67546138b890600160381b900461ffff166001615d33565b6138c390601e615d33565b600083815261013560208181526040808420815160e081018352815460ff600160201b808304821660808501908152600160281b808504841660a087019081529b841660c0870181815281885298870181815260608801828152888c019283529f909c52999098529351975198519b5193519951955197821661ffff1990931692909217610100988216989098029790971763ffff00001916620100009a88169a909a0263ff0000001916999099176301000000918716919091021761ffff60201b191695851690970260ff60281b191694909417938316029290921760ff60301b1916600160301b92909116919091021790915550565b600081815261013560205260409081902090516001620f4f8b60e31b031981526004810191909152610138602482015273cbab1c973500112c389790a9f0c4c42071ffb4bb9063ff8583a89060440160006040518083038186803b158015613a2257600080fd5b505af4158015613a36573d6000803e3d6000fd5b5050505050565b6000613a4882612fb5565b613aa95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c6b565b6000613ab483611d61565b9050806001600160a01b0316846001600160a01b03161480613aef5750836001600160a01b0316613ae484610c03565b6001600160a01b0316145b806122d257506122d28185612c17565b826001600160a01b0316613b1282611d61565b6001600160a01b031614613b7a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c6b565b6001600160a01b038216613bdc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c6b565b613be7838383614c67565b613bf2600082612fd2565b6001600160a01b0383166000908152606860205260408120805460019290613c1b908490615ddc565b90915550506001600160a01b0382166000908152606860205260408120805460019290613c49908490615d1b565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b038681169182179092559151849391871691600080516020615f6a83398151915291a4505050565b60c95460ff16613ce15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c6b565b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051613d1b91906159e7565b60405180910390a1565b600081815261013660205260408082208151608081019092528054829060ff166001811115613d6457634e487b7160e01b600052602160045260246000fd5b6001811115613d8357634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600181516001811115613de757634e487b7160e01b600052602160045260246000fd5b1415613e265760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481cdd185ad95960921b6044820152606401610c6b565b613e2f82611d61565b6001600160a01b0316336001600160a01b031614613e7b5760405162461bcd60e51b81526020600482015260096024820152686e6f7420796f75727360b81b6044820152606401610c6b565b613e86333084613aff565b60408051608081019091528060015b81523360208083019190915265ffffffffffff421660408084019190915260608581015164ffffffffff1693019290925260008581526101369091522081518154829060ff191660018381811115613efd57634e487b7160e01b600052602160045260246000fd5b021790555060208201518154604084015160609094015164ffffffffff16600160d81b026001600160d81b0365ffffffffffff909516600160a81b0265ffffffffffff60a81b196001600160a01b039094166101000293909316610100600160d81b03199092169190911791909117929092169190911790555050565b600081815261013660205260408082208151608081019092528054829060ff166001811115613fb957634e487b7160e01b600052602160045260246000fd5b6001811115613fd857634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff16606090910152905060008151600181111561403c57634e487b7160e01b600052602160045260246000fd5b141561407d5760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481d5b9cdd185ad95960821b6044820152606401610c6b565b6000828152610136602052604090205461010090046001600160a01b031633146140a657600080fd5b6140b1303384613aff565b6140ba82613066565b6040805160808101909152806000613e95565b600081836040516020016140f892919091825260601b6001600160601b031916602082015260340190565b60405160208183030381529060405280519060200120905092915050565b6000614126826101305485614c95565b9392505050565b61413c61012d80546001019055565b600061414861012d5490565b905060018060008080808060038161415e614965565b6000805261013760209081526040805160e0810182527f9656a38e5b8bf16175eb4bca28ffa04d5646d4e9da9a5df333165c7cb8a8693f5461ffff8082168352620100008204811683860152600160201b820460ff1683850152600160281b820481166060840152600160381b820481166080840152600160481b8204811660a0840152600160581b9091041660c082015281518083019092526004825263626f647960e01b92820192909252919250906142259061421f9084908e614c50565b826149ec565b809250819950505061425861421f83604051806040016040528060058152602001641cda195b1b60da1b8152508e614c50565b809250819650505061428b61421f83604051806040016040528060058152602001641d1c985a5b60da1b8152508e614c50565b809250819550505061013960008960ff1660ff1681526020019081526020016000208360ff166142d884604051806040016040528060048152602001636579657360e01b8152508f614c50565b6142e29190615efd565b8154811061430057634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16965061013960008960ff1660ff1681526020019081526020016000208360ff1661436884604051806040016040528060058152602001640dadeeae8d60db1b8152508f614c50565b6143729190615efd565b61437d906003615d1b565b8154811061439b57634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1695506143c78c8c614d52565b6040518060e001604052808a60ff1681526020018560ff1681526020018960ff1681526020018660ff1681526020018860ff1681526020018760ff1681526020018b60ff1681525061013560008d815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff16021790555090505060405180608001604052806000600181111561453957634e487b7160e01b600052602160045260246000fd5b81526001600160a01b038e1660208083019190915265ffffffffffff4216604080840191909152600060609093018390528e8352610136909152902081518154829060ff1916600183818111156145a057634e487b7160e01b600052602160045260246000fd5b021790555060208201518154604084015160609094015164ffffffffff16600160d81b026001600160d81b0365ffffffffffff909516600160a81b0265ffffffffffff60a81b196001600160a01b039094166101000293909316610100600160d81b0319909216919091179190911792909216919091179055505050505050505050505050565b60fb80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1680614692575060005460ff16155b6146ae5760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff161580156146d0576000805461ffff19166101011790555b6146d8614e7e565b6146e0614e7e565b6146ea8383614ee8565b8015610d9c576000805461ff0019169055505050565b600054610100900460ff1680614719575060005460ff16155b6147355760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff16158015614757576000805461ffff19166101011790555b61475f614e7e565b614767614e7e565b61476f614e7e565b80156120ec576000805461ff001916905550565b600054610100900460ff168061479c575060005460ff16155b6147b85760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff161580156147da576000805461ffff19166101011790555b6147e2614e7e565b61476f614f7d565b600054610100900460ff1680614803575060005460ff16155b61481f5760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff16158015614841576000805461ffff19166101011790555b614849614e7e565b61476f614ff2565b60c95460ff16156148745760405162461bcd60e51b8152600401610c6b90615b31565b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d0e3390565b61268b828260405180602001604052806000815250615052565b61012e5460009060ff166148d957506000919050565b50617080919050565b6148ed848484613aff565b6148f984848484615085565b61292c5760405162461bcd60e51b8152600401610c6b90615adf565b60006001600160e01b031982166380ac58cd60e01b148061494657506001600160e01b03198216635b5e139f60e01b145b80610b6b57506301ffc9a760e01b6001600160e01b0319831614610b6b565b61013454604080513360601b6001600160601b031916602080830191909152426034830152605480830194909452825180830390940184526074909101909152815191012090565b6040805160208101859052908101839052606081018290526000906080015b60408051601f198184030181529190528051602090910120949350505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290526000836020015161ffff1685614a3a9190615efd565b602085018051919250614a4c82615e69565b61ffff1690525060a08401516080850151606086015160009291614a6f91615cf5565b614a799190615cf5565b61ffff168210158015614a94575060008560c0015161ffff16115b15614af757600585604001516003614aac9190615d33565b60ff16614ab99190615d8e565b614ac4600584615efd565b614acf906001615d1b565b614ad99190615d1b565b60c086018051919250614aeb82615e69565b61ffff16905250614c42565b84608001518560600151614b0b9190615cf5565b61ffff168210158015614b26575060008560a0015161ffff16115b15614b7d57600585604001516002614b3e9190615d33565b60ff16614b4b9190615d8e565b614b56600584615efd565b614b61906001615d1b565b614b6b9190615d1b565b60a086018051919250614aeb82615e69565b846060015161ffff168210158015614b9d57506000856080015161ffff16115b15614bf457600585604001516001614bb59190615d33565b60ff16614bc29190615d8e565b614bcd600584615efd565b614bd8906001615d1b565b614be29190615d1b565b608086018051919250614aeb82615e69565b6005856040015160ff16614c089190615d8e565b614c13600584615efd565b614c1e906001615d1b565b614c289190615d1b565b606086018051919250614c3a82615e69565b61ffff169052505b9250839150505b9250929050565b60008383836040516020016149cc93929190615c75565b60c95460ff1615614c8a5760405162461bcd60e51b8152600401610c6b90615b31565b610d9c838383615192565b600081815b8551811015614d47576000868281518110614cc557634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311614d07576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250614d34565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080614d3f81615ec2565b915050614c9a565b509092149392505050565b6001600160a01b038216614da85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c6b565b614db181612fb5565b15614dfd5760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610c6b565b614e0960008383614c67565b6001600160a01b0382166000908152606860205260408120805460019290614e32908490615d1b565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020615f6a833981519152908290a45050565b600054610100900460ff1680614e97575060005460ff16155b614eb35760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff1615801561476f576000805461ffff191661010117905580156120ec576000805461ff001916905550565b600054610100900460ff1680614f01575060005460ff16155b614f1d5760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff16158015614f3f576000805461ffff19166101011790555b8251614f5290606590602086019061542d565b508151614f6690606690602085019061542d565b508015610d9c576000805461ff0019169055505050565b600054610100900460ff1680614f96575060005460ff16155b614fb25760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff16158015614fd4576000805461ffff19166101011790555b60c9805460ff1916905580156120ec576000805461ff001916905550565b600054610100900460ff168061500b575060005460ff16155b6150275760405162461bcd60e51b8152600401610c6b90615b5b565b600054610100900460ff16158015615049576000805461ffff19166101011790555b61476f33614627565b61505c8383614d52565b6150696000848484615085565b610d9c5760405162461bcd60e51b8152600401610c6b90615adf565b60006001600160a01b0384163b1561518757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906150c99033908990889088906004016159fb565b602060405180830381600087803b1580156150e357600080fd5b505af1925050508015615113575060408051601f3d908101601f19168201909252615110918101906157a4565b60015b61516d573d808015615141576040519150601f19603f3d011682016040523d82523d6000602084013e615146565b606091505b5080516151655760405162461bcd60e51b8152600401610c6b90615adf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122d2565b506001949350505050565b6001600160a01b0383166151ed576151e881609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b615210565b816001600160a01b0316836001600160a01b03161461521057615210838261524a565b6001600160a01b03821661522757610d9c816152e7565b826001600160a01b0316826001600160a01b031614610d9c57610d9c82826153c0565b6000600161525784611e2a565b6152619190615ddc565b6000838152609860205260409020549091508082146152b4576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b6099546000906152f990600190615ddc565b6000838152609a60205260408120546099805493945090928490811061532f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806099838154811061535e57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152609a909152604080822084905585825281205560998054806153a457634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006153cb83611e2a565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b82805461543990615e87565b90600052602060002090601f01602090048101928261545b57600085556154a1565b82601f1061547457805160ff19168380011785556154a1565b828001600101855582156154a1579182015b828111156154a1578251825591602001919060010190615486565b506154ad9291506154b1565b5090565b5b808211156154ad57600081556001016154b2565b80356001600160a01b03811681146154dd57600080fd5b919050565b60008083601f8401126154f3578081fd5b5081356001600160401b03811115615509578182fd5b6020830191508360208260051b8501011115614c4957600080fd5b803580151581146154dd57600080fd5b803560ff811681146154dd57600080fd5b600060208284031215615556578081fd5b614126826154c6565b60008060408385031215615571578081fd5b61557a836154c6565b9150615588602084016154c6565b90509250929050565b6000806000606084860312156155a5578081fd5b6155ae846154c6565b92506155bc602085016154c6565b9150604084013590509250925092565b600080600080608085870312156155e1578081fd5b6155ea856154c6565b93506155f8602086016154c6565b92506040850135915060608501356001600160401b03811115615619578182fd5b8501601f81018713615629578182fd5b803561563c61563782615cce565b615c9e565b818152886020838501011115615650578384fd5b81602084016020830137908101602001929092525092959194509250565b60008060408385031215615680578182fd5b615689836154c6565b915061558860208401615524565b600080604083850312156156a9578182fd5b6156b2836154c6565b946020939093013593505050565b600080600080606085870312156156d5578384fd5b6156de856154c6565b93506020850135925060408501356001600160401b038111156156ff578283fd5b61570b878288016154e2565b95989497509550505050565b60008060208385031215615729578182fd5b82356001600160401b0381111561573e578283fd5b61574a858286016154e2565b90969095509350505050565b600060208284031215615767578081fd5b61412682615524565b600060208284031215615781578081fd5b5035919050565b600060208284031215615799578081fd5b813561412681615f53565b6000602082840312156157b5578081fd5b815161412681615f53565b6000602082840312156157d1578081fd5b81516001600160401b038111156157e6578182fd5b8201601f810184136157f6578182fd5b805161580461563782615cce565b818152856020838501011115615818578384fd5b612b79826020830160208601615e3d565b6000806040838503121561583b578182fd5b8235915061558860208401615534565b600080600080600080600060e0888a031215615865578485fd5b8735965061587560208901615534565b955061588360408901615524565b945061589160608901615524565b935061589f60808901615524565b92506158ad60a08901615524565b91506158bb60c08901615524565b905092959891949750929550565b600080600080600080600080610100898b0312156158e5578182fd5b883597506158f560208a01615534565b965061590360408a01615534565b955061591160608a01615534565b945061591f60808a01615534565b935061592d60a08a01615534565b925061593b60c08a01615534565b915061594960e08a01615534565b90509295985092959890939650565b600060208284031215615969578081fd5b61412682615534565b600060208284031215615983578081fd5b81356001600160581b0381168114614126578182fd5b600081518084526159b1816020860160208601615e3d565b601f01601f19169290920160200192915050565b6001600160601b0319606093841b811682529190921b16601482015260280190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615a2e90830184615999565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6080810160028610615a7357634e487b7160e01b600052602160045260246000fd5b9481526001600160a01b0393909316602084015265ffffffffffff91909116604083015264ffffffffff1660609091015290565b6020815260006141266020830184615999565b6020808252600b908201526a1b5a5b9d081b1bd8dad95960aa1b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526007908201526631b432b0ba32b960c91b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600b908201526a19d85b59481c185d5cd95960aa1b604082015260600190565b838152606060208201526000615c8e6060830185615999565b9050826040830152949350505050565b604051601f8201601f191681016001600160401b0381118282101715615cc657615cc6615f3d565b604052919050565b60006001600160401b03821115615ce757615ce7615f3d565b50601f01601f191660200190565b600061ffff808316818516808303821115615d1257615d12615f11565b01949350505050565b60008219821115615d2e57615d2e615f11565b500190565b600060ff821660ff84168060ff03821115615d5057615d50615f11565b019392505050565b60006001600160581b03828116848216808303821115615d1257615d12615f11565b600082615d8957615d89615f27565b500490565b6000816000190483118215151615615da857615da8615f11565b500290565b60006001600160581b0382811684821681151582840482111615615dd357615dd3615f11565b02949350505050565b600082821015615dee57615dee615f11565b500390565b600065ffffffffffff83811690831681811015615e1257615e12615f11565b039392505050565b600060ff821660ff841680821015615e3457615e34615f11565b90039392505050565b60005b83811015615e58578181015183820152602001615e40565b8381111561292c5750506000910152565b600061ffff821680615e7d57615e7d615f11565b6000190192915050565b600181811c90821680615e9b57607f821691505b60208210811415615ebc57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615ed657615ed6615f11565b5060010190565b600060ff821660ff811415615ef457615ef4615f11565b60010192915050565b600082615f0c57615f0c615f27565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146120ec57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204ed681feea016191b7d90f1577c6a6b861cae537abe1263a9d2ed9d90593e94764736f6c63430008040033
Deployed Bytecode Sourcemap
128994:21444:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;150135:193;;;;;;;;;;-1:-1:-1;150135:193:0;;;;;:::i;:::-;;:::i;:::-;;;10786:14:1;;10779:22;10761:41;;10749:2;10734:18;150135:193:0;;;;;;;;23780:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25350:221::-;;;;;;;;;;-1:-1:-1;25350:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24862:422::-;;;;;;;;;;-1:-1:-1;24862:422:0;;;;;:::i;:::-;;:::i;:::-;;131517:126;;;;;;;;;;-1:-1:-1;131517:126:0;;;;;:::i;:::-;;:::i;137667:2469::-;;;;;;;;;;-1:-1:-1;137667:2469:0;;;;;:::i;:::-;;:::i;129397:41::-;;;;;;;;;;;;129428:10;129397:41;;;;;10959:25:1;;;10947:2;10932:18;129397:41:0;10914:76:1;38069:113:0;;;;;;;;;;-1:-1:-1;38157:10:0;:17;38069:113;;129492:41;;;;;;;;;;;;129532:1;129492:41;;26240:339;;;;;;;;;;-1:-1:-1;26240:339:0;;;;;:::i;:::-;;:::i;136628:390::-;;;;;;;;;;-1:-1:-1;136628:390:0;;;;;:::i;:::-;;:::i;129662:36::-;;;;;;;;;;-1:-1:-1;129662:36:0;;;;;;;-1:-1:-1;;;;;129662:36:0;;;;;;-1:-1:-1;;;;;30446:31:1;;;30428:50;;30416:2;30401:18;129662:36:0;30383:101:1;137026:483:0;;;;;;;;;;-1:-1:-1;137026:483:0;;;;;:::i;:::-;;:::i;129777:25::-;;;;;;;;;;;;;;;;37726:267;;;;;;;;;;-1:-1:-1;37726:267:0;;;;;:::i;:::-;;:::i;144075:187::-;;;;;;;;;;-1:-1:-1;144075:187:0;;;;;:::i;:::-;;:::i;145244:142::-;;;:::i;148041:65::-;;;;;;;;;;;;;:::i;133680:299::-;;;;;;;;;;-1:-1:-1;133680:299:0;;;;;:::i;:::-;;:::i;26650:185::-;;;;;;;;;;-1:-1:-1;26650:185:0;;;;;:::i;:::-;;:::i;134533:186::-;;;;;;;;;;-1:-1:-1;134533:186:0;;;;;:::i;:::-;;:::i;38259:244::-;;;;;;;;;;-1:-1:-1;38259:244:0;;;;;:::i;:::-;;:::i;148451:105::-;;;;;;;;;;-1:-1:-1;148451:105:0;;;;;:::i;:::-;;:::i;145394:107::-;;;;;;;;;;-1:-1:-1;145394:107:0;;;;;:::i;:::-;;:::i;44965:86::-;;;;;;;;;;-1:-1:-1;45036:7:0;;;;44965:86;;132498:549;;;;;;:::i;:::-;;:::i;23474:239::-;;;;;;;;;;-1:-1:-1;23474:239:0;;;;;:::i;:::-;;:::i;130786:40::-;;;;;;;;;;-1:-1:-1;130786:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;131651:86;;;;;;;;;;-1:-1:-1;131651:86:0;;;;;:::i;:::-;;:::i;23204:208::-;;;;;;;;;;-1:-1:-1;23204:208:0;;;;;:::i;:::-;;:::i;48078:94::-;;;;;;;;;;;;;:::i;148114:115::-;;;;;;;;;;-1:-1:-1;148114:115:0;;;;;:::i;:::-;;:::i;129745:23::-;;;;;;;;;;-1:-1:-1;129745:23:0;;;;-1:-1:-1;;;;;129745:23:0;;;149694:104;;;;;;;;;;-1:-1:-1;149694:104:0;;;;;:::i;:::-;;:::i;131081:428::-;;;;;;;;;;;;;:::i;147972:61::-;;;;;;;;;;;;;:::i;148237:109::-;;;;;;;;;;-1:-1:-1;148237:109:0;;;;;:::i;:::-;;:::i;47427:87::-;;;;;;;;;;;;;:::i;133205:467::-;;;;;;;;;;-1:-1:-1;133205:467:0;;;;;:::i;:::-;;:::i;129858:46::-;;;;;;;;;;-1:-1:-1;129858:46:0;;;;-1:-1:-1;;;;;129858:46:0;;;23949:104;;;;;;;;;;;;;:::i;136075:545::-;;;;;;;;;;-1:-1:-1;136075:545:0;;;;;:::i;:::-;;:::i;131895:595::-;;;;;;:::i;:::-;;:::i;148665:109::-;;;;;;;;;;-1:-1:-1;148665:109:0;;;;;:::i;:::-;;:::i;25643:295::-;;;;;;;;;;-1:-1:-1;25643:295:0;;;;;:::i;:::-;;:::i;130534:51::-;;;;;;;;;;-1:-1:-1;130534:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;130534:51:0;;-1:-1:-1;;;130534:51:0;;;;;-1:-1:-1;;;130534:51:0;;;;;;;;;;;;;;;;:::i;140144:241::-;;;;;;;;;;-1:-1:-1;140144:241:0;;;;;:::i;:::-;;:::i;130280:39::-;;;;;;;;;;-1:-1:-1;130280:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;130280:39:0;;;;;-1:-1:-1;;;130280:39:0;;;;;-1:-1:-1;;;130280:39:0;;;;;;;;;;30786:4:1;30817:15;;;30799:34;;30869:15;;;30864:2;30849:18;;30842:43;30921:15;;;30901:18;;;30894:43;;;;30973:15;;;30968:2;30953:18;;30946:43;31026:15;;31020:3;31005:19;;30998:44;31079:15;;31073:3;31058:19;;31051:44;31132:15;;;31126:3;31111:19;;31104:44;30763:3;30748:19;130280:39:0;30730:424:1;148564:93:0;;;;;;;;;;-1:-1:-1;148564:93:0;;;;;:::i;:::-;;:::i;135300:187::-;;;;;;;;;;-1:-1:-1;135300:187:0;;;;;:::i;:::-;;:::i;26906:328::-;;;;;;;;;;-1:-1:-1;26906:328:0;;;;;:::i;:::-;;:::i;144432:643::-;;;;;;;;;;-1:-1:-1;144432:643:0;;;;;:::i;:::-;;:::i;129705:33::-;;;;;;;;;;-1:-1:-1;129705:33:0;;;;-1:-1:-1;;;129705:33:0;;-1:-1:-1;;;;;129705:33:0;;;129445:40;;;;;;;;;;;;129481:4;129445:40;;150336:99;;;;;;;;;;-1:-1:-1;150336:99:0;;;;;:::i;:::-;;:::i;148354:89::-;;;;;;;;;;-1:-1:-1;148354:89:0;;;;;:::i;:::-;;:::i;26009:164::-;;;;;;;;;;-1:-1:-1;26009:164:0;;;;;:::i;:::-;;:::i;148782:562::-;;;;;;;;;;-1:-1:-1;148782:562:0;;;;;:::i;:::-;;:::i;48327:192::-;;;;;;;;;;-1:-1:-1;48327:192:0;;;;;:::i;:::-;;:::i;130738:39::-;;;;;;;;;;-1:-1:-1;130738:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;130738:39:0;;;;-1:-1:-1;;;130738:39:0;;;;;-1:-1:-1;;;130738:39:0;;;;;-1:-1:-1;;;130738:39:0;;;;;-1:-1:-1;;;130738:39:0;;;;;;;;;;28123:6:1;28156:15;;;28138:34;;28208:15;;;28203:2;28188:18;;28181:43;28272:4;28260:17;;;28240:18;;;28233:45;;;;28314:15;;;28309:2;28294:18;;28287:43;28367:15;;28361:3;28346:19;;28339:44;28420:15;;28414:3;28399:19;;28392:44;28473:15;;;;28467:3;28452:19;;28445:44;28100:3;28085:19;130738:39:0;28067:428:1;150135:193:0;150260:4;150284:36;150308:11;150284:23;:36::i;:::-;150277:43;150135:193;-1:-1:-1;;150135:193:0:o;23780:100::-;23834:13;23867:5;23860:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23780:100;:::o;25350:221::-;25426:7;25454:16;25462:7;25454;:16::i;:::-;25446:73;;;;-1:-1:-1;;;25446:73:0;;21887:2:1;25446:73:0;;;21869:21:1;21926:2;21906:18;;;21899:30;21965:34;21945:18;;;21938:62;-1:-1:-1;;;22016:18:1;;;22009:42;22068:19;;25446:73:0;;;;;;;;;-1:-1:-1;25539:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25539:24:0;;25350:221::o;24862:422::-;24943:13;24959:34;24985:7;24959:25;:34::i;:::-;24943:50;;25018:5;-1:-1:-1;;;;;25012:11:0;:2;-1:-1:-1;;;;;25012:11:0;;;25004:57;;;;-1:-1:-1;;;25004:57:0;;24094:2:1;25004:57:0;;;24076:21:1;24133:2;24113:18;;;24106:30;24172:34;24152:18;;;24145:62;-1:-1:-1;;;24223:18:1;;;24216:31;24264:19;;25004:57:0;24066:223:1;25004:57:0;17554:10;-1:-1:-1;;;;;25096:21:0;;;;:62;;-1:-1:-1;25121:37:0;25138:5;17554:10;26009:164;:::i;25121:37::-;25074:168;;;;-1:-1:-1;;;25074:168:0;;18511:2:1;25074:168:0;;;18493:21:1;18550:2;18530:18;;;18523:30;18589:34;18569:18;;;18562:62;-1:-1:-1;;;18640:18:1;;;18633:54;18704:19;;25074:168:0;18483:246:1;25074:168:0;25255:21;25264:2;25268:7;25255:8;:21::i;:::-;24862:422;;;:::o;131517:126::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;131591:16:::1;:44:::0;;-1:-1:-1;;;;;;131591:44:0::1;-1:-1:-1::0;;;;;131591:44:0;;;::::1;::::0;;;::::1;::::0;;131517:126::o;137667:2469::-;147530:10;147583:16;;;147644:9;147630:23;;147622:43;;;;-1:-1:-1;;;147622:43:0;;;;;;;:::i;:::-;147684:9;;147676:29;;;;-1:-1:-1;;;147676:29:0;;;;;;;:::i;:::-;137904:31:::1;137938:19:::0;;;:15:::1;:19;::::0;;;;;137904:53;;::::1;::::0;::::1;::::0;;;;;;;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;;137904:53:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;137904:53:0::1;;;;;;;;;::::0;;;;::::1;::::0;::::1;-1:-1:-1::0;;;;;137904:53:0::1;;::::0;::::1;::::0;-1:-1:-1;;;137904:53:0;::::1;;;::::0;;;;-1:-1:-1;;;137904:53:0;::::1;;;::::0;;;;;;-1:-1:-1;;137972:21:0;;:47:::1;::::0;::::1;;;;-1:-1:-1::0;;;137972:47:0::1;;;;;;;;;;137968:245;;;138058:11;138066:2;138058:7;:11::i;:::-;-1:-1:-1::0;;;;;138044:25:0::1;:10;-1:-1:-1::0;;;;;138044:25:0::1;;138036:34;;;::::0;::::1;;137968:245;;;138117:24;138092:21:::0;;:49:::1;::::0;::::1;;;;-1:-1:-1::0;;;138092:49:0::1;;;;;;;;;;138088:125;;;138180:15;:20;;;-1:-1:-1::0;;;;;138166:34:0::1;:10;-1:-1:-1::0;;;;;138166:34:0::1;;138158:43;;;::::0;::::1;;138225:18;138246:10:::0;;;:6:::1;:10;::::0;;;;;;;;138225:31;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;138225:31:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;138225:31:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;138225:31:0;;::::1;::::0;::::1;::::0;;;;138278:13:::1;::::0;::::1;138277:14;138269:41;;;::::0;-1:-1:-1;;;138269:41:0;;24496:2:1;138269:41:0::1;::::0;::::1;24478:21:1::0;24535:2;24515:18;;;24508:30;-1:-1:-1;;;24554:18:1;;;24547:44;24608:18;;138269:41:0::1;24468:164:1::0;138269:41:0::1;138330:10;::::0;::::1;::::0;::::1;;;138329:11;138321:35;;;;-1:-1:-1::0;;;138321:35:0::1;;;;;;;:::i;:::-;138377:13;:31;;;;138394:14;138377:31;:43;;;;138412:8;138377:43;:56;;;;138424:9;138377:56;:69;;;;138437:9;138377:69;138369:95;;;::::0;-1:-1:-1;;;138369:95:0;;20508:2:1;138369:95:0::1;::::0;::::1;20490:21:1::0;20547:2;20527:18;;;20520:30;-1:-1:-1;;;20566:18:1;;;20559:43;20619:18;;138369:95:0::1;20480:163:1::0;138369:95:0::1;138485:21;138493:2;138497:8;138485:7;:21::i;:::-;138477:42;;;::::0;-1:-1:-1;;;138477:42:0;;18936:2:1;138477:42:0::1;::::0;::::1;18918:21:1::0;18975:1;18955:18;;;18948:29;-1:-1:-1;;;18993:18:1;;;18986:38;19041:18;;138477:42:0::1;18908:157:1::0;138477:42:0::1;138551:1;138540:8;:12;;;:29;;;;;138568:1;138556:8;:13;;;;138540:29;138532:54;;;::::0;-1:-1:-1;;;138532:54:0;;20850:2:1;138532:54:0::1;::::0;::::1;20832:21:1::0;20889:2;20869:18;;;20862:30;-1:-1:-1;;;20908:18:1;;;20901:42;20960:18;;138532:54:0::1;20822:162:1::0;138532:54:0::1;138607:22;138620:8;138607:12;:22::i;:::-;138599:46;;;::::0;-1:-1:-1;;;138599:46:0;;23754:2:1;138599:46:0::1;::::0;::::1;23736:21:1::0;23793:2;23773:18;;;23766:30;-1:-1:-1;;;23812:18:1;;;23805:41;23863:18;;138599:46:0::1;23726:161:1::0;138599:46:0::1;138689:1;138666:20;138675:5;:10;;;138666:20;;:8;:20::i;:::-;:24;;;138658:56;;;::::0;-1:-1:-1;;;138658:56:0;;16384:2:1;138658:56:0::1;::::0;::::1;16366:21:1::0;16423:2;16403:18;;;16396:30;-1:-1:-1;;;16442:18:1;;;16435:49;16501:18;;138658:56:0::1;16356:169:1::0;138658:56:0::1;138727:19;::::0;;;:15:::1;:19;::::0;;;;:54;;-1:-1:-1;;;;;138727:54:0::1;-1:-1:-1::0;;;138765:15:0::1;138727:54;;;;::::0;;138850:17:::1;138727:19:::0;138850:13:::1;:17::i;:::-;138880:4;::::0;-1:-1:-1;;;;;138880:4:0::1;:13;138894:10;138906:84;138918:8:::0;138928:13;138943:14;138959:8;138969:9;138980;138906:11:::1;:84::i;:::-;138880:111;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;139004:13;139032;139028:211;;;139072:39;139082:2;139086:8;139096:14;139072:9;:39::i;:::-;139062:49;;139130:17;139139:7;139130:17;;:8;:17::i;:::-;:22;;139151:1;139130:22;139126:102;;;139173:14;139184:2;139173:10;:14::i;:::-;139206:7;;;;;139126:102;139253:14;139249:213;;;139294:40;139304:2;139308:8;139318:15;139294:9;:40::i;:::-;139284:50;;139353:17;139362:7;139353:17;;:8;:17::i;:::-;:22;;139374:1;139353:22;139349:102;;;139396:14;139407:2;139396:10;:14::i;139349:102::-;139476:8;139472:201;;;139511:34;139521:2;139525:8;139535:9;139511;:34::i;:::-;139501:44;;139564:17;139573:7;139564:17;;:8;:17::i;:::-;:22;;139585:1;139564:22;139560:102;;;139607:14;139618:2;139607:10;:14::i;139560:102::-;139687:9;139683:203;;;139723:35;139733:2;139737:8;139747:10;139723:9;:35::i;:::-;139713:45;;139777:17;139786:7;139777:17;;:8;:17::i;:::-;:22;;139798:1;139777:22;139773:102;;;139820:14;139831:2;139820:10;:14::i;139773:102::-;139900:9;139896:203;;;139936:35;139946:2;139950:8;139960:10;139936:9;:35::i;:::-;139926:45;;139990:17;139999:7;139990:17;;:8;:17::i;:::-;:22;;140011:1;139990:22;139986:102;;;140033:14;140044:2;140033:10;:14::i;139986:102::-;140111:17;140125:2;140111:13;:17::i;:::-;147716:1;;;;147775:3:::0;147780:14;147758:37;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;147758:37:0;;;;;;;;;147748:48;;147758:37;147748:48;;;;147730:7;:67;-1:-1:-1;;;;;;;;;137667:2469:0:o;26240:339::-;26435:41;17554:10;26468:7;26435:18;:41::i;:::-;26427:103;;;;-1:-1:-1;;;26427:103:0;;;;;;;:::i;:::-;26543:28;26553:4;26559:2;26563:7;26543:9;:28::i;136628:390::-;136692:7;;136741:24;;:::i;:::-;136793:1;136776:211;136801:15;50771:14;136796:1;:30;136776:211;;136859:18;;;;:15;:18;;;;;;;136848:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;136848:29:0;;;;;;;;;;;;;;;-1:-1:-1;;;136848:29:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;136848:29:0;;;;;;;;;;;-1:-1:-1;;;136848:29:0;;;;;;;;-1:-1:-1;;;136848:29:0;;;;;;;;;;;;;136896:13;;;;;-1:-1:-1;136896:23:0;;;;;;:69;;;;-1:-1:-1;136941:24:0;136923:14;;:42;;;;;;-1:-1:-1;;;136923:42:0;;;;;;;;;;136896:69;136892:83;;;136967:8;;;;:::i;:::-;;;;136892:83;136828:3;;;;:::i;:::-;;;;136776:211;;;-1:-1:-1;137004:6:0;;136628:390;-1:-1:-1;;;136628:390:0:o;137026:483::-;137106:7;;137155:24;;:::i;:::-;137207:1;137190:293;137215:15;50771:14;137210:1;:30;137190:293;;137273:18;;;;:15;:18;;;;;;;137262:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;137262:29:0;;;;;;;;;;;;;;;-1:-1:-1;;;137262:29:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;137262:29:0;;;;;;;;;;;-1:-1:-1;;;137262:29:0;;;;;;;;-1:-1:-1;;;137262:29:0;;;;;;;;;;;;;137310:13;;;;;-1:-1:-1;137310:23:0;;;;;;:69;;;;-1:-1:-1;137355:24:0;137337:14;;:42;;;;;;-1:-1:-1;;;137337:42:0;;;;;;;;;;137310:69;137306:166;;;137414:5;137404:6;:15;137400:29;;;137428:1;-1:-1:-1;137421:8:0;;-1:-1:-1;;137421:8:0;137400:29;137448:8;;;;:::i;:::-;;;;137306:166;137242:3;;;;:::i;:::-;;;;137190:293;;;-1:-1:-1;137500:1:0;;137026:483;-1:-1:-1;;;;;137026:483:0:o;37726:267::-;37823:7;37859:34;37887:5;37859:27;:34::i;:::-;37851:5;:42;37843:98;;;;-1:-1:-1;;;37843:98:0;;13685:2:1;37843:98:0;;;13667:21:1;13724:2;13704:18;;;13697:30;13763:34;13743:18;;;13736:62;-1:-1:-1;;;13814:18:1;;;13807:41;13865:19;;37843:98:0;13657:233:1;37843:98:0;-1:-1:-1;;;;;;37959:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37726:267::o;144075:187::-;144130:4;144151:9;;;144147:26;;-1:-1:-1;144169:4:0;;144075:187;-1:-1:-1;144075:187:0:o;144147:26::-;144233:8;144240:1;144233:4;:8;:::i;:::-;144222:20;;144226:16;;144222:1;:20;:::i;:::-;:31;;144245:8;144222:31;:::i;:::-;144210:9;;:43;;;-1:-1:-1;;;;;144210:9:0;:43;:::i;:::-;-1:-1:-1;;;;;144191:63:0;:15;:63;;144075:187;-1:-1:-1;;144075:187:0:o;145244:142::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;145308:47:::1;::::0;145316:10:::1;::::0;145333:21:::1;145308:47:::0;::::1;;;::::0;::::1;::::0;;;145333:21;145316:10;145308:47;::::1;;;;;;145300:78;;;::::0;-1:-1:-1;;;145300:78:0;;12989:2:1;145300:78:0::1;::::0;::::1;12971:21:1::0;13028:2;13008:18;;;13001:30;-1:-1:-1;;;13047:18:1;;;13040:48;13105:18;;145300:78:0::1;12961:168:1::0;145300:78:0::1;145244:142::o:0;148041:65::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;148088:10:::1;:8;:10::i;133680:299::-:0;147530:10;147583:16;;;147644:9;147630:23;;147622:43;;;;-1:-1:-1;;;147622:43:0;;;;;;;:::i;:::-;147684:9;;147676:29;;;;-1:-1:-1;;;147676:29:0;;;;;;;:::i;:::-;133785:9:::1;::::0;-1:-1:-1;;;;;133785:9:0::1;133767:15;:27;133759:51;;;::::0;-1:-1:-1;;;133759:51:0;;26012:2:1;133759:51:0::1;::::0;::::1;25994:21:1::0;26051:2;26031:18;;;26024:30;-1:-1:-1;;;26070:18:1;;;26063:41;26121:18;;133759:51:0::1;25984:161:1::0;133759:51:0::1;133830:10;::::0;::::1;::::0;::::1;;;133829:11;133821:35;;;;-1:-1:-1::0;;;133821:35:0::1;;;;;;;:::i;:::-;133874:13;133869:103;133893:18:::0;;::::1;133869:103;;;133937:23;133949:3;;133953:5;133949:10;;;;;-1:-1:-1::0;;;133949:10:0::1;;;;;;;;;;;;;;;133937:11;:23::i;:::-;133913:7:::0;::::1;::::0;::::1;:::i;:::-;;;;133869:103;;;;147775:3:::0;147780:14;147758:37;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;147758:37:0;;;;;;;;;147748:48;;147758:37;147748:48;;;;147730:7;:67;-1:-1:-1;;;;133680:299:0:o;26650:185::-;26788:39;26805:4;26811:2;26815:7;26788:39;;;;;;;;;;;;:16;:39::i;134533:186::-;147530:10;147583:16;;;147644:9;147630:23;;147622:43;;;;-1:-1:-1;;;147622:43:0;;;;;;;:::i;:::-;147684:9;;147676:29;;;;-1:-1:-1;;;147676:29:0;;;;;;;:::i;:::-;134613:13:::1;134608:104;134632:18:::0;;::::1;134608:104;;;134676:24;134689:3;;134693:5;134689:10;;;;;-1:-1:-1::0;;;134689:10:0::1;;;;;;;;;;;;;;;134676:12;:24::i;:::-;134652:7:::0;::::1;::::0;::::1;:::i;:::-;;;;134608:104;;38259:244:::0;38334:7;38370:41;38157:10;:17;;38069:113;38370:41;38362:5;:49;38354:106;;;;-1:-1:-1;;;38354:106:0;;25257:2:1;38354:106:0;;;25239:21:1;25296:2;25276:18;;;25269:30;25335:34;25315:18;;;25308:62;-1:-1:-1;;;25386:18:1;;;25379:42;25438:19;;38354:106:0;25229:234:1;38354:106:0;38478:10;38489:5;38478:17;;;;;;-1:-1:-1;;;38478:17:0;;;;;;;;;;;;;;;;;38471:24;;38259:244;;;:::o;148451:105::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;148522:15:::1;:26:::0;;-1:-1:-1;;148522:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;148451:105::o;145394:107::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;145470:4:::1;::::0;:23:::1;::::0;-1:-1:-1;;;145470:23:0;;-1:-1:-1;;;;;145470:4:0;;::::1;::::0;:9:::1;::::0;:23:::1;::::0;145480:3;;145485:7;;145470:23:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;145394:107:::0;;:::o;132498:549::-;147530:10;147583:16;;;147644:9;147630:23;;147622:43;;;;-1:-1:-1;;;147622:43:0;;;;;;;:::i;:::-;147684:9;;147676:29;;;;-1:-1:-1;;;147676:29:0;;;;;;;:::i;:::-;132678:22:::1;::::0;;;::::1;-1:-1:-1::0;;;;;132678:22:0::1;132660:15;:40;132652:64;;;;-1:-1:-1::0;;;132652:64:0::1;;;;;;;:::i;:::-;132745:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;132731:21:0::1;:10;-1:-1:-1::0;;;;;132731:21:0::1;;;:38;;;;;132766:3;132756:7;:13;132731:38;132727:109:::0;132854:39:::1;132862:23;132868:7;132877;132862:5;:23::i;:::-;132887:5;;132854:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;132854:7:0::1;::::0;-1:-1:-1;;;132854:39:0:i:1;:::-;132846:65;;;::::0;-1:-1:-1;;;132846:65:0;;25670:2:1;132846:65:0::1;::::0;::::1;25652:21:1::0;25709:2;25689:18;;;25682:30;-1:-1:-1;;;25728:18:1;;;25721:43;25781:18;;132846:65:0::1;25642:163:1::0;132846:65:0::1;-1:-1:-1::0;;;;;132930:21:0;::::1;;::::0;;;:12:::1;:21;::::0;;;;;:26;132922:53:::1;;;::::0;-1:-1:-1;;;132922:53:0;;27372:2:1;132922:53:0::1;::::0;::::1;27354:21:1::0;27411:2;27391:18;;;27384:30;-1:-1:-1;;;27430:18:1;;;27423:44;27484:18;;132922:53:0::1;27344:164:1::0;132922:53:0::1;-1:-1:-1::0;;;;;132986:21:0;::::1;;::::0;;;:12:::1;:21;::::0;;;;:23;;;::::1;::::0;::::1;:::i;:::-;;;;;;133020:19;133031:7;133020:10;:19::i;:::-;147775:3:::0;147780:14;147758:37;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;147758:37:0;;;;;;;;;147748:48;;147758:37;147748:48;;;;147730:7;:67;-1:-1:-1;;;;;;132498:549:0:o;23474:239::-;23546:7;23582:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23582:16:0;23617:19;23609:73;;;;-1:-1:-1;;;23609:73:0;;19683:2:1;23609:73:0;;;19665:21:1;19722:2;19702:18;;;19695:30;19761:34;19741:18;;;19734:62;-1:-1:-1;;;19812:18:1;;;19805:39;19861:19;;23609:73:0;19655:231:1;131651:86:0;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;131711:4:::1;:18:::0;;-1:-1:-1;;;;;;131711:18:0::1;-1:-1:-1::0;;;;;131711:18:0;;;::::1;::::0;;;::::1;::::0;;131651:86::o;23204:208::-;23276:7;-1:-1:-1;;;;;23304:19:0;;23296:74;;;;-1:-1:-1;;;23296:74:0;;19272:2:1;23296:74:0;;;19254:21:1;19311:2;19291:18;;;19284:30;19350:34;19330:18;;;19323:62;-1:-1:-1;;;19401:18:1;;;19394:40;19451:19;;23296:74:0;19244:232:1;23296:74:0;-1:-1:-1;;;;;;23388:16:0;;;;;:9;:16;;;;;;;23204:208::o;48078:94::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;48143:21:::1;48161:1;48143:9;:21::i;148114:115::-:0;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;148191:22:::1;:30:::0;;-1:-1:-1;;;;;148191:30:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;148191:30:0;;::::1;::::0;;;::::1;::::0;;148114:115::o;149694:104::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;149766:10:::1;:24:::0;149694:104::o;131081:428::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;131133:38:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;131133:38:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;131133:38:0::1;;::::0;:13:::1;:38::i;:::-;131182:25;:23;:25::i;:::-;131218:17;:15;:17::i;:::-;131246:16;:14;:16::i;:::-;131275:15;:22:::0;;-1:-1:-1;;;;;;131387:32:0;-1:-1:-1;;;;;131387:32:0;;;131430:9:::1;:22:::0;;131442:10:::1;-1:-1:-1::0;;;;;;131430:22:0;;::::1;;::::0;;131465:36:::1;::::0;-1:-1:-1;;;131465:36:0;;131478:5:::1;131465:36;::::0;::::1;12144:25:1::0;131485:15:0::1;12185:18:1::0;;;12178:34;131465:7:0::1;::::0;:12:::1;::::0;12117:18:1;;131465:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16543:14:::0;16539:68;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;16539:68;131081:428;:::o;147972:61::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;148017:8:::1;:6;:8::i;148237:109::-:0;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;148311:19:::1;:27:::0;;-1:-1:-1;;;;;148311:27:0;;::::1;-1:-1:-1::0;;;148311:27:0::1;-1:-1:-1::0;;;;;;;;148311:27:0;;::::1;::::0;;;::::1;::::0;;148237:109::o;47427:87::-;47500:6;;-1:-1:-1;;;;;47500:6:0;;47427:87::o;133205:467::-;133261:18;133326:19;;;:15;:19;;;;;;133292:53;;;;;;;;;;133261:18;;133292:53;133326:19;133292:53;;;;;;;;;;-1:-1:-1;;;133292:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;133292:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;133292:53:0;;;;;;;;;-1:-1:-1;;;133292:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;133292:53:0;;;;;;;;;;;;;-1:-1:-1;133397:19:0;;;:15;:19;;;;;;:25;133292:53;;-1:-1:-1;;133371:51:0;;133397:25;;;;133378:15;133371:51;:::i;:::-;133356:66;;;-1:-1:-1;133464:22:0;133439:21;;:47;;;;;;-1:-1:-1;;;133439:47:0;;;;;;;;;;133435:126;;;-1:-1:-1;133516:1:0;;133205:467;-1:-1:-1;;;133205:467:0:o;133435:126::-;133628:6;133596:16;133609:2;133596:12;:16::i;:::-;133588:25;;:4;:25;:::i;:::-;:35;;133616:7;133588:35;:::i;:::-;133586:48;;;;:::i;:::-;133573:61;133205:467;-1:-1:-1;;;;133205:467:0:o;23949:104::-;24005:13;24038:7;24031:14;;;;;:::i;136075:545::-;136130:11;136175:10;;;:6;:10;;;;;;;;136154:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;136154:31:0;;;;;;;;-1:-1:-1;;;136154:31:0;;;;;;;;-1:-1:-1;;;136154:31:0;;;;;;;;;;;136247:20;;:8;:20::i;:::-;:25;;;136243:40;;-1:-1:-1;136281:2:0;;136075:545;-1:-1:-1;;136075:545:0:o;136243:40::-;136302:1;136296:7;;136316:11;136330:25;136339:5;:15;;;136330:25;;:8;:25::i;:::-;136316:39;;;;136370:3;136377:1;136370:8;136366:63;;;136380:9;136387:2;136380:9;;:::i;:::-;;;136366:63;;;136416:1;136409:3;:8;136405:24;;136419:10;136426:3;136419:10;;:::i;:::-;;;136405:24;136458:16;;136449:26;;;;:8;:26::i;:::-;136442:33;;;;;;:::i;:::-;;;136493:20;136502:5;:10;;;136493:20;;:8;:20::i;:::-;136486:27;;;;;;:::i;:::-;;;136531:21;136540:5;:11;;;136531:21;;:8;:21::i;:::-;136524:28;;;;;;:::i;:::-;;;136570:21;136579:5;:11;;;136570:21;;:8;:21::i;:::-;136563:28;;;;;;:::i;131895:595::-;147530:10;147583:16;;;147644:9;147630:23;;147622:43;;;;-1:-1:-1;;;147622:43:0;;;;;;;:::i;:::-;147684:9;;147676:29;;;;-1:-1:-1;;;147676:29:0;;;;;;;:::i;:::-;131967:14:::1;131984:13;38157:10:::0;:17;;38069:113;131984:13:::1;132034:19;::::0;131967:30;;-1:-1:-1;;;;132034:19:0;::::1;-1:-1:-1::0;;;;;132034:19:0::1;132016:15;:37;132008:61;;;;-1:-1:-1::0;;;132008:61:0::1;;;;;;;:::i;:::-;132102:1;132088:11;:15;132080:45;;;::::0;-1:-1:-1;;;132080:45:0;;17820:2:1;132080:45:0::1;::::0;::::1;17802:21:1::0;17859:2;17839:18;;;17832:30;-1:-1:-1;;;17878:18:1;;;17871:47;17935:18;;132080:45:0::1;17792:167:1::0;132080:45:0::1;129532:1;132144:11;:28;;132136:58;;;::::0;-1:-1:-1;;;132136:58:0;;22637:2:1;132136:58:0::1;::::0;::::1;22619:21:1::0;22676:2;22656:18;;;22649:30;-1:-1:-1;;;22695:18:1;;;22688:47;22752:18;;132136:58:0::1;22609:167:1::0;132136:58:0::1;129481:4;132213:20;132222:11:::0;132213:6;:20:::1;:::i;:::-;:33;;132205:55;;;::::0;-1:-1:-1;;;132205:55:0;;26692:2:1;132205:55:0::1;::::0;::::1;26674:21:1::0;26731:1;26711:18;;;26704:29;-1:-1:-1;;;26749:18:1;;;26742:39;26798:18;;132205:55:0::1;26664:158:1::0;132205:55:0::1;132291:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;132277:21:0::1;:10;-1:-1:-1::0;;;;;132277:21:0::1;;132273:106;;132336:18;132343:11:::0;129428:10:::1;132336:18;:::i;:::-;132323:9;:31;;132315:52;;;::::0;-1:-1:-1;;;132315:52:0;;17484:2:1;132315:52:0::1;::::0;::::1;17466:21:1::0;17523:1;17503:18;;;17496:29;-1:-1:-1;;;17541:18:1;;;17534:38;17589:18;;132315:52:0::1;17456:157:1::0;132315:52:0::1;132408:1;132391:92;132416:11;132411:1;:16;132391:92;;132449:22;132460:10;132449;:22::i;:::-;132429:3:::0;::::1;::::0;::::1;:::i;:::-;;;;132391:92;;;;147716:1;147775:3:::0;147780:14;147758:37;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;147758:37:0;;;;;;;;;147748:48;;147758:37;147748:48;;;;147730:7;:67;-1:-1:-1;;;131895:595:0:o;148665:109::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;148742:24:::1;148752:3;148757:8;148742:9;:24::i;:::-;148665:109:::0;;:::o;25643:295::-;-1:-1:-1;;;;;25746:24:0;;17554:10;25746:24;;25738:62;;;;-1:-1:-1;;;25738:62:0;;16030:2:1;25738:62:0;;;16012:21:1;16069:2;16049:18;;;16042:30;-1:-1:-1;;;16088:18:1;;;16081:55;16153:18;;25738:62:0;16002:175:1;25738:62:0;17554:10;25813:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25813:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25813:53:0;;;;;;;;;;25882:48;;10761:41:1;;;25813:42:0;;17554:10;25882:48;;10734:18:1;25882:48:0;;;;;;;25643:295;;:::o;140144:241::-;140210:4;140261:19;;;:15;:19;;;;;;140227:53;;;;;;;;;;140210:4;;140227:53;140261:19;140227:53;;;;;;;;;;-1:-1:-1;;;140227:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;140227:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;140227:53:0;;;;;-1:-1:-1;;;140227:53:0;;;;;;;;-1:-1:-1;;;140227:53:0;;;;;;;;;;-1:-1:-1;140350:26:0;140367:8;140350:16;:26::i;:::-;140298:79;;140316:15;:24;;;140298:42;;:15;:42;;;;:::i;:::-;:79;;140144:241;-1:-1:-1;;;;140144:241:0:o;148564:93::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;148629:10:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;148629:20:0;;::::1;::::0;;;::::1;::::0;;148564:93::o;135300:187::-;147530:10;147583:16;;;147644:9;147630:23;;147622:43;;;;-1:-1:-1;;;147622:43:0;;;;;;;:::i;:::-;147684:9;;147676:29;;;;-1:-1:-1;;;147676:29:0;;;;;;;:::i;:::-;135380:13:::1;135375:105;135399:18:::0;;::::1;135375:105;;;135443:25;135457:3;;135461:5;135457:10;;;;;-1:-1:-1::0;;;135457:10:0::1;;;;;;;;;;;;;;;135443:13;:25::i;:::-;135419:7:::0;::::1;::::0;::::1;:::i;:::-;;;;135375:105;;26906:328:::0;27081:41;17554:10;27114:7;27081:18;:41::i;:::-;27073:103;;;;-1:-1:-1;;;27073:103:0;;;;;;;:::i;:::-;27187:39;27201:4;27207:2;27211:7;27220:5;27187:13;:39::i;:::-;26906:328;;;;:::o;144432:643::-;144518:18;144539:10;;;:6;:10;;;;;;;;144518:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;144492:13;144518:31;;;;;;;-1:-1:-1;;;144518:31:0;;;;;;;;;;;;-1:-1:-1;;;144518:31:0;;;;;;;;-1:-1:-1;;;144518:31:0;;;;;;;;;144587:19;;;:15;:19;;;;;;144560:46;;;;;;;;;;144492:13;;144518:31;;:18;;144560:46;;;;;144518:31;144560:46;;;;;-1:-1:-1;;;144560:46:0;;;;;;;;;;;;;;;-1:-1:-1;;;144560:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;144560:46:0;;;;;-1:-1:-1;;;144560:46:0;;;;;;;;-1:-1:-1;;;144560:46:0;;;;;;;;;;-1:-1:-1;;144641:16:0;144654:2;144641:12;:16::i;:::-;144689;;144765;;144800:11;;;;144830:10;;;;144859:11;;;;144889:10;;;;144918:11;;;;144948:15;;;;144617:41;;-1:-1:-1;;;;;;144689:16:0;;;;:28;;144743:2;;144765:16;144800:11;144830:10;144859:11;144889:10;144689:16;144982:14;;:42;;;;;;-1:-1:-1;;;144982:42:0;;;;;;;;;144689:378;;-1:-1:-1;;;;;;144689:378:0;;;;;;;28889:6:1;28877:19;;;144689:378:0;;;28859:38:1;28916:4;28956:15;;;28936:18;;;28929:43;29008:15;;;28988:18;;;28981:43;29060:15;;;29040:18;;;29033:43;29113:15;;;29092:19;;;29085:44;29166:15;;;29145:19;;;29138:44;29219:15;;29198:19;;;29191:44;29272:15;;29251:19;;;29244:44;144982:42:0;29304:19:1;;;29297:51;29385:15;;29364:19;;;29357:44;28831:19;;144689:378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;144689:378:0;;;;;;;;;;;;:::i;:::-;144669:398;144432:643;-1:-1:-1;;;;;144432:643:0:o;150336:99::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;150404:13:::1;:23:::0;;-1:-1:-1;;150404:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;150336:99::o;148354:89::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;148418:9:::1;:17:::0;;-1:-1:-1;;;;;;148418:17:0::1;-1:-1:-1::0;;;;;148418:17:0;;;::::1;::::0;;;::::1;::::0;;148354:89::o;26009:164::-;-1:-1:-1;;;;;26130:25:0;;;26106:4;26130:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26009:164::o;148782:562::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;149022:18:::1;149043:6;:10;149050:2;149043:10;;;;;;;;;;;149022:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;149082:9;149064:5;:15;;:27;;;;;;;;;::::0;::::1;149121:10;149102:5;:16;;:29;;;;;;;;;::::0;::::1;149155:4;149142:5;:10;;:17;;;;;;;;;::::0;::::1;149183:4;149170:5;:10;;:17;;;;;;;;;::::0;::::1;149212:5;149198;:11;;:19;;;;;;;;;::::0;::::1;149242:5;149228;:11;;:19;;;;;;;;;::::0;::::1;149272:5;149258;:11;;:19;;;;;;;;;::::0;::::1;149301:5;149288:6;:10;149295:2;149288:10;;;;;;;;;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;149319:17;149333:2;149319:13;:17::i;:::-;47718:1;148782:562:::0;;;;;;;;:::o;48327:192::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48416:22:0;::::1;48408:73;;;::::0;-1:-1:-1;;;48408:73:0;;14516:2:1;48408:73:0::1;::::0;::::1;14498:21:1::0;14555:2;14535:18;;;14528:30;14594:34;14574:18;;;14567:62;-1:-1:-1;;;14645:18:1;;;14638:36;14691:19;;48408:73:0::1;14488:228:1::0;48408:73:0::1;48492:19;48502:8;48492:9;:19::i;37385:257::-:0;37509:4;-1:-1:-1;;;;;;37533:61:0;;-1:-1:-1;;;37533:61:0;;:101;;;37598:36;37622:11;37598:23;:36::i;28744:127::-;28809:4;28833:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28833:16:0;:30;;;28744:127::o;32759:185::-;32834:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32834:29:0;-1:-1:-1;;;;;32834:29:0;;;;;;;;:24;;32888:34;32834:24;32888:25;:34::i;:::-;-1:-1:-1;;;;;32879:57:0;;;;;;;;;;;32759:185;;:::o;143754:160::-;143811:5;143833:11;143829:25;;-1:-1:-1;143853:1:0;;143754:160;-1:-1:-1;143754:160:0:o;143829:25::-;129583:1;143879:10;143888:1;143879:6;:10;:::i;:::-;143878:27;;;;:::i;135495:572::-;135549:31;135583:19;;;:15;:19;;;;;;135549:53;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;135549:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;135549:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;135549:53:0;;;;;-1:-1:-1;;;135549:53:0;;;;;;;;-1:-1:-1;;;135549:53:0;;;;;;;;;;-1:-1:-1;;135617:21:0;;:47;;;;;;-1:-1:-1;;;135617:47:0;;;;;;;;;;135613:245;;;135703:11;135711:2;135703:7;:11::i;:::-;-1:-1:-1;;;;;135689:25:0;:10;-1:-1:-1;;;;;135689:25:0;;135681:34;;;;;;135613:245;;;135762:24;135737:21;;:49;;;;;;-1:-1:-1;;;135737:49:0;;;;;;;;;;135733:125;;;135825:15;:20;;;-1:-1:-1;;;;;135811:34:0;:10;-1:-1:-1;;;;;135811:34:0;;135803:43;;;;;;135870:17;135890;135904:2;135890:13;:17::i;:::-;135870:37;-1:-1:-1;135922:14:0;135918:27;;135938:7;;135495:572;:::o;135918:27::-;135957:4;;-1:-1:-1;;;;;135957:4:0;:9;135967:10;135979:17;135993:2;135979:13;:17::i;:::-;135957:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;136008:19:0;;;;-1:-1:-1;;136008:15:0;:19;;-1:-1:-1;136008:19:0;;;:51;;-1:-1:-1;;;;136008:51:0;-1:-1:-1;;;136043:15:0;136008:51;;;;;;135495:572::o;140393:562::-;140602:7;;140657:35;;;;140676:16;;;;:::i;:::-;;;;140657:35;140707:14;140703:36;;;140723:16;;;;:::i;:::-;;;;140703:36;140754:8;140750:30;;;140764:16;;;;:::i;:::-;;;;140750:30;140795:9;140791:31;;;140806:16;;;;:::i;:::-;;;;140791:31;140837:9;140833:31;;;140848:16;;;;:::i;:::-;;;;140833:31;140914:23;140890:15;;;;;;;:5;:15;;;;;:20;140882:55;;140914:23;;;140890:20;;140882:55;:::i;:::-;:65;;140940:7;140882:65;:::i;:::-;140875:72;140393:562;-1:-1:-1;;;;;;;;140393:562:0:o;140963:1257::-;141073:5;141091:12;141106:7;:5;:7::i;:::-;141091:22;;141124:12;141139:43;141158:4;141172;141164:13;;;;;;-1:-1:-1;;;141164:13:0;;;;;;;;;141179:2;141139:18;:43::i;:::-;141220:15;;;;141193:24;141220:15;;;:5;:15;;;;;;;;;141193:42;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;141193:42:0;;;;;;;;;;;;-1:-1:-1;;;141193:42:0;;;;;;;;-1:-1:-1;;;141193:42:0;;;;;;;;-1:-1:-1;;;141193:42:0;;;;;;;;-1:-1:-1;;;141193:42:0;;;;;;;;;;141124:58;;-1:-1:-1;141248:41:0;;;;-1:-1:-1;;;141248:41:0;;16732:2:1;141248:41:0;;;16714:21:1;16771:2;16751:18;;;16744:30;-1:-1:-1;;;16790:18:1;;;16783:40;16840:18;;141248:41:0;16704:160:1;141248:41:0;141303:13;141318:27;141349:24;141358:4;141364:8;141349;:24::i;:::-;141384:18;141405:10;;;:6;:10;;;;;;;;141384:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;141384:31:0;;;;;;;;-1:-1:-1;;;141384:31:0;;;;;;;;-1:-1:-1;;;141384:31:0;;;;;;;;;;141302:71;;-1:-1:-1;141302:71:0;;-1:-1:-1;141430:4:0;:22;;;;;;-1:-1:-1;;;141430:22:0;;;;;;;;;;141426:669;;;141454:25;;;:15;;;:25;141426:669;;;141507:15;141499:4;:23;;;;;;-1:-1:-1;;;141499:23:0;;;;;;;;;;141495:600;;;141524:26;;;;;141495:600;;;141578:9;141570:4;:17;;;;;;-1:-1:-1;;;141570:17:0;;;;;;;;;;141566:529;;;141604:20;;;:10;;;:20;;;141653:2;-1:-1:-1;141639:333:0;;;141676:12;141735:1;141697:35;141716:4;141697:35;;;;;;;;;;;;;-1:-1:-1;;;141697:35:0;;;141730:1;141697:18;:35::i;:::-;:39;;;;:::i;:::-;141676:61;;141756:14;141818:1;141780:35;141799:4;141780:35;;;;;;;;;;;;;-1:-1:-1;;;141780:35:0;;;141813:1;141780:18;:35::i;:::-;:39;;;;:::i;:::-;141779:45;;141823:1;141779:45;:::i;:::-;141857:24;;;;;;;;:15;:24;;;;;:32;;141756:69;;-1:-1:-1;141857:24:0;:32;;;;;;;;-1:-1:-1;;;141857:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;141844:10;;;:45;141922:24;;;;;:15;:24;;;;;;:34;;:24;;:34;;;;;;;-1:-1:-1;;;141922:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;141908:11;;;:48;-1:-1:-1;;141639:333:0;141566:529;;;142001:10;141993:4;:18;;;;;;-1:-1:-1;;;141993:18:0;;;;;;;;;;141989:106;;;142013:21;;;:11;;;:21;141989:106;;;142062:10;142054:4;:18;;;;;;-1:-1:-1;;;142054:18:0;;;;;;;;;;142050:45;;;142074:21;;;:11;;;:21;142050:45;142108:10;;;;:6;:10;;;;;;;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;142108:18:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;142108:18:0;;;;;;;;;-1:-1:-1;;142108:18:0;;;;;;;;;;;;;;-1:-1:-1;;;;142108:18:0;-1:-1:-1;;;142108:18:0;;;;;;;-1:-1:-1;;;;142108:18:0;;-1:-1:-1;;;142108:18:0;;;;;;;;;;;-1:-1:-1;;;;142108:18:0;-1:-1:-1;;;142108:18:0;;;;;;;;;;;;;;142141:13;;;;142137:48;;142156:15;;;;;;;;:5;:15;;;;;;;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;142156:29:0;-1:-1:-1;;;;142156:29:0;;;-1:-1:-1;;;142156:29:0;-1:-1:-1;;;;142156:29:0;;;-1:-1:-1;;;142156:29:0;;;;;-1:-1:-1;;;;142156:29:0;;;-1:-1:-1;;;142156:29:0;-1:-1:-1;;;;142156:29:0;;;;-1:-1:-1;;;142156:29:0;;;;;-1:-1:-1;;;;142156:29:0;;;;;-1:-1:-1;;142156:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;142137:48;-1:-1:-1;142205:7:0;;140963:1257;-1:-1:-1;;;;;;;;140963:1257:0:o;143286:345::-;143366:1;143338:13;143360:8;;;:5;:8;;;:14;143354:25;;-1:-1:-1;;;143360:14:0;;;;143378:1;143354:25;:::i;:::-;:30;;143382:2;143354:30;:::i;:::-;143395:18;143416:10;;;:6;:10;;;;;;;;143395:31;;;;;;;;;;-1:-1:-1;;;143395:31:0;;;;;;;;;;;-1:-1:-1;;;143395:31:0;;;;;;;;;;;143437:25;;;143395:31;;;143437:25;;;143473:26;;;143395:31;;;143510:20;;;-1:-1:-1;143395:31:0;;143541:21;;;143395:31;;;143573:21;;;143605:10;;;;;;;;:18;;;;;;;;;;;;;;;;;-1:-1:-1;;143605:18:0;;;;;;;143395:31;143605:18;;;;;;;;;;;-1:-1:-1;;143605:18:0;143395:31;143605:18;;;;;;;-1:-1:-1;;143605:18:0;;;;;143395:31;143605:18;;;;;;;;-1:-1:-1;;;;143605:18:0;;;;;;;-1:-1:-1;;;;143605:18:0;;;;;;;;;;;;;-1:-1:-1;;;;143605:18:0;-1:-1:-1;;;143605:18:0;;;;;;;;;;;;-1:-1:-1;143286:345:0:o;143639:107::-;143715:10;;;;:6;:10;;;;;;;143694:44;;-1:-1:-1;;;;;;143694:44:0;;;;;12144:25:1;;;;143727:10:0;12185:18:1;;;12178:34;143694:7:0;;:20;;12117:18:1;;143694:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;143639:107;:::o;29038:359::-;29131:4;29156:16;29164:7;29156;:16::i;:::-;29148:73;;;;-1:-1:-1;;;29148:73:0;;17071:2:1;29148:73:0;;;17053:21:1;17110:2;17090:18;;;17083:30;17149:34;17129:18;;;17122:62;-1:-1:-1;;;17200:18:1;;;17193:42;17252:19;;29148:73:0;17043:234:1;29148:73:0;29232:13;29248:34;29274:7;29248:25;:34::i;:::-;29232:50;;29312:5;-1:-1:-1;;;;;29301:16:0;:7;-1:-1:-1;;;;;29301:16:0;;:51;;;;29345:7;-1:-1:-1;;;;;29321:31:0;:20;29333:7;29321:11;:20::i;:::-;-1:-1:-1;;;;;29321:31:0;;29301:51;:87;;;;29356:32;29373:5;29380:7;29356:16;:32::i;32052:589::-;32222:4;-1:-1:-1;;;;;32184:42:0;:34;32210:7;32184:25;:34::i;:::-;-1:-1:-1;;;;;32184:42:0;;32176:96;;;;-1:-1:-1;;;32176:96:0;;23344:2:1;32176:96:0;;;23326:21:1;23383:2;23363:18;;;23356:30;23422:34;23402:18;;;23395:62;-1:-1:-1;;;23473:18:1;;;23466:39;23522:19;;32176:96:0;23316:231:1;32176:96:0;-1:-1:-1;;;;;32291:16:0;;32283:65;;;;-1:-1:-1;;;32283:65:0;;15625:2:1;32283:65:0;;;15607:21:1;15664:2;15644:18;;;15637:30;15703:34;15683:18;;;15676:62;-1:-1:-1;;;15754:18:1;;;15747:34;15798:19;;32283:65:0;15597:226:1;32283:65:0;32361:39;32382:4;32388:2;32392:7;32361:20;:39::i;:::-;32465:29;32482:1;32486:7;32465:8;:29::i;:::-;-1:-1:-1;;;;;32507:15:0;;;;;;:9;:15;;;;;:20;;32526:1;;32507:15;:20;;32526:1;;32507:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32538:13:0;;;;;;:9;:13;;;;;:18;;32555:1;;32538:13;:18;;32555:1;;32538:18;:::i;:::-;;;;-1:-1:-1;;32567:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32567:21:0;-1:-1:-1;;;;;32567:21:0;;;;;;;;;32606:27;;32567:16;;32606:27;;;;-1:-1:-1;;;;;;;;;;;32606:27:0;;32052:589;;;:::o;46024:120::-;45036:7;;;;45560:41;;;;-1:-1:-1;;;45560:41:0;;13336:2:1;45560:41:0;;;13318:21:1;13375:2;13355:18;;;13348:30;-1:-1:-1;;;13394:18:1;;;13387:50;13454:18;;45560:41:0;13308:170:1;45560:41:0;46083:7:::1;:15:::0;;-1:-1:-1;;46083:15:0::1;::::0;;46114:22:::1;17554:10:::0;46123:12:::1;46114:22;;;;;;:::i;:::-;;;;;;;;46024:120::o:0;133987:538::-;134039:31;134073:19;;;:15;:19;;;;;;134039:53;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;134039:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;134039:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;134039:53:0;;;;;-1:-1:-1;;;134039:53:0;;;;;;;;-1:-1:-1;;;134039:53:0;;;;;;;;;;-1:-1:-1;134039:53:0;134111:21;;:49;;;;;;-1:-1:-1;;;134111:49:0;;;;;;;;;;;134103:76;;;;-1:-1:-1;;;134103:76:0;;27029:2:1;134103:76:0;;;27011:21:1;27068:2;27048:18;;;27041:30;-1:-1:-1;;;27087:18:1;;;27080:44;27141:18;;134103:76:0;27001:164:1;134103:76:0;134212:11;134220:2;134212:7;:11::i;:::-;-1:-1:-1;;;;;134198:25:0;:10;-1:-1:-1;;;;;134198:25:0;;134190:47;;;;-1:-1:-1;;;134190:47:0;;22300:2:1;134190:47:0;;;22282:21:1;22339:1;22319:18;;;22312:29;-1:-1:-1;;;22357:18:1;;;22350:39;22406:18;;134190:47:0;22272:158:1;134190:47:0;134250:40;134260:10;134280:4;134287:2;134250:9;:40::i;:::-;134325:192;;;;;;;;;;134356:24;134325:192;;;134446:10;134325:192;;;;;;;;;134409:15;134325:192;;;;;;;;;;134481:24;;;;134325:192;;;;;;;;-1:-1:-1;134303:19:0;;;:15;:19;;;;:214;;;;:19;;-1:-1:-1;;134303:214:0;;;;;;;;;-1:-1:-1;;;134303:214:0;;;;;;;;;;;;;-1:-1:-1;134303:214:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;134303:214:0;-1:-1:-1;;;;;134303:214:0;;;;-1:-1:-1;;;134303:214:0;-1:-1:-1;;;;;;;;;134303:214:0;;;;;;;;;-1:-1:-1;;;;;;134303:214:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;133987:538:0:o;134727:565::-;134780:31;134814:19;;;:15;:19;;;;;;134780:53;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;134780:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;134780:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;134780:53:0;;;;;-1:-1:-1;;;134780:53:0;;;;;;;;-1:-1:-1;;;134780:53:0;;;;;;;;;;-1:-1:-1;;134852:21:0;;:47;;;;;;-1:-1:-1;;;134852:47:0;;;;;;;;;;;134844:76;;;;-1:-1:-1;;;134844:76:0;;15280:2:1;134844:76:0;;;15262:21:1;15319:2;15299:18;;;15292:30;-1:-1:-1;;;15338:18:1;;;15331:46;15394:18;;134844:76:0;15252:166:1;134844:76:0;134953:19;;;;:15;:19;;;;;:24;;;;-1:-1:-1;;;;;134953:24:0;134939:10;:38;134931:47;;;;;;134991:40;135009:4;135016:10;135028:2;134991:9;:40::i;:::-;135042:17;135056:2;135042:13;:17::i;:::-;135094:190;;;;;;;;;;-1:-1:-1;135094:190:0;;149352:152;149424:7;149478;149487;149461:34;;;;;;;;9507:19:1;;;9589:2;9560:15;-1:-1:-1;;;;;;9556:45:1;9551:2;9542:12;;9535:67;9627:2;9618:12;;9497:139;149461:34:0;;;;;;;;;;;;;149451:45;;;;;;149444:52;;149352:152;;;;:::o;149512:174::-;149595:4;149619:59;149649:5;149656:10;;149668:9;149619:29;:59::i;:::-;149612:66;149512:174;-1:-1:-1;;;149512:174:0:o;145509:1218::-;145562:27;:15;50890:19;;50908:1;50890:19;;;50801:127;145562:27;145600:10;145613:25;:15;50771:14;;50679:114;145613:25;145600:38;-1:-1:-1;145753:1:0;;145652:15;;;;;145805:1;145652:15;145834:7;:5;:7::i;:::-;145854:20;145877:8;;:5;:8;;;;;145854:31;;;;;;;145877:8;145854:31;;;;;;;;;;;;;;;;-1:-1:-1;;;145854:31:0;;145877:8;145854:31;;;;;-1:-1:-1;;;145854:31:0;;;;;;;;-1:-1:-1;;;145854:31:0;;;;;;;;-1:-1:-1;;;145854:31:0;;;;;;;;-1:-1:-1;;;145854:31:0;;;;;;;;145920:36;;;;;;;;145854:31;145920:36;;-1:-1:-1;;;145920:36:0;;;;;;;145819:22;;-1:-1:-1;145854:31:0;145911:52;;145920:36;;145819:22;;145953:2;145920:18;:36::i;:::-;145958:4;145911:8;:52::i;:::-;145896:67;;;;;;;;145990:53;145999:37;146018:4;145999:37;;;;;;;;;;;;;-1:-1:-1;;;145999:37:0;;;146033:2;145999:18;:37::i;145990:53::-;145974:69;;;;;;;;146070:53;146079:37;146098:4;146079:37;;;;;;;;;;;;;-1:-1:-1;;;146079:37:0;;;146113:2;146079:18;:37::i;146070:53::-;146054:69;;;;;;;;146141:15;:21;146157:4;146141:21;;;;;;;;;;;;;;;146203:10;146164:49;;:36;146183:4;146164:36;;;;;;;;;;;;;-1:-1:-1;;;146164:36:0;;;146197:2;146164:18;:36::i;:::-;:49;;;;:::i;:::-;146141:74;;;;;;-1:-1:-1;;;146141:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;146134:81;;146234:15;:21;146250:4;146234:21;;;;;;;;;;;;;;;146297:10;146257:50;;:37;146276:4;146257:37;;;;;;;;;;;;;-1:-1:-1;;;146257:37:0;;;146291:2;146257:18;:37::i;:::-;:50;;;;:::i;:::-;146256:56;;146311:1;146256:56;:::i;:::-;146234:79;;;;;;-1:-1:-1;;;146234:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;146226:87;;146326:14;146332:3;146337:2;146326:5;:14::i;:::-;146366:221;;;;;;;;146434:10;146366:221;;;;;;146570:5;146366:221;;;;;;146465:4;146366:221;;;;;;146543:5;146366:221;;;;;;146490:4;146366:221;;;;;;146516:5;146366:221;;;;;;146398:9;146366:221;;;;;146353:6;:10;146360:2;146353:10;;;;;;;;;;;:234;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;146622:97;;;;;;;;146682:22;146622:97;;;;;;-1:-1:-1;;;146622:97:0;;;;;;;;;;;-1:-1:-1;;;;;146622:97:0;;;;;;;;;;;146657:15;146622:97;;;;;;;;;-1:-1:-1;146622:97:0;;;;;;;146600:19;;;:15;:19;;;;;:119;;;;:19;;-1:-1:-1;;146600:119:0;;;;;;;;;-1:-1:-1;;;146600:119:0;;;;;;;;;;;;;-1:-1:-1;146600:119:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;146600:119:0;-1:-1:-1;;;;;146600:119:0;;;;-1:-1:-1;;;146600:119:0;-1:-1:-1;;;;;;;;;146600:119:0;;;;;;;;;-1:-1:-1;;;;;;146600:119:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;145509:1218:0:o;48527:173::-;48602:6;;;-1:-1:-1;;;;;48619:17:0;;;-1:-1:-1;;;;;;48619:17:0;;;;;;;48652:40;;48602:6;;;48619:17;48602:6;;48652:40;;48583:16;;48652:40;48527:173;;:::o;22334:219::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;22433:26:::1;:24;:26::i;:::-;22470:25;:23;:25::i;:::-;22506:39;22530:5;22537:7;22506:23;:39::i;:::-;16543:14:::0;16539:68;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;22334:219;;;:::o;36576:183::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;36643:26:::1;:24;:26::i;:::-;36680:25;:23;:25::i;:::-;36716:35;:33;:35::i;:::-;16543:14:::0;16539:68;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;36576:183;:::o;44634:131::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;44693:26:::1;:24;:26::i;:::-;44730:27;:25;:27::i;47110:129::-:0;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;47168:26:::1;:24;:26::i;:::-;47205;:24;:26::i;45765:118::-:0;45036:7;;;;45290:9;45282:38;;;;-1:-1:-1;;;45282:38:0;;;;;;;:::i;:::-;45825:7:::1;:14:::0;;-1:-1:-1;;45825:14:0::1;45835:4;45825:14;::::0;;45855:20:::1;45862:12;17554:10:::0;;17474:98;29739:110;29815:26;29825:2;29829:7;29815:26;;;;;;;;;;;;:9;:26::i;143922:145::-;144009:15;;143984:7;;144009:15;;144004:30;;-1:-1:-1;144033:1:0;;143922:145;-1:-1:-1;143922:145:0:o;144004:30::-;-1:-1:-1;144052:7:0;;143922:145;-1:-1:-1;143922:145:0:o;28116:315::-;28273:28;28283:4;28289:2;28293:7;28273:9;:28::i;:::-;28320:48;28343:4;28349:2;28353:7;28362:5;28320:22;:48::i;:::-;28312:111;;;;-1:-1:-1;;;28312:111:0;;;;;;;:::i;22791:349::-;22915:4;-1:-1:-1;;;;;;22952:51:0;;-1:-1:-1;;;22952:51:0;;:127;;-1:-1:-1;;;;;;;23020:59:0;;-1:-1:-1;;;23020:59:0;22952:127;:180;;;-1:-1:-1;;;;;;;;;;20971:51:0;;;23096:36;20862:168;147209:177;147347:7;;147301:54;;;147318:10;8972:2:1;8943:15;-1:-1:-1;;;;;;8939:45:1;147301:54:0;;;;8927:58:1;;;;147330:15:0;9001:12:1;;;8994:28;9038:12;;;;9031:28;;;;147301:54:0;;;;;;;;;;9075:12:1;;;;147301:54:0;;;147291:65;;;;;;147209:177::o;146735:226::-;146915:36;;;;;;30162:25:1;;;30203:18;;;30196:34;;;30246:18;;;30239:34;;;146870:7:0;;30135:18:1;;146915:36:0;;;;-1:-1:-1;;146915:36:0;;;;;;;;;146905:47;;146915:36;146905:47;;;;;146735:226;-1:-1:-1;;;;146735:226:0:o;142228:1050::-;-1:-1:-1;;;;;;;;142309:5:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;142344:12:0;142366:8;:14;;;142359:21;;:4;:21;;;;:::i;:::-;142391:14;;;:16;;142344:36;;-1:-1:-1;142391:16:0;;;:::i;:::-;;;;;-1:-1:-1;142487:14:0;;;;142470;;;;142453;;;;142418:10;;142487:14;142453:31;;;:::i;:::-;:48;;;;:::i;:::-;142445:56;;:4;:56;;:78;;;;;142522:1;142505:8;:14;;;:18;;;142445:78;142441:796;;;129583:1;142584:8;:16;;;142603:1;142584:20;;;;:::i;:::-;142583:37;;;;;;:::i;:::-;142555:19;129583:1;142555:4;:19;:::i;:::-;142554:25;;142578:1;142554:25;:::i;:::-;142553:67;;;;:::i;:::-;142636:14;;;:16;;142540:81;;-1:-1:-1;142636:16:0;;;:::i;:::-;;;;;-1:-1:-1;142441:796:0;;;142699:8;:14;;;142682:8;:14;;;:31;;;;:::i;:::-;142674:39;;:4;:39;;:61;;;;;142734:1;142717:8;:14;;;:18;;;142674:61;142670:567;;;129583:1;142796:8;:16;;;142815:1;142796:20;;;;:::i;:::-;142795:37;;;;;;:::i;:::-;142767:19;129583:1;142767:4;:19;:::i;:::-;142766:25;;142790:1;142766:25;:::i;:::-;142765:67;;;;:::i;:::-;142848:14;;;:16;;142752:81;;-1:-1:-1;142848:16:0;;;:::i;142670:567::-;142894:8;:14;;;142886:22;;:4;:22;;:44;;;;;142929:1;142912:8;:14;;;:18;;;142886:44;142882:355;;;129583:1;142991:8;:16;;;143010:1;142991:20;;;;:::i;:::-;142990:37;;;;;;:::i;:::-;142962:19;129583:1;142962:4;:19;:::i;:::-;142961:25;;142985:1;142961:25;:::i;:::-;142960:67;;;;:::i;:::-;143043:14;;;:16;;142947:81;;-1:-1:-1;143043:16:0;;;:::i;142882:355::-;129583:1;143161:8;:16;;;143160:33;;;;;;:::i;:::-;143132:19;129583:1;143132:4;:19;:::i;:::-;143131:25;;143155:1;143131:25;:::i;:::-;143130:63;;;;:::i;:::-;143209:14;;;:16;;143117:77;;-1:-1:-1;143209:16:0;;;:::i;:::-;;;;;-1:-1:-1;143077:160:0;143255:4;-1:-1:-1;143261:8:0;;-1:-1:-1;;142228:1050:0;;;;;;:::o;146969:232::-;147110:7;147166:5;147173:4;147179:11;147155:36;;;;;;;;;;:::i;149806:251::-;45036:7;;;;45290:9;45282:38;;;;-1:-1:-1;;;45282:38:0;;;;;;;:::i;:::-;150004:45:::1;150031:4;150037:2;150041:7;150004:26;:45::i;102466:830::-:0;102591:4;102631;102591;102648:525;102672:5;:12;102668:1;:16;102648:525;;;102706:20;102729:5;102735:1;102729:8;;;;;;-1:-1:-1;;;102729:8:0;;;;;;;;;;;;;;;102706:31;;102774:12;102758;:28;102754:408;;102911:44;;;;;;9255:19:1;;;9290:12;;;9283:28;;;9327:12;;102911:44:0;;;;;;;;;;;;102901:55;;;;;;102886:70;;102754:408;;;103101:44;;;;;;9255:19:1;;;9290:12;;;9283:28;;;9327:12;;103101:44:0;;;;;;;;;;;;103091:55;;;;;;103076:70;;102754:408;-1:-1:-1;102686:3:0;;;;:::i;:::-;;;;102648:525;;;-1:-1:-1;103268:20:0;;;;102466:830;-1:-1:-1;;;102466:830:0:o;30733:382::-;-1:-1:-1;;;;;30813:16:0;;30805:61;;;;-1:-1:-1;;;30805:61:0;;21526:2:1;30805:61:0;;;21508:21:1;;;21545:18;;;21538:30;21604:34;21584:18;;;21577:62;21656:18;;30805:61:0;21498:182:1;30805:61:0;30886:16;30894:7;30886;:16::i;:::-;30885:17;30877:58;;;;-1:-1:-1;;;30877:58:0;;14923:2:1;30877:58:0;;;14905:21:1;14962:2;14942:18;;;14935:30;-1:-1:-1;;;14981:18:1;;;14974:58;15049:18;;30877:58:0;14895:178:1;30877:58:0;30948:45;30977:1;30981:2;30985:7;30948:20;:45::i;:::-;-1:-1:-1;;;;;31006:13:0;;;;;;:9;:13;;;;;:18;;31023:1;;31006:13;:18;;31023:1;;31006:18;:::i;:::-;;;;-1:-1:-1;;31035:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31035:21:0;-1:-1:-1;;;;;31035:21:0;;;;;;;;31074:33;;31035:16;;;-1:-1:-1;;;;;;;;;;;31074:33:0;31035:16;;31074:33;30733:382;;:::o;17403:65::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16539:68;;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;17403:65;:::o;22561:158::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;22670:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;22694:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;;16543:14:::0;16539:68;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;22561:158;;;:::o;44773:92::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;44842:7:::1;:15:::0;;-1:-1:-1;;44842:15:0::1;::::0;;16539:68;;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;44773:92;:::o;47247:99::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;47315:23:::1;17554:10:::0;47315:9:::1;:23::i;30076:321::-:0;30206:18;30212:2;30216:7;30206:5;:18::i;:::-;30257:54;30288:1;30292:2;30296:7;30305:5;30257:22;:54::i;:::-;30235:154;;;;-1:-1:-1;;;30235:154:0;;;;;;;:::i;33509:821::-;33664:4;-1:-1:-1;;;;;33685:13:0;;8747:20;8795:8;33681:642;;33721:83;;-1:-1:-1;;;33721:83:0;;-1:-1:-1;;;;;33721:47:0;;;;;:83;;17554:10;;33783:4;;33789:7;;33798:5;;33721:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33721:83:0;;;;;;;;-1:-1:-1;;33721:83:0;;;;;;;;;;;;:::i;:::-;;;33717:551;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33985:13:0;;33981:272;;34028:60;;-1:-1:-1;;;34028:60:0;;;;;;;:::i;33981:272::-;34203:6;34197:13;34188:6;34184:2;34180:15;34173:38;33717:551;-1:-1:-1;;;;;;33855:62:0;-1:-1:-1;;;33855:62:0;;-1:-1:-1;33848:69:0;;33681:642;-1:-1:-1;34307:4:0;33509:821;;;;;;:::o;39116:589::-;-1:-1:-1;;;;;39322:18:0;;39318:187;;39357:40;39389:7;40543:10;:17;;40516:24;;;;:15;:24;;;;;:44;;;40571:24;;;;;;;;;;;;40439:164;39357:40;39318:187;;;39427:2;-1:-1:-1;;;;;39419:10:0;:4;-1:-1:-1;;;;;39419:10:0;;39415:90;;39446:47;39479:4;39485:7;39446:32;:47::i;:::-;-1:-1:-1;;;;;39519:16:0;;39515:183;;39552:45;39589:7;39552:36;:45::i;39515:183::-;39625:4;-1:-1:-1;;;;;39619:10:0;:2;-1:-1:-1;;;;;39619:10:0;;39615:83;;39646:40;39674:2;39678:7;39646:27;:40::i;41230:999::-;41496:22;41557:1;41521:33;41549:4;41521:27;:33::i;:::-;:37;;;;:::i;:::-;41569:18;41590:26;;;:17;:26;;;;;;41496:62;;-1:-1:-1;41723:28:0;;;41719:328;;-1:-1:-1;;;;;41790:18:0;;41768:19;41790:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41841:30;;;;;;:44;;;41958:30;;:17;:30;;;;;:43;;;41719:328;-1:-1:-1;42143:26:0;;;;:17;:26;;;;;;;;42136:33;;;-1:-1:-1;;;;;42187:18:0;;;;;:12;:18;;;;;:34;;;;;;;42180:41;41230:999::o;42524:1079::-;42802:10;:17;42777:22;;42802:21;;42822:1;;42802:21;:::i;:::-;42834:18;42855:24;;;:15;:24;;;;;;43228:10;:26;;42777:46;;-1:-1:-1;42855:24:0;;42777:46;;43228:26;;;;-1:-1:-1;;;43228:26:0;;;;;;;;;;;;;;;;;43206:48;;43292:11;43267:10;43278;43267:22;;;;;;-1:-1:-1;;;43267:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;43372:28;;;:15;:28;;;;;;;:41;;;43544:24;;;;;43537:31;43579:10;:16;;;;;-1:-1:-1;;;43579:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;42524:1079;;;;:::o;40006:232::-;40091:14;40108:31;40136:2;40108:27;:31::i;:::-;-1:-1:-1;;;;;40150:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;40195:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40006:232:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:391::-;255:8;265:6;319:3;312:4;304:6;300:17;296:27;286:2;;342:6;334;327:22;286:2;-1:-1:-1;370:20:1;;-1:-1:-1;;;;;402:30:1;;399:2;;;452:8;442;435:26;399:2;496:4;488:6;484:17;472:29;;556:3;549:4;539:6;536:1;532:14;524:6;520:27;516:38;513:47;510:2;;;573:1;570;563:12;588:160;653:20;;709:13;;702:21;692:32;;682:2;;738:1;735;728:12;753:156;819:20;;879:4;868:16;;858:27;;848:2;;899:1;896;889:12;914:196;973:6;1026:2;1014:9;1005:7;1001:23;997:32;994:2;;;1047:6;1039;1032:22;994:2;1075:29;1094:9;1075:29;:::i;1115:270::-;1183:6;1191;1244:2;1232:9;1223:7;1219:23;1215:32;1212:2;;;1265:6;1257;1250:22;1212:2;1293:29;1312:9;1293:29;:::i;:::-;1283:39;;1341:38;1375:2;1364:9;1360:18;1341:38;:::i;:::-;1331:48;;1202:183;;;;;:::o;1390:338::-;1467:6;1475;1483;1536:2;1524:9;1515:7;1511:23;1507:32;1504:2;;;1557:6;1549;1542:22;1504:2;1585:29;1604:9;1585:29;:::i;:::-;1575:39;;1633:38;1667:2;1656:9;1652:18;1633:38;:::i;:::-;1623:48;;1718:2;1707:9;1703:18;1690:32;1680:42;;1494:234;;;;;:::o;1733:933::-;1828:6;1836;1844;1852;1905:3;1893:9;1884:7;1880:23;1876:33;1873:2;;;1927:6;1919;1912:22;1873:2;1955:29;1974:9;1955:29;:::i;:::-;1945:39;;2003:38;2037:2;2026:9;2022:18;2003:38;:::i;:::-;1993:48;-1:-1:-1;2088:2:1;2073:18;;2060:32;;-1:-1:-1;2143:2:1;2128:18;;2115:32;-1:-1:-1;;;;;2159:30:1;;2156:2;;;2207:6;2199;2192:22;2156:2;2235:22;;2288:4;2280:13;;2276:27;-1:-1:-1;2266:2:1;;2322:6;2314;2307:22;2266:2;2363;2350:16;2388:48;2404:31;2432:2;2404:31;:::i;:::-;2388:48;:::i;:::-;2459:2;2452:5;2445:17;2499:7;2494:2;2489;2485;2481:11;2477:20;2474:33;2471:2;;;2525:6;2517;2510:22;2471:2;2585;2580;2576;2572:11;2567:2;2560:5;2556:14;2543:45;2608:14;;;2624:2;2604:23;2597:39;;;;-1:-1:-1;1863:803:1;;;;-1:-1:-1;1863:803:1;-1:-1:-1;1863:803:1:o;2671:264::-;2736:6;2744;2797:2;2785:9;2776:7;2772:23;2768:32;2765:2;;;2818:6;2810;2803:22;2765:2;2846:29;2865:9;2846:29;:::i;:::-;2836:39;;2894:35;2925:2;2914:9;2910:18;2894:35;:::i;2940:264::-;3008:6;3016;3069:2;3057:9;3048:7;3044:23;3040:32;3037:2;;;3090:6;3082;3075:22;3037:2;3118:29;3137:9;3118:29;:::i;:::-;3108:39;3194:2;3179:18;;;;3166:32;;-1:-1:-1;;;3027:177:1:o;3209:599::-;3313:6;3321;3329;3337;3390:2;3378:9;3369:7;3365:23;3361:32;3358:2;;;3411:6;3403;3396:22;3358:2;3439:29;3458:9;3439:29;:::i;:::-;3429:39;-1:-1:-1;3515:2:1;3500:18;;3487:32;;-1:-1:-1;3570:2:1;3555:18;;3542:32;-1:-1:-1;;;;;3586:30:1;;3583:2;;;3634:6;3626;3619:22;3583:2;3678:70;3740:7;3731:6;3720:9;3716:22;3678:70;:::i;:::-;3348:460;;;;-1:-1:-1;3767:8:1;-1:-1:-1;;;;3348:460:1:o;3813:457::-;3899:6;3907;3960:2;3948:9;3939:7;3935:23;3931:32;3928:2;;;3981:6;3973;3966:22;3928:2;4013:23;;-1:-1:-1;;;;;4048:30:1;;4045:2;;;4096:6;4088;4081:22;4045:2;4140:70;4202:7;4193:6;4182:9;4178:22;4140:70;:::i;:::-;4229:8;;4114:96;;-1:-1:-1;3918:352:1;-1:-1:-1;;;;3918:352:1:o;4275:190::-;4331:6;4384:2;4372:9;4363:7;4359:23;4355:32;4352:2;;;4405:6;4397;4390:22;4352:2;4433:26;4449:9;4433:26;:::i;4470:190::-;4529:6;4582:2;4570:9;4561:7;4557:23;4553:32;4550:2;;;4603:6;4595;4588:22;4550:2;-1:-1:-1;4631:23:1;;4540:120;-1:-1:-1;4540:120:1:o;4665:255::-;4723:6;4776:2;4764:9;4755:7;4751:23;4747:32;4744:2;;;4797:6;4789;4782:22;4744:2;4841:9;4828:23;4860:30;4884:5;4860:30;:::i;4925:259::-;4994:6;5047:2;5035:9;5026:7;5022:23;5018:32;5015:2;;;5068:6;5060;5053:22;5015:2;5105:9;5099:16;5124:30;5148:5;5124:30;:::i;5189:675::-;5269:6;5322:2;5310:9;5301:7;5297:23;5293:32;5290:2;;;5343:6;5335;5328:22;5290:2;5375:16;;-1:-1:-1;;;;;5403:30:1;;5400:2;;;5451:6;5443;5436:22;5400:2;5479:22;;5532:4;5524:13;;5520:27;-1:-1:-1;5510:2:1;;5566:6;5558;5551:22;5510:2;5600;5594:9;5625:48;5641:31;5669:2;5641:31;:::i;5625:48::-;5696:2;5689:5;5682:17;5736:7;5731:2;5726;5722;5718:11;5714:20;5711:33;5708:2;;;5762:6;5754;5747:22;5708:2;5780:54;5831:2;5826;5819:5;5815:14;5810:2;5806;5802:11;5780:54;:::i;6064:260::-;6130:6;6138;6191:2;6179:9;6170:7;6166:23;6162:32;6159:2;;;6212:6;6204;6197:22;6159:2;6253:9;6240:23;6230:33;;6282:36;6314:2;6303:9;6299:18;6282:36;:::i;6329:604::-;6425:6;6433;6441;6449;6457;6465;6473;6526:3;6514:9;6505:7;6501:23;6497:33;6494:2;;;6548:6;6540;6533:22;6494:2;6589:9;6576:23;6566:33;;6618:36;6650:2;6639:9;6635:18;6618:36;:::i;:::-;6608:46;;6673:35;6704:2;6693:9;6689:18;6673:35;:::i;:::-;6663:45;;6727:35;6758:2;6747:9;6743:18;6727:35;:::i;:::-;6717:45;;6781:36;6812:3;6801:9;6797:19;6781:36;:::i;:::-;6771:46;;6836:36;6867:3;6856:9;6852:19;6836:36;:::i;:::-;6826:46;;6891:36;6922:3;6911:9;6907:19;6891:36;:::i;:::-;6881:46;;6484:449;;;;;;;;;;:::o;6938:685::-;7046:6;7054;7062;7070;7078;7086;7094;7102;7155:3;7143:9;7134:7;7130:23;7126:33;7123:2;;;7177:6;7169;7162:22;7123:2;7218:9;7205:23;7195:33;;7247:36;7279:2;7268:9;7264:18;7247:36;:::i;:::-;7237:46;;7302:36;7334:2;7323:9;7319:18;7302:36;:::i;:::-;7292:46;;7357:36;7389:2;7378:9;7374:18;7357:36;:::i;:::-;7347:46;;7412:37;7444:3;7433:9;7429:19;7412:37;:::i;:::-;7402:47;;7468:37;7500:3;7489:9;7485:19;7468:37;:::i;:::-;7458:47;;7524:37;7556:3;7545:9;7541:19;7524:37;:::i;:::-;7514:47;;7580:37;7612:3;7601:9;7597:19;7580:37;:::i;:::-;7570:47;;7113:510;;;;;;;;;;;:::o;7628:192::-;7685:6;7738:2;7726:9;7717:7;7713:23;7709:32;7706:2;;;7759:6;7751;7744:22;7706:2;7787:27;7804:9;7787:27;:::i;7825:304::-;7883:6;7936:2;7924:9;7915:7;7911:23;7907:32;7904:2;;;7957:6;7949;7942:22;7904:2;7988:23;;-1:-1:-1;;;;;8040:30:1;;8030:41;;8020:2;;8090:6;8082;8075:22;8134:257;8175:3;8213:5;8207:12;8240:6;8235:3;8228:19;8256:63;8312:6;8305:4;8300:3;8296:14;8289:4;8282:5;8278:16;8256:63;:::i;:::-;8373:2;8352:15;-1:-1:-1;;8348:29:1;8339:39;;;;8380:4;8335:50;;8183:208;-1:-1:-1;;8183:208:1:o;8396:341::-;-1:-1:-1;;;;;;8591:2:1;8627:15;;;8623:24;;8611:37;;8682:15;;;;8678:24;8673:2;8664:12;;8657:46;8728:2;8719:12;;8559:178::o;9641:203::-;-1:-1:-1;;;;;9805:32:1;;;;9787:51;;9775:2;9760:18;;9742:102::o;9849:488::-;-1:-1:-1;;;;;10118:15:1;;;10100:34;;10170:15;;10165:2;10150:18;;10143:43;10217:2;10202:18;;10195:34;;;10265:3;10260:2;10245:18;;10238:31;;;10043:4;;10286:45;;10311:19;;10303:6;10286:45;:::i;:::-;10278:53;10052:285;-1:-1:-1;;;;;;10052:285:1:o;10342:274::-;-1:-1:-1;;;;;10534:32:1;;;;10516:51;;10598:2;10583:18;;10576:34;10504:2;10489:18;;10471:145::o;11246:622::-;11476:3;11461:19;;11510:1;11499:13;;11489:2;;11555:10;11550:3;11546:20;11543:1;11536:31;11590:4;11587:1;11580:15;11618:4;11615:1;11608:15;11489:2;11642:25;;;-1:-1:-1;;;;;11703:32:1;;;;11698:2;11683:18;;11676:60;11784:14;11772:27;;;;11767:2;11752:18;;11745:55;11848:12;11836:25;11831:2;11816:18;;;11809:53;11443:425;:::o;12223:219::-;12372:2;12361:9;12354:21;12335:4;12392:44;12432:2;12421:9;12417:18;12409:6;12392:44;:::i;12447:335::-;12649:2;12631:21;;;12688:2;12668:18;;;12661:30;-1:-1:-1;;;12722:2:1;12707:18;;12700:41;12773:2;12758:18;;12621:161::o;13895:414::-;14097:2;14079:21;;;14136:2;14116:18;;;14109:30;14175:34;14170:2;14155:18;;14148:62;-1:-1:-1;;;14241:2:1;14226:18;;14219:48;14299:3;14284:19;;14069:240::o;17964:340::-;18166:2;18148:21;;;18205:2;18185:18;;;18178:30;-1:-1:-1;;;18239:2:1;18224:18;;18217:46;18295:2;18280:18;;18138:166::o;19891:410::-;20093:2;20075:21;;;20132:2;20112:18;;;20105:30;20171:34;20166:2;20151:18;;20144:62;-1:-1:-1;;;20237:2:1;20222:18;;20215:44;20291:3;20276:19;;20065:236::o;20989:330::-;21191:2;21173:21;;;21230:1;21210:18;;;21203:29;-1:-1:-1;;;21263:2:1;21248:18;;21241:37;21310:2;21295:18;;21163:156::o;22781:356::-;22983:2;22965:21;;;23002:18;;;22995:30;23061:34;23056:2;23041:18;;23034:62;23128:2;23113:18;;22955:182::o;24637:413::-;24839:2;24821:21;;;24878:2;24858:18;;;24851:30;24917:34;24912:2;24897:18;;24890:62;-1:-1:-1;;;24983:2:1;24968:18;;24961:47;25040:3;25025:19;;24811:239::o;26150:335::-;26352:2;26334:21;;;26391:2;26371:18;;;26364:30;-1:-1:-1;;;26425:2:1;26410:18;;26403:41;26476:2;26461:18;;26324:161::o;29594:361::-;29799:6;29788:9;29781:25;29842:2;29837;29826:9;29822:18;29815:30;29762:4;29862:44;29902:2;29891:9;29887:18;29879:6;29862:44;:::i;:::-;29854:52;;29942:6;29937:2;29926:9;29922:18;29915:34;29771:184;;;;;;:::o;31159:275::-;31230:2;31224:9;31295:2;31276:13;;-1:-1:-1;;31272:27:1;31260:40;;-1:-1:-1;;;;;31315:34:1;;31351:22;;;31312:62;31309:2;;;31377:18;;:::i;:::-;31413:2;31406:22;31204:230;;-1:-1:-1;31204:230:1:o;31439:186::-;31487:4;-1:-1:-1;;;;;31509:30:1;;31506:2;;;31542:18;;:::i;:::-;-1:-1:-1;31608:2:1;31587:15;-1:-1:-1;;31583:29:1;31614:4;31579:40;;31496:129::o;31630:224::-;31669:3;31697:6;31730:2;31727:1;31723:10;31760:2;31757:1;31753:10;31791:3;31787:2;31783:12;31778:3;31775:21;31772:2;;;31799:18;;:::i;:::-;31835:13;;31677:177;-1:-1:-1;;;;31677:177:1:o;31859:128::-;31899:3;31930:1;31926:6;31923:1;31920:13;31917:2;;;31936:18;;:::i;:::-;-1:-1:-1;31972:9:1;;31907:80::o;31992:204::-;32030:3;32066:4;32063:1;32059:12;32098:4;32095:1;32091:12;32133:3;32127:4;32123:14;32118:3;32115:23;32112:2;;;32141:18;;:::i;:::-;32177:13;;32038:158;-1:-1:-1;;;32038:158:1:o;32201:236::-;32240:3;-1:-1:-1;;;;;32306:10:1;;;32336;;;32366:12;;;32358:21;;32355:2;;;32382:18;;:::i;32442:120::-;32482:1;32508;32498:2;;32513:18;;:::i;:::-;-1:-1:-1;32547:9:1;;32488:74::o;32567:168::-;32607:7;32673:1;32669;32665:6;32661:14;32658:1;32655:21;32650:1;32643:9;32636:17;32632:45;32629:2;;;32680:18;;:::i;:::-;-1:-1:-1;32720:9:1;;32619:116::o;32740:270::-;32779:7;-1:-1:-1;;;;;32849:10:1;;;32879;;;32912:11;;32905:19;32934:12;;;32926:21;;32901:47;32898:2;;;32951:18;;:::i;:::-;32991:13;;32791:219;-1:-1:-1;;;;32791:219:1:o;33015:125::-;33055:4;33083:1;33080;33077:8;33074:2;;;33088:18;;:::i;:::-;-1:-1:-1;33125:9:1;;33064:76::o;33145:225::-;33184:4;33213:14;33277:10;;;;33247;;33299:12;;;33296:2;;;33314:18;;:::i;:::-;33351:13;;33193:177;-1:-1:-1;;;33193:177:1:o;33375:195::-;33413:4;33450;33447:1;33443:12;33482:4;33479:1;33475:12;33507:3;33502;33499:12;33496:2;;;33514:18;;:::i;:::-;33551:13;;;33422:148;-1:-1:-1;;;33422:148:1:o;33575:258::-;33647:1;33657:113;33671:6;33668:1;33665:13;33657:113;;;33747:11;;;33741:18;33728:11;;;33721:39;33693:2;33686:10;33657:113;;;33788:6;33785:1;33782:13;33779:2;;;-1:-1:-1;;33823:1:1;33805:16;;33798:27;33628:205::o;33838:181::-;33876:3;33920:6;33913:5;33909:18;33946:7;33936:2;;33957:18;;:::i;:::-;-1:-1:-1;;33993:20:1;;33884:135;-1:-1:-1;;33884:135:1:o;34024:380::-;34103:1;34099:12;;;;34146;;;34167:2;;34221:4;34213:6;34209:17;34199:27;;34167:2;34274;34266:6;34263:14;34243:18;34240:38;34237:2;;;34320:10;34315:3;34311:20;34308:1;34301:31;34355:4;34352:1;34345:15;34383:4;34380:1;34373:15;34237:2;;34079:325;;;:::o;34409:135::-;34448:3;-1:-1:-1;;34469:17:1;;34466:2;;;34489:18;;:::i;:::-;-1:-1:-1;34536:1:1;34525:13;;34456:88::o;34549:175::-;34586:3;34630:4;34623:5;34619:16;34659:4;34650:7;34647:17;34644:2;;;34667:18;;:::i;:::-;34716:1;34703:15;;34594:130;-1:-1:-1;;34594:130:1:o;34729:112::-;34761:1;34787;34777:2;;34792:18;;:::i;:::-;-1:-1:-1;34826:9:1;;34767:74::o;34846:127::-;34907:10;34902:3;34898:20;34895:1;34888:31;34938:4;34935:1;34928:15;34962:4;34959:1;34952:15;34978:127;35039:10;35034:3;35030:20;35027:1;35020:31;35070:4;35067:1;35060:15;35094:4;35091:1;35084:15;35110:127;35171:10;35166:3;35162:20;35159:1;35152:31;35202:4;35199:1;35192:15;35226:4;35223:1;35216:15;35242:131;-1:-1:-1;;;;;;35316:32:1;;35306:43;;35296:2;;35363:1;35360;35353:12
Swarm Source
ipfs://4ed681feea016191b7d90f1577c6a6b861cae537abe1263a9d2ed9d90593e947
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.