ERC-721
Overview
Max Total Supply
2,419 LURK
Holders
202
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 LURKLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LurkDrop
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-04 */ // Sources flattened with hardhat v2.8.4 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File contracts/interfaces/IMintClubIncinerator.sol pragma solidity ^0.8.0; interface IMintClubIncinerator { function burnGoldTokens(address _tokenOwner, uint256 _qty) external; function burnBasicTokens(address _tokenOwner, uint256 _qty) external; } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721URIStorage: URI query for nonexistent token" ); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require( _exists(tokenId), "ERC721URIStorage: URI set of nonexistent token" ); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) 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 Counters { 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/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) 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 MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File contracts/LurkDrop.sol pragma solidity ^0.8.0; contract LurkDrop is ERC721URIStorage, ERC721Enumerable, Ownable { using SafeMath for uint256; using Strings for uint256; using Counters for Counters.Counter; Counters.Counter private _tokenIds; string public baseExtension = ".json"; string public baseURI = ""; uint256 public MAX_TOKEN_SUPPLY = 5000; bool isSpawnPeriod = false; uint256 public currentMintStage = 0; uint256 public currentMintStageLimit = 0; uint256 public currentMintStageLimitPerWallet = 0; uint256 public currentMintStageRate = 0; bool public currrentStageIsPublic = false; bytes32 public currentMintStageMerkleRoot; uint256 public currentLimitPerWalletCounter = 0; uint256 public currentMintStageOpeningTime = 0; uint256 public currentMintStageClosingTime = 0; uint256 public currentSpawnPeriod = 0; uint256 public currentSpawnOpeningTime = 0; uint256 public currentSpawnClosingTime = 0; uint256 public currentSpawnRate = 0; uint256 private discountPerBasicTokenBurn = 2 * 10**16; uint256 private goldTokenCountForFreeMint = 2; mapping(uint256 => mapping(uint256 => bool)) public spawnClaimList; mapping(uint256 => mapping(uint256 => bool)) public recentlySpawnList; mapping(uint256 => mapping(address => uint256)) public walletMintCount; address public lurkAddress = 0x298e30553c179969C8F9eA80e5918E82EF8d1a38; address public remixAddress = 0xbda1E2757f9A8973926120F6977756B2468B79bb; address public devAddress = 0x2412C008ED3CAaBfBD2bF9Ee73D9fDB6F2180A21; address public INCINERATOR_CONTRACT_ADDRESS; uint256 private constant BATCH_LIMIT = 20; uint256 private mintLurkPct = 60; uint256 private mintRemixPct = 34; uint256 private mintDevPct = 6; uint256 private spawnLurkPct = 40; uint256 private spawnRemixPct = 54; uint256 private spawnDevPct = 6; event SetMintStage( uint256 indexed _stage, uint256 _stageLimit, uint256 _stageLimitPerWallet, uint256 _rate, uint256 _openingTime, uint256 _closingTIme ); event SetSpawnPeriod( uint256 indexed _spawnPeriod, uint256 _openingTime, uint256 _closingTime, uint256 _spawnRate ); event Claim(address indexed _recipient, uint256 _tokenId, uint256 _stage); event Spawn(address indexed _recipient, uint256 _spawner, uint256 _spawned); event SpawnGiveaway(address indexed _recipient, uint256 _spawned); event PaymentSplit(uint256 _lurk, uint256 _remix, uint256 _dev); constructor(address _incineratorAddress) ERC721("Lurk Drop", "LURK") { INCINERATOR_CONTRACT_ADDRESS = _incineratorAddress; } function tokenURI(uint256 _tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { require(_tokenId > 0, "URI requested for invalid token"); return bytes(baseURI).length > 0 ? string( abi.encodePacked( baseURI, _tokenId.toString(), baseExtension ) ) : baseURI; } function setBaseURI(string memory _baseURI) public onlyOwner { baseURI = _baseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function setMintStage( uint256 _stage, uint256 _stageLimit, uint256 _stageLimitPerWallet, uint256 _rate, uint256 _openingTime, uint256 _closingTime, bytes32 _whitelistMerkleRoot, bool _isPublic, bool _resetClaimCounter ) public onlyOwner { require(_stage != currentMintStage, "LURK: Stage same as previous"); require(_openingTime < _closingTime, "LURK: Invalid duration"); currentMintStage = _stage; currentMintStageLimit = _stageLimit; currentMintStageLimitPerWallet = _stageLimitPerWallet; currentMintStageRate = _rate; currentMintStageMerkleRoot = _whitelistMerkleRoot; currentMintStageOpeningTime = _openingTime; currentMintStageClosingTime = _closingTime; currrentStageIsPublic = _isPublic; if (_resetClaimCounter) { currentLimitPerWalletCounter = currentLimitPerWalletCounter + 1; } emit SetMintStage( _stage, _stageLimit, _stageLimitPerWallet, _rate, _openingTime, _closingTime ); } function setSpawnPeriod( uint256 _openingTime, uint256 _closingTime, uint256 _rate ) public onlyOwner { require(_openingTime < _closingTime, "LURK: Invalid duration"); isSpawnPeriod = true; currentSpawnPeriod = currentSpawnPeriod + 1; currentSpawnOpeningTime = _openingTime; currentSpawnClosingTime = _closingTime; currentSpawnRate = _rate; emit SetSpawnPeriod( currentSpawnPeriod, _openingTime, _closingTime, _rate ); } function isClaimOpen() public view returns (bool) { return block.timestamp >= currentMintStageOpeningTime && block.timestamp <= currentMintStageClosingTime; } function isSpawnOpen() public view returns (bool) { return block.timestamp >= currentSpawnOpeningTime && block.timestamp <= currentSpawnClosingTime; } function spawn(uint256[] calldata _ids) public payable { address sender = msg.sender; uint256 sentAmount = msg.value; uint256 requiredPayment = currentSpawnRate.mul(_ids.length); require(_ids.length <= BATCH_LIMIT, "LURK: Batch more than limit"); require(isSpawnOpen(), "LURK: Spawn Not Open"); require( sentAmount >= requiredPayment, "LURK: Payment amount not enough" ); for (uint256 i = 0; i < _ids.length; i++) { address tokenOwner = ownerOf(_ids[i]); require(tokenOwner == sender, "LURK: Sender is not owner"); require( recentlySpawnList[currentSpawnPeriod][_ids[i]] == false, "LURK: Has just been spawned" ); require( spawnClaimList[currentSpawnPeriod][_ids[i]] == false, "LURK: Has already spawned" ); uint256 spawnedTokenId = mint(sender); spawnClaimList[currentSpawnPeriod][_ids[i]] = true; recentlySpawnList[currentSpawnPeriod][spawnedTokenId] = true; emit Spawn(sender, _ids[i], spawnedTokenId); } } function claim(bytes32[] calldata _merkleProof, uint256 _mintAmount) public payable { uint256 requiredPayment = _mintAmount.mul(currentMintStageRate); _verifyClaim(_merkleProof, _mintAmount, requiredPayment); _claim(_mintAmount); } function _verifyClaim( bytes32[] calldata _merkleProof, uint256 _mintAmount, uint256 _requiredpayment ) private { address sender = msg.sender; uint256 sentAmount = msg.value; uint256 mintCount = walletMintCount[currentLimitPerWalletCounter][ sender ]; require( _mintAmount > 0 && _mintAmount <= BATCH_LIMIT, "LURK: Mint Amount invalid" ); require(isSpawnPeriod == false, "LURK: Spawn Started"); require(isClaimOpen(), "LURK: Claim Not Open"); if (!currrentStageIsPublic) { require( tokensMinted().add(_mintAmount) <= currentMintStageLimit, "LURK: Reached Mint Stage Limit" ); require( currentMintStageLimitPerWallet == 0 || mintCount.add(_mintAmount) <= currentMintStageLimitPerWallet, "LURK: Reached Mint Wallet Limit" ); bytes32 leaf = keccak256(abi.encodePacked(sender)); require( MerkleProof.verify( _merkleProof, currentMintStageMerkleRoot, leaf ), "LURK: Not in whitelist" ); } require( sentAmount >= _requiredpayment, "LURK: Payment amount not enough" ); } function _claim(uint256 _mintAmount) private { address sender = msg.sender; uint256 mintCount = walletMintCount[currentLimitPerWalletCounter][ sender ]; for (uint256 i = 0; i < _mintAmount; i++) { uint256 tokenId = mint(sender); emit Claim(sender, tokenId, currentMintStage); } walletMintCount[currentLimitPerWalletCounter][sender] = mintCount.add( _mintAmount ); } function claimWithBurn( bytes32[] calldata _merkleProof, uint256 _numGoldTokens, uint256 _numBasicTokens, uint256 _mintAmount ) public payable { uint256 tokensToMint; uint256 requiredPayment = 0; require( _numGoldTokens > 0 || _numBasicTokens > 0, "LURK: Tokens required to mint" ); if (_numGoldTokens > 0) { require( _numGoldTokens % 2 == 0, "LURK: Gold must be multiple of 2" ); tokensToMint = _numGoldTokens / 2; } else { require(_mintAmount > 0, "LURK: Mint Amount invalid"); uint256 discountRate = _numBasicTokens.mul( discountPerBasicTokenBurn ); requiredPayment = _mintAmount.mul(currentMintStageRate); tokensToMint = _mintAmount; require(discountRate <= requiredPayment, "LURK: Discount invalid"); requiredPayment = requiredPayment.sub(discountRate); } _verifyClaim(_merkleProof, tokensToMint, requiredPayment); _incinerateTokens(_numGoldTokens, _numBasicTokens); _claim(tokensToMint); } function _incinerateTokens(uint256 _numGoldTokens, uint256 _numBasicTokens) private { IMintClubIncinerator incineratorContract = IMintClubIncinerator( INCINERATOR_CONTRACT_ADDRESS ); if (_numGoldTokens > 0) { incineratorContract.burnGoldTokens(msg.sender, _numGoldTokens); } else { incineratorContract.burnBasicTokens(msg.sender, _numBasicTokens); } } function splitPayment() public { uint256 contractBalance = address(this).balance; uint256 lurkPct = mintLurkPct; uint256 remixPct = mintRemixPct; if (isSpawnPeriod) { lurkPct = spawnLurkPct; remixPct = spawnRemixPct; } uint256 lurkSplit = contractBalance.mul(lurkPct).div(100); _sendSplit(lurkAddress, lurkSplit); uint256 remixSplit = contractBalance.mul(remixPct).div(100); _sendSplit(remixAddress, remixSplit); uint256 devSplit = address(this).balance; _sendSplit(devAddress, devSplit); emit PaymentSplit(lurkSplit, remixSplit, devSplit); } function _sendSplit(address _recipient, uint256 value) private { address payable recipient = payable(_recipient); Address.sendValue(recipient, value); } function mint(address recipient) private returns (uint256) { require( _tokenIds.current() < MAX_TOKEN_SUPPLY, "LURK: Max Supply reached" ); _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); _mint(recipient, newItemId); return newItemId; } function burn(uint256 tokenId) public { _burn(tokenId); } function batchAirdrop(address[] calldata _recipients, bool _isSpawnGiveaway) public onlyOwner { require( _recipients.length <= BATCH_LIMIT, "LURK: Batch more than limit" ); if (_isSpawnGiveaway) { require(isSpawnPeriod == true, "LURK: Spawn Not Started"); } for (uint256 i = 0; i < _recipients.length; i++) { uint256 tokenId = mint(_recipients[i]); if (_isSpawnGiveaway) { spawnClaimList[currentSpawnPeriod][tokenId] = true; recentlySpawnList[currentSpawnPeriod][tokenId] = true; emit SpawnGiveaway(_recipients[i], tokenId); } else { emit Claim(_recipients[i], tokenId, currentMintStage); } } } function tokensMinted() public view returns (uint256) { return _tokenIds.current(); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_incineratorAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_stage","type":"uint256"}],"name":"Claim","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":"uint256","name":"_lurk","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_remix","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_dev","type":"uint256"}],"name":"PaymentSplit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_stage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_stageLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_stageLimitPerWallet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_openingTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_closingTIme","type":"uint256"}],"name":"SetMintStage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_spawnPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_openingTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_closingTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_spawnRate","type":"uint256"}],"name":"SetSpawnPeriod","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_spawner","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_spawned","type":"uint256"}],"name":"Spawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_spawned","type":"uint256"}],"name":"SpawnGiveaway","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"INCINERATOR_CONTRACT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKEN_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"bool","name":"_isSpawnGiveaway","type":"bool"}],"name":"batchAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_numGoldTokens","type":"uint256"},{"internalType":"uint256","name":"_numBasicTokens","type":"uint256"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"claimWithBurn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"currentLimitPerWalletCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMintStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMintStageClosingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMintStageLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMintStageLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMintStageMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMintStageOpeningTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMintStageRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSpawnClosingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSpawnOpeningTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSpawnPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSpawnRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currrentStageIsPublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSpawnOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lurkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"recentlySpawnList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remixAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stage","type":"uint256"},{"internalType":"uint256","name":"_stageLimit","type":"uint256"},{"internalType":"uint256","name":"_stageLimitPerWallet","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"uint256","name":"_openingTime","type":"uint256"},{"internalType":"uint256","name":"_closingTime","type":"uint256"},{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"},{"internalType":"bool","name":"_isPublic","type":"bool"},{"internalType":"bool","name":"_resetClaimCounter","type":"bool"}],"name":"setMintStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_openingTime","type":"uint256"},{"internalType":"uint256","name":"_closingTime","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setSpawnPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"spawn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"spawnClaimList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"splitPayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"walletMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040526005608081905264173539b7b760d91b60a09081526200002891600d919062000261565b506040805160208101918290526000908190526200004991600e9162000261565b50611388600f556010805460ff199081169091556000601181905560128190556013819055601481905560158054909216909155601781905560188190556019819055601a819055601b819055601c819055601d5566470de4df820000601e556002601f55602380546001600160a01b031990811673298e30553c179969c8f9ea80e5918e82ef8d1a381790915560248054821673bda1e2757f9a8973926120f6977756b2468b79bb17905560258054909116732412c008ed3caabfbd2bf9ee73d9fdb6f2180a21179055603c6027556022602890815560066029819055602a919091556036602b55602c553480156200014257600080fd5b5060405162003cd838038062003cd8833981016040819052620001659162000307565b604080518082018252600981526804c75726b2044726f760bc1b6020808301918252835180850190945260048452634c55524b60e01b908401528151919291620001b29160009162000261565b508051620001c890600190602084019062000261565b505050620001e5620001df6200020b60201b60201c565b6200020f565b602680546001600160a01b0319166001600160a01b039290921691909117905562000376565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200026f9062000339565b90600052602060002090601f016020900481019282620002935760008555620002de565b82601f10620002ae57805160ff1916838001178555620002de565b82800160010185558215620002de579182015b82811115620002de578251825591602001919060010190620002c1565b50620002ec929150620002f0565b5090565b5b80821115620002ec5760008155600101620002f1565b6000602082840312156200031a57600080fd5b81516001600160a01b03811681146200033257600080fd5b9392505050565b600181811c908216806200034e57607f821691505b602082108114156200037057634e487b7160e01b600052602260045260246000fd5b50919050565b61395280620003866000396000f3fe60806040526004361061034f5760003560e01c806370a08231116101c6578063c50afe08116100f7578063da3ef23f11610095578063e6525b371161006f578063e6525b3714610932578063e985e9c514610952578063f2fde38b1461099b578063f7e85771146109bb57600080fd5b8063da3ef23f146108dc578063db9b0bcd146108fc578063e489d5101461091c57600080fd5b8063c9ce60ee116100d1578063c9ce60ee14610880578063ce20618014610896578063cef8a4c3146108a9578063d922f37b146108bc57600080fd5b8063c50afe0814610835578063c66828621461084b578063c87b56dd1461086057600080fd5b80639727834d11610164578063a22cb4651161013e578063a22cb465146107bf578063ae0cb910146107df578063b88d4fde146107ff578063be197ea51461081f57600080fd5b80639727834d1461075b5780639781398014610771578063a03a8584146107a957600080fd5b806377aeedc1116101a057806377aeedc1146106d75780637de73c53146106ed5780638da5cb5b1461072857806395d89b411461074657600080fd5b806370a082311461068c578063715018a6146106ac578063772cac46146106c157600080fd5b80633b439351116102a05780634fc63e341161023e57806365da97aa1161021857806365da97aa146106365780636c0360eb1461064c5780636de9f32b146106615780636f5d09041461067657600080fd5b80634fc63e34146105e057806355f804b3146105f65780636352211e1461061657600080fd5b806342842e0e1161027a57806342842e0e1461054757806342966c681461056757806345a123b4146105875780634f6ccce7146105c057600080fd5b80633b4393511461050457806340ddfb921461051757806341dde1601461052d57600080fd5b806323b872dd1161030d5780632f745c59116102e75780632f745c591461048f578063325cf9e6146104af5780633881352b146104c45780633ad10ef6146104e457600080fd5b806323b872dd1461044457806324fd2652146104645780632c335e2e1461047957600080fd5b8062514ddc1461035457806301ffc9a71461039157806306fdde03146103c1578063081812fc146103e3578063095ea7b31461040357806318160ddd14610425575b600080fd5b34801561036057600080fd5b50602354610374906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561039d57600080fd5b506103b16103ac3660046133fb565b6109d0565b6040519015158152602001610388565b3480156103cd57600080fd5b506103d66109e1565b60405161038891906136b5565b3480156103ef57600080fd5b506103746103fe36600461347e565b610a73565b34801561040f57600080fd5b5061042361041e366004613295565b610b0d565b005b34801561043157600080fd5b506009545b604051908152602001610388565b34801561045057600080fd5b5061042361045f3660046131b3565b610c23565b34801561047057600080fd5b506103b1610c54565b34801561048557600080fd5b5061043660125481565b34801561049b57600080fd5b506104366104aa366004613295565b610c6f565b3480156104bb57600080fd5b50610423610d05565b3480156104d057600080fd5b50602654610374906001600160a01b031681565b3480156104f057600080fd5b50602554610374906001600160a01b031681565b610423610512366004613313565b610dde565b34801561052357600080fd5b50610436601a5481565b34801561053957600080fd5b506015546103b19060ff1681565b34801561055357600080fd5b506104236105623660046131b3565b610e12565b34801561057357600080fd5b5061042361058236600461347e565b610e2d565b34801561059357600080fd5b506103b16105a23660046134ba565b60208080526000928352604080842090915290825290205460ff1681565b3480156105cc57600080fd5b506104366105db36600461347e565b610e39565b3480156105ec57600080fd5b5061043660195481565b34801561060257600080fd5b50610423610611366004613435565b610ecc565b34801561062257600080fd5b5061037461063136600461347e565b610f0d565b34801561064257600080fd5b5061043660165481565b34801561065857600080fd5b506103d6610f84565b34801561066d57600080fd5b50610436611012565b34801561068257600080fd5b5061043660145481565b34801561069857600080fd5b506104366106a7366004613165565b61101d565b3480156106b857600080fd5b506104236110a4565b3480156106cd57600080fd5b5061043660115481565b3480156106e357600080fd5b50610436601b5481565b3480156106f957600080fd5b506103b16107083660046134ba565b602160209081526000928352604080842090915290825290205460ff1681565b34801561073457600080fd5b50600b546001600160a01b0316610374565b34801561075257600080fd5b506103d66110da565b34801561076757600080fd5b5061043660185481565b34801561077d57600080fd5b5061043661078c366004613497565b602260209081526000928352604080842090915290825290205481565b3480156107b557600080fd5b50610436601d5481565b3480156107cb57600080fd5b506104236107da36600461326b565b6110e9565b3480156107eb57600080fd5b506104236107fa366004613508565b6110f4565b34801561080b57600080fd5b5061042361081a3660046131ef565b61125d565b34801561082b57600080fd5b5061043660175481565b34801561084157600080fd5b5061043660135481565b34801561085757600080fd5b506103d661128f565b34801561086c57600080fd5b506103d661087b36600461347e565b61129c565b34801561088c57600080fd5b50610436601c5481565b6104236108a43660046133b9565b6113c8565b6104236108b736600461335f565b611775565b3480156108c857600080fd5b506104236108d73660046134dc565b611940565b3480156108e857600080fd5b506104236108f7366004613435565b611a28565b34801561090857600080fd5b506104236109173660046132bf565b611a65565b34801561092857600080fd5b50610436600f5481565b34801561093e57600080fd5b50602454610374906001600160a01b031681565b34801561095e57600080fd5b506103b161096d366004613180565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109a757600080fd5b506104236109b6366004613165565b611cbd565b3480156109c757600080fd5b506103b1611d55565b60006109db82611d6e565b92915050565b6060600080546109f09061382e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1c9061382e565b8015610a695780601f10610a3e57610100808354040283529160200191610a69565b820191906000526020600020905b815481529060010190602001808311610a4c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610af15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b1882610f0d565b9050806001600160a01b0316836001600160a01b03161415610b865760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ae8565b336001600160a01b0382161480610ba25750610ba2813361096d565b610c145760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ae8565b610c1e8383611d93565b505050565b610c2d3382611e01565b610c495760405162461bcd60e51b8152600401610ae89061374f565b610c1e838383611ef8565b60006018544210158015610c6a57506019544211155b905090565b6000610c7a8361101d565b8210610cdc5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ae8565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6027546028546010544792919060ff1615610d23575050602a54602b545b6000610d3a6064610d34868661209f565b906120b2565b602354909150610d53906001600160a01b0316826120be565b6000610d646064610d34878661209f565b602454909150610d7d906001600160a01b0316826120be565b6025544790610d95906001600160a01b0316826120be565b60408051848152602081018490529081018290527fc1652cb672f78a08dab2125c16e5ad5330744cf519549d543e51fefe612e43059060600160405180910390a1505050505050565b6000610df56014548361209f90919063ffffffff16565b9050610e03848484846120c9565b610e0c826123ba565b50505050565b610c1e8383836040518060200160405280600081525061125d565b610e368161248b565b50565b6000610e4460095490565b8210610ea75760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ae8565b60098281548110610eba57610eba6138da565b90600052602060002001549050919050565b600b546001600160a01b03163314610ef65760405162461bcd60e51b8152600401610ae89061371a565b8051610f0990600e906020840190612fa8565b5050565b6000818152600260205260408120546001600160a01b0316806109db5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ae8565b600e8054610f919061382e565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbd9061382e565b801561100a5780601f10610fdf5761010080835404028352916020019161100a565b820191906000526020600020905b815481529060010190602001808311610fed57829003601f168201915b505050505081565b6000610c6a600c5490565b60006001600160a01b0382166110885760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ae8565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146110ce5760405162461bcd60e51b8152600401610ae89061371a565b6110d86000612494565b565b6060600180546109f09061382e565b610f093383836124e6565b600b546001600160a01b0316331461111e5760405162461bcd60e51b8152600401610ae89061371a565b6011548914156111705760405162461bcd60e51b815260206004820152601c60248201527f4c55524b3a2053746167652073616d652061732070726576696f7573000000006044820152606401610ae8565b8385106111b85760405162461bcd60e51b8152602060048201526016602482015275262aa9259d1024b73b30b634b210323ab930ba34b7b760511b6044820152606401610ae8565b60118990556012889055601387905560148690556016839055601885905560198490556015805460ff19168315151790558015611201576017546111fd9060016137a0565b6017555b6040805189815260208101899052908101879052606081018690526080810185905289907fa19c5cba71711114c292c48fc96212cb570b26fe2affd2281b7ebfa1826f8b289060a00160405180910390a2505050505050505050565b6112673383611e01565b6112835760405162461bcd60e51b8152600401610ae89061374f565b610e0c848484846125b5565b600d8054610f919061382e565b6060600082116112ee5760405162461bcd60e51b815260206004820152601f60248201527f5552492072657175657374656420666f7220696e76616c696420746f6b656e006044820152606401610ae8565b6000600e80546112fd9061382e565b90501161139457600e80546113119061382e565b80601f016020809104026020016040519081016040528092919081815260200182805461133d9061382e565b801561138a5780601f1061135f5761010080835404028352916020019161138a565b820191906000526020600020905b81548152906001019060200180831161136d57829003601f168201915b50505050506109db565b600e61139f836125e8565b600d6040516020016113b393929190613645565b60405160208183030381529060405292915050565b601d54339034906000906113dc908561209f565b9050601484111561142f5760405162461bcd60e51b815260206004820152601b60248201527f4c55524b3a204261746368206d6f7265207468616e206c696d697400000000006044820152606401610ae8565b611437611d55565b61147a5760405162461bcd60e51b8152602060048201526014602482015273262aa9259d1029b830bbb7102737ba1027b832b760611b6044820152606401610ae8565b808210156114ca5760405162461bcd60e51b815260206004820152601f60248201527f4c55524b3a205061796d656e7420616d6f756e74206e6f7420656e6f756768006044820152606401610ae8565b60005b8481101561176d5760006114f88787848181106114ec576114ec6138da565b90506020020135610f0d565b9050846001600160a01b0316816001600160a01b03161461155b5760405162461bcd60e51b815260206004820152601960248201527f4c55524b3a2053656e646572206973206e6f74206f776e6572000000000000006044820152606401610ae8565b601a5460009081526021602052604081209088888581811061157f5761157f6138da565b602090810292909201358352508101919091526040016000205460ff16156115e95760405162461bcd60e51b815260206004820152601b60248201527f4c55524b3a20486173206a757374206265656e20737061776e656400000000006044820152606401610ae8565b601a54600090815260208052604081209088888581811061160c5761160c6138da565b602090810292909201358352508101919091526040016000205460ff16156116765760405162461bcd60e51b815260206004820152601960248201527f4c55524b3a2048617320616c726561647920737061776e6564000000000000006044820152606401610ae8565b6000611681866126e6565b601a5460009081526020805260408120919250600191908a8a878181106116aa576116aa6138da565b602090810292909201358352508181019290925260409081016000908120805494151560ff19958616179055601a548152602183528181208582529092529020805490911660011790556001600160a01b0386167fbc43e5c4f8d9d54c0bbe44b4f466f0b91bf0b4cf1c8d1f5aebce6237081135b7898986818110611731576117316138da565b9050602002013583604051611750929190918252602082015260400190565b60405180910390a25050808061176590613869565b9150506114cd565b505050505050565b600080841515806117865750600084115b6117d25760405162461bcd60e51b815260206004820152601d60248201527f4c55524b3a20546f6b656e7320726571756972656420746f206d696e740000006044820152606401610ae8565b8415611842576117e3600286613884565b156118305760405162461bcd60e51b815260206004820181905260248201527f4c55524b3a20476f6c64206d757374206265206d756c7469706c65206f6620326044820152606401610ae8565b61183b6002866137b8565b9150611918565b6000831161188e5760405162461bcd60e51b815260206004820152601960248201527813155492ce88135a5b9d08105b5bdd5b9d081a5b9d985b1a59603a1b6044820152606401610ae8565b60006118a5601e548661209f90919063ffffffff16565b90506118bc6014548561209f90919063ffffffff16565b91508392508181111561190a5760405162461bcd60e51b815260206004820152601660248201527513155492ce88111a5cd8dbdd5b9d081a5b9d985b1a5960521b6044820152606401610ae8565b6119148282612766565b9150505b611924878784846120c9565b61192e8585612772565b611937826123ba565b50505050505050565b600b546001600160a01b0316331461196a5760405162461bcd60e51b8152600401610ae89061371a565b8183106119b25760405162461bcd60e51b8152602060048201526016602482015275262aa9259d1024b73b30b634b210323ab930ba34b7b760511b6044820152606401610ae8565b6010805460ff19166001908117909155601a546119ce916137a0565b601a819055601b849055601c839055601d82905560408051858152602081018590529081018390527ff700637caf8eb56f4c2f9ae175cd70ae2e30f39c817d2ab2175d41d3a298af159060600160405180910390a2505050565b600b546001600160a01b03163314611a525760405162461bcd60e51b8152600401610ae89061371a565b8051610f0990600d906020840190612fa8565b600b546001600160a01b03163314611a8f5760405162461bcd60e51b8152600401610ae89061371a565b6014821115611ae05760405162461bcd60e51b815260206004820152601b60248201527f4c55524b3a204261746368206d6f7265207468616e206c696d697400000000006044820152606401610ae8565b8015611b3d5760105460ff161515600114611b3d5760405162461bcd60e51b815260206004820152601760248201527f4c55524b3a20537061776e204e6f7420537461727465640000000000000000006044820152606401610ae8565b60005b82811015610e0c576000611b79858584818110611b5f57611b5f6138da565b9050602002016020810190611b749190613165565b6126e6565b90508215611c3557601a805460009081526020808052604080832085845282528083208054600160ff19918216811790925594548452602183528184208685529092529091208054909216179055848483818110611bd957611bd96138da565b9050602002016020810190611bee9190613165565b6001600160a01b03167fc82eec7583c53899b64fb6045cd68bf16001c25e458bee4727264c146a8870d282604051611c2891815260200190565b60405180910390a2611caa565b848483818110611c4757611c476138da565b9050602002016020810190611c5c9190613165565b6001600160a01b03167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf782601154604051611ca1929190918252602082015260400190565b60405180910390a25b5080611cb581613869565b915050611b40565b600b546001600160a01b03163314611ce75760405162461bcd60e51b8152600401610ae89061371a565b6001600160a01b038116611d4c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ae8565b610e3681612494565b6000601b544210158015610c6a575050601c5442111590565b60006001600160e01b0319821663780e9d6360e01b14806109db57506109db82612814565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611dc882610f0d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e7a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ae8565b6000611e8583610f0d565b9050806001600160a01b0316846001600160a01b03161480611ec05750836001600160a01b0316611eb584610a73565b6001600160a01b0316145b80611ef057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f0b82610f0d565b6001600160a01b031614611f6f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610ae8565b6001600160a01b038216611fd15760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ae8565b611fdc838383612864565b611fe7600082611d93565b6001600160a01b03831660009081526003602052604081208054600192906120109084906137eb565b90915550506001600160a01b038216600090815260036020526040812080546001929061203e9084906137a0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006120ab82846137cc565b9392505050565b60006120ab82846137b8565b81610c1e818361286f565b601754600090815260226020908152604080832033808552925290912054349084158015906120f9575060148511155b6121415760405162461bcd60e51b815260206004820152601960248201527813155492ce88135a5b9d08105b5bdd5b9d081a5b9d985b1a59603a1b6044820152606401610ae8565b60105460ff161561218a5760405162461bcd60e51b815260206004820152601360248201527213155492ce8814dc185ddb8814dd185c9d1959606a1b6044820152606401610ae8565b612192610c54565b6121d55760405162461bcd60e51b8152602060048201526014602482015273262aa9259d1021b630b4b6902737ba1027b832b760611b6044820152606401610ae8565b60155460ff1661236a576012546121f4866121ee611012565b90612988565b11156122425760405162461bcd60e51b815260206004820152601e60248201527f4c55524b3a2052656163686564204d696e74205374616765204c696d697400006044820152606401610ae8565b601354158061225c57506013546122598287612988565b11155b6122a85760405162461bcd60e51b815260206004820152601f60248201527f4c55524b3a2052656163686564204d696e742057616c6c6574204c696d6974006044820152606401610ae8565b6040516bffffffffffffffffffffffff19606085901b166020820152600090603401604051602081830303815290604052805190602001209050612323888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506016549150849050612994565b6123685760405162461bcd60e51b815260206004820152601660248201527513155492ce88139bdd081a5b881dda1a5d195b1a5cdd60521b6044820152606401610ae8565b505b838210156119375760405162461bcd60e51b815260206004820152601f60248201527f4c55524b3a205061796d656e7420616d6f756e74206e6f7420656e6f756768006044820152606401610ae8565b601754600090815260226020908152604080832033808552925282205490915b838110156124505760006123ed846126e6565b9050836001600160a01b03167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf782601154604051612435929190918252602082015260400190565b60405180910390a2508061244881613869565b9150506123da565b5061245b8184612988565b60175460009081526022602090815260408083206001600160a01b03909616835294905292909220919091555050565b610e36816129aa565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156125485760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ae8565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6125c0848484611ef8565b6125cc848484846129ea565b610e0c5760405162461bcd60e51b8152600401610ae8906136c8565b60608161260c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612636578061262081613869565b915061262f9050600a836137b8565b9150612610565b60008167ffffffffffffffff811115612651576126516138f0565b6040519080825280601f01601f19166020018201604052801561267b576020820181803683370190505b5090505b8415611ef0576126906001836137eb565b915061269d600a86613884565b6126a89060306137a0565b60f81b8183815181106126bd576126bd6138da565b60200101906001600160f81b031916908160001a9053506126df600a866137b8565b945061267f565b6000600f546126f4600c5490565b106127415760405162461bcd60e51b815260206004820152601860248201527f4c55524b3a204d617820537570706c79207265616368656400000000000000006044820152606401610ae8565b61274f600c80546001019055565b600061275a600c5490565b90506109db8382612af7565b60006120ab82846137eb565b6026546001600160a01b031682156127e15760405163390fe10960e21b8152336004820152602481018490526001600160a01b0382169063e43f8424906044015b600060405180830381600087803b1580156127cd57600080fd5b505af1158015611937573d6000803e3d6000fd5b604051633cb8f14360e01b8152336004820152602481018390526001600160a01b03821690633cb8f143906044016127b3565b60006001600160e01b031982166380ac58cd60e01b148061284557506001600160e01b03198216635b5e139f60e01b145b806109db57506301ffc9a760e01b6001600160e01b03198316146109db565b610c1e838383612c45565b804710156128bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ae8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461290c576040519150601f19603f3d011682016040523d82523d6000602084013e612911565b606091505b5050905080610c1e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ae8565b60006120ab82846137a0565b6000826129a18584612cfd565b14949350505050565b6129b381612d71565b600081815260066020526040902080546129cc9061382e565b159050610e36576000818152600660205260408120610e369161302c565b60006001600160a01b0384163b15612aec57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a2e903390899088908890600401613678565b602060405180830381600087803b158015612a4857600080fd5b505af1925050508015612a78575060408051601f3d908101601f19168201909252612a7591810190613418565b60015b612ad2573d808015612aa6576040519150601f19603f3d011682016040523d82523d6000602084013e612aab565b606091505b508051612aca5760405162461bcd60e51b8152600401610ae8906136c8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ef0565b506001949350505050565b6001600160a01b038216612b4d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ae8565b6000818152600260205260409020546001600160a01b031615612bb25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ae8565b612bbe60008383612864565b6001600160a01b0382166000908152600360205260408120805460019290612be79084906137a0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038316612ca057612c9b81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612cc3565b816001600160a01b0316836001600160a01b031614612cc357612cc38382612e18565b6001600160a01b038216612cda57610c1e81612eb5565b826001600160a01b0316826001600160a01b031614610c1e57610c1e8282612f64565b600081815b8451811015612d69576000858281518110612d1f57612d1f6138da565b60200260200101519050808311612d455760008381526020829052604090209250612d56565b600081815260208490526040902092505b5080612d6181613869565b915050612d02565b509392505050565b6000612d7c82610f0d565b9050612d8a81600084612864565b612d95600083611d93565b6001600160a01b0381166000908152600360205260408120805460019290612dbe9084906137eb565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001612e258461101d565b612e2f91906137eb565b600083815260086020526040902054909150808214612e82576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b600954600090612ec7906001906137eb565b6000838152600a602052604081205460098054939450909284908110612eef57612eef6138da565b906000526020600020015490508060098381548110612f1057612f106138da565b6000918252602080832090910192909255828152600a90915260408082208490558582528120556009805480612f4857612f486138c4565b6001900381819060005260206000200160009055905550505050565b6000612f6f8361101d565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b828054612fb49061382e565b90600052602060002090601f016020900481019282612fd6576000855561301c565b82601f10612fef57805160ff191683800117855561301c565b8280016001018555821561301c579182015b8281111561301c578251825591602001919060010190613001565b50613028929150613062565b5090565b5080546130389061382e565b6000825580601f10613048575050565b601f016020900490600052602060002090810190610e3691905b5b808211156130285760008155600101613063565b600067ffffffffffffffff80841115613092576130926138f0565b604051601f8501601f19908116603f011681019082821181831017156130ba576130ba6138f0565b816040528093508581528686860111156130d357600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461310457600080fd5b919050565b60008083601f84011261311b57600080fd5b50813567ffffffffffffffff81111561313357600080fd5b6020830191508360208260051b850101111561314e57600080fd5b9250929050565b8035801515811461310457600080fd5b60006020828403121561317757600080fd5b6120ab826130ed565b6000806040838503121561319357600080fd5b61319c836130ed565b91506131aa602084016130ed565b90509250929050565b6000806000606084860312156131c857600080fd5b6131d1846130ed565b92506131df602085016130ed565b9150604084013590509250925092565b6000806000806080858703121561320557600080fd5b61320e856130ed565b935061321c602086016130ed565b925060408501359150606085013567ffffffffffffffff81111561323f57600080fd5b8501601f8101871361325057600080fd5b61325f87823560208401613077565b91505092959194509250565b6000806040838503121561327e57600080fd5b613287836130ed565b91506131aa60208401613155565b600080604083850312156132a857600080fd5b6132b1836130ed565b946020939093013593505050565b6000806000604084860312156132d457600080fd5b833567ffffffffffffffff8111156132eb57600080fd5b6132f786828701613109565b909450925061330a905060208501613155565b90509250925092565b60008060006040848603121561332857600080fd5b833567ffffffffffffffff81111561333f57600080fd5b61334b86828701613109565b909790965060209590950135949350505050565b60008060008060006080868803121561337757600080fd5b853567ffffffffffffffff81111561338e57600080fd5b61339a88828901613109565b9099909850602088013597604081013597506060013595509350505050565b600080602083850312156133cc57600080fd5b823567ffffffffffffffff8111156133e357600080fd5b6133ef85828601613109565b90969095509350505050565b60006020828403121561340d57600080fd5b81356120ab81613906565b60006020828403121561342a57600080fd5b81516120ab81613906565b60006020828403121561344757600080fd5b813567ffffffffffffffff81111561345e57600080fd5b8201601f8101841361346f57600080fd5b611ef084823560208401613077565b60006020828403121561349057600080fd5b5035919050565b600080604083850312156134aa57600080fd5b823591506131aa602084016130ed565b600080604083850312156134cd57600080fd5b50508035926020909101359150565b6000806000606084860312156134f157600080fd5b505081359360208301359350604090920135919050565b60008060008060008060008060006101208a8c03121561352757600080fd5b8935985060208a0135975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135925061356160e08b01613155565b91506135706101008b01613155565b90509295985092959850929598565b60008151808452613597816020860160208601613802565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806135c557607f831692505b60208084108214156135e757634e487b7160e01b600052602260045260246000fd5b8180156135fb576001811461360c57613639565b60ff19861689528489019650613639565b60008881526020902060005b868110156136315781548b820152908501908301613618565b505084890196505b50505050505092915050565b600061365182866135ab565b8451613661818360208901613802565b61366d818301866135ab565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906136ab9083018461357f565b9695505050505050565b6020815260006120ab602083018461357f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156137b3576137b3613898565b500190565b6000826137c7576137c76138ae565b500490565b60008160001904831182151516156137e6576137e6613898565b500290565b6000828210156137fd576137fd613898565b500390565b60005b8381101561381d578181015183820152602001613805565b83811115610e0c5750506000910152565b600181811c9082168061384257607f821691505b6020821081141561386357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561387d5761387d613898565b5060010190565b600082613893576138936138ae565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e3657600080fdfea264697066735822122097e95ce562b605b1b916d0f3ac9fa315c8340145b93831eb3209a573eb458aaa64736f6c6343000807003300000000000000000000000077ad1a4031e180a599cb8a930c9da621901aebc2
Deployed Bytecode
0x60806040526004361061034f5760003560e01c806370a08231116101c6578063c50afe08116100f7578063da3ef23f11610095578063e6525b371161006f578063e6525b3714610932578063e985e9c514610952578063f2fde38b1461099b578063f7e85771146109bb57600080fd5b8063da3ef23f146108dc578063db9b0bcd146108fc578063e489d5101461091c57600080fd5b8063c9ce60ee116100d1578063c9ce60ee14610880578063ce20618014610896578063cef8a4c3146108a9578063d922f37b146108bc57600080fd5b8063c50afe0814610835578063c66828621461084b578063c87b56dd1461086057600080fd5b80639727834d11610164578063a22cb4651161013e578063a22cb465146107bf578063ae0cb910146107df578063b88d4fde146107ff578063be197ea51461081f57600080fd5b80639727834d1461075b5780639781398014610771578063a03a8584146107a957600080fd5b806377aeedc1116101a057806377aeedc1146106d75780637de73c53146106ed5780638da5cb5b1461072857806395d89b411461074657600080fd5b806370a082311461068c578063715018a6146106ac578063772cac46146106c157600080fd5b80633b439351116102a05780634fc63e341161023e57806365da97aa1161021857806365da97aa146106365780636c0360eb1461064c5780636de9f32b146106615780636f5d09041461067657600080fd5b80634fc63e34146105e057806355f804b3146105f65780636352211e1461061657600080fd5b806342842e0e1161027a57806342842e0e1461054757806342966c681461056757806345a123b4146105875780634f6ccce7146105c057600080fd5b80633b4393511461050457806340ddfb921461051757806341dde1601461052d57600080fd5b806323b872dd1161030d5780632f745c59116102e75780632f745c591461048f578063325cf9e6146104af5780633881352b146104c45780633ad10ef6146104e457600080fd5b806323b872dd1461044457806324fd2652146104645780632c335e2e1461047957600080fd5b8062514ddc1461035457806301ffc9a71461039157806306fdde03146103c1578063081812fc146103e3578063095ea7b31461040357806318160ddd14610425575b600080fd5b34801561036057600080fd5b50602354610374906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561039d57600080fd5b506103b16103ac3660046133fb565b6109d0565b6040519015158152602001610388565b3480156103cd57600080fd5b506103d66109e1565b60405161038891906136b5565b3480156103ef57600080fd5b506103746103fe36600461347e565b610a73565b34801561040f57600080fd5b5061042361041e366004613295565b610b0d565b005b34801561043157600080fd5b506009545b604051908152602001610388565b34801561045057600080fd5b5061042361045f3660046131b3565b610c23565b34801561047057600080fd5b506103b1610c54565b34801561048557600080fd5b5061043660125481565b34801561049b57600080fd5b506104366104aa366004613295565b610c6f565b3480156104bb57600080fd5b50610423610d05565b3480156104d057600080fd5b50602654610374906001600160a01b031681565b3480156104f057600080fd5b50602554610374906001600160a01b031681565b610423610512366004613313565b610dde565b34801561052357600080fd5b50610436601a5481565b34801561053957600080fd5b506015546103b19060ff1681565b34801561055357600080fd5b506104236105623660046131b3565b610e12565b34801561057357600080fd5b5061042361058236600461347e565b610e2d565b34801561059357600080fd5b506103b16105a23660046134ba565b60208080526000928352604080842090915290825290205460ff1681565b3480156105cc57600080fd5b506104366105db36600461347e565b610e39565b3480156105ec57600080fd5b5061043660195481565b34801561060257600080fd5b50610423610611366004613435565b610ecc565b34801561062257600080fd5b5061037461063136600461347e565b610f0d565b34801561064257600080fd5b5061043660165481565b34801561065857600080fd5b506103d6610f84565b34801561066d57600080fd5b50610436611012565b34801561068257600080fd5b5061043660145481565b34801561069857600080fd5b506104366106a7366004613165565b61101d565b3480156106b857600080fd5b506104236110a4565b3480156106cd57600080fd5b5061043660115481565b3480156106e357600080fd5b50610436601b5481565b3480156106f957600080fd5b506103b16107083660046134ba565b602160209081526000928352604080842090915290825290205460ff1681565b34801561073457600080fd5b50600b546001600160a01b0316610374565b34801561075257600080fd5b506103d66110da565b34801561076757600080fd5b5061043660185481565b34801561077d57600080fd5b5061043661078c366004613497565b602260209081526000928352604080842090915290825290205481565b3480156107b557600080fd5b50610436601d5481565b3480156107cb57600080fd5b506104236107da36600461326b565b6110e9565b3480156107eb57600080fd5b506104236107fa366004613508565b6110f4565b34801561080b57600080fd5b5061042361081a3660046131ef565b61125d565b34801561082b57600080fd5b5061043660175481565b34801561084157600080fd5b5061043660135481565b34801561085757600080fd5b506103d661128f565b34801561086c57600080fd5b506103d661087b36600461347e565b61129c565b34801561088c57600080fd5b50610436601c5481565b6104236108a43660046133b9565b6113c8565b6104236108b736600461335f565b611775565b3480156108c857600080fd5b506104236108d73660046134dc565b611940565b3480156108e857600080fd5b506104236108f7366004613435565b611a28565b34801561090857600080fd5b506104236109173660046132bf565b611a65565b34801561092857600080fd5b50610436600f5481565b34801561093e57600080fd5b50602454610374906001600160a01b031681565b34801561095e57600080fd5b506103b161096d366004613180565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109a757600080fd5b506104236109b6366004613165565b611cbd565b3480156109c757600080fd5b506103b1611d55565b60006109db82611d6e565b92915050565b6060600080546109f09061382e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1c9061382e565b8015610a695780601f10610a3e57610100808354040283529160200191610a69565b820191906000526020600020905b815481529060010190602001808311610a4c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610af15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b1882610f0d565b9050806001600160a01b0316836001600160a01b03161415610b865760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ae8565b336001600160a01b0382161480610ba25750610ba2813361096d565b610c145760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ae8565b610c1e8383611d93565b505050565b610c2d3382611e01565b610c495760405162461bcd60e51b8152600401610ae89061374f565b610c1e838383611ef8565b60006018544210158015610c6a57506019544211155b905090565b6000610c7a8361101d565b8210610cdc5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ae8565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6027546028546010544792919060ff1615610d23575050602a54602b545b6000610d3a6064610d34868661209f565b906120b2565b602354909150610d53906001600160a01b0316826120be565b6000610d646064610d34878661209f565b602454909150610d7d906001600160a01b0316826120be565b6025544790610d95906001600160a01b0316826120be565b60408051848152602081018490529081018290527fc1652cb672f78a08dab2125c16e5ad5330744cf519549d543e51fefe612e43059060600160405180910390a1505050505050565b6000610df56014548361209f90919063ffffffff16565b9050610e03848484846120c9565b610e0c826123ba565b50505050565b610c1e8383836040518060200160405280600081525061125d565b610e368161248b565b50565b6000610e4460095490565b8210610ea75760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ae8565b60098281548110610eba57610eba6138da565b90600052602060002001549050919050565b600b546001600160a01b03163314610ef65760405162461bcd60e51b8152600401610ae89061371a565b8051610f0990600e906020840190612fa8565b5050565b6000818152600260205260408120546001600160a01b0316806109db5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ae8565b600e8054610f919061382e565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbd9061382e565b801561100a5780601f10610fdf5761010080835404028352916020019161100a565b820191906000526020600020905b815481529060010190602001808311610fed57829003601f168201915b505050505081565b6000610c6a600c5490565b60006001600160a01b0382166110885760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ae8565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146110ce5760405162461bcd60e51b8152600401610ae89061371a565b6110d86000612494565b565b6060600180546109f09061382e565b610f093383836124e6565b600b546001600160a01b0316331461111e5760405162461bcd60e51b8152600401610ae89061371a565b6011548914156111705760405162461bcd60e51b815260206004820152601c60248201527f4c55524b3a2053746167652073616d652061732070726576696f7573000000006044820152606401610ae8565b8385106111b85760405162461bcd60e51b8152602060048201526016602482015275262aa9259d1024b73b30b634b210323ab930ba34b7b760511b6044820152606401610ae8565b60118990556012889055601387905560148690556016839055601885905560198490556015805460ff19168315151790558015611201576017546111fd9060016137a0565b6017555b6040805189815260208101899052908101879052606081018690526080810185905289907fa19c5cba71711114c292c48fc96212cb570b26fe2affd2281b7ebfa1826f8b289060a00160405180910390a2505050505050505050565b6112673383611e01565b6112835760405162461bcd60e51b8152600401610ae89061374f565b610e0c848484846125b5565b600d8054610f919061382e565b6060600082116112ee5760405162461bcd60e51b815260206004820152601f60248201527f5552492072657175657374656420666f7220696e76616c696420746f6b656e006044820152606401610ae8565b6000600e80546112fd9061382e565b90501161139457600e80546113119061382e565b80601f016020809104026020016040519081016040528092919081815260200182805461133d9061382e565b801561138a5780601f1061135f5761010080835404028352916020019161138a565b820191906000526020600020905b81548152906001019060200180831161136d57829003601f168201915b50505050506109db565b600e61139f836125e8565b600d6040516020016113b393929190613645565b60405160208183030381529060405292915050565b601d54339034906000906113dc908561209f565b9050601484111561142f5760405162461bcd60e51b815260206004820152601b60248201527f4c55524b3a204261746368206d6f7265207468616e206c696d697400000000006044820152606401610ae8565b611437611d55565b61147a5760405162461bcd60e51b8152602060048201526014602482015273262aa9259d1029b830bbb7102737ba1027b832b760611b6044820152606401610ae8565b808210156114ca5760405162461bcd60e51b815260206004820152601f60248201527f4c55524b3a205061796d656e7420616d6f756e74206e6f7420656e6f756768006044820152606401610ae8565b60005b8481101561176d5760006114f88787848181106114ec576114ec6138da565b90506020020135610f0d565b9050846001600160a01b0316816001600160a01b03161461155b5760405162461bcd60e51b815260206004820152601960248201527f4c55524b3a2053656e646572206973206e6f74206f776e6572000000000000006044820152606401610ae8565b601a5460009081526021602052604081209088888581811061157f5761157f6138da565b602090810292909201358352508101919091526040016000205460ff16156115e95760405162461bcd60e51b815260206004820152601b60248201527f4c55524b3a20486173206a757374206265656e20737061776e656400000000006044820152606401610ae8565b601a54600090815260208052604081209088888581811061160c5761160c6138da565b602090810292909201358352508101919091526040016000205460ff16156116765760405162461bcd60e51b815260206004820152601960248201527f4c55524b3a2048617320616c726561647920737061776e6564000000000000006044820152606401610ae8565b6000611681866126e6565b601a5460009081526020805260408120919250600191908a8a878181106116aa576116aa6138da565b602090810292909201358352508181019290925260409081016000908120805494151560ff19958616179055601a548152602183528181208582529092529020805490911660011790556001600160a01b0386167fbc43e5c4f8d9d54c0bbe44b4f466f0b91bf0b4cf1c8d1f5aebce6237081135b7898986818110611731576117316138da565b9050602002013583604051611750929190918252602082015260400190565b60405180910390a25050808061176590613869565b9150506114cd565b505050505050565b600080841515806117865750600084115b6117d25760405162461bcd60e51b815260206004820152601d60248201527f4c55524b3a20546f6b656e7320726571756972656420746f206d696e740000006044820152606401610ae8565b8415611842576117e3600286613884565b156118305760405162461bcd60e51b815260206004820181905260248201527f4c55524b3a20476f6c64206d757374206265206d756c7469706c65206f6620326044820152606401610ae8565b61183b6002866137b8565b9150611918565b6000831161188e5760405162461bcd60e51b815260206004820152601960248201527813155492ce88135a5b9d08105b5bdd5b9d081a5b9d985b1a59603a1b6044820152606401610ae8565b60006118a5601e548661209f90919063ffffffff16565b90506118bc6014548561209f90919063ffffffff16565b91508392508181111561190a5760405162461bcd60e51b815260206004820152601660248201527513155492ce88111a5cd8dbdd5b9d081a5b9d985b1a5960521b6044820152606401610ae8565b6119148282612766565b9150505b611924878784846120c9565b61192e8585612772565b611937826123ba565b50505050505050565b600b546001600160a01b0316331461196a5760405162461bcd60e51b8152600401610ae89061371a565b8183106119b25760405162461bcd60e51b8152602060048201526016602482015275262aa9259d1024b73b30b634b210323ab930ba34b7b760511b6044820152606401610ae8565b6010805460ff19166001908117909155601a546119ce916137a0565b601a819055601b849055601c839055601d82905560408051858152602081018590529081018390527ff700637caf8eb56f4c2f9ae175cd70ae2e30f39c817d2ab2175d41d3a298af159060600160405180910390a2505050565b600b546001600160a01b03163314611a525760405162461bcd60e51b8152600401610ae89061371a565b8051610f0990600d906020840190612fa8565b600b546001600160a01b03163314611a8f5760405162461bcd60e51b8152600401610ae89061371a565b6014821115611ae05760405162461bcd60e51b815260206004820152601b60248201527f4c55524b3a204261746368206d6f7265207468616e206c696d697400000000006044820152606401610ae8565b8015611b3d5760105460ff161515600114611b3d5760405162461bcd60e51b815260206004820152601760248201527f4c55524b3a20537061776e204e6f7420537461727465640000000000000000006044820152606401610ae8565b60005b82811015610e0c576000611b79858584818110611b5f57611b5f6138da565b9050602002016020810190611b749190613165565b6126e6565b90508215611c3557601a805460009081526020808052604080832085845282528083208054600160ff19918216811790925594548452602183528184208685529092529091208054909216179055848483818110611bd957611bd96138da565b9050602002016020810190611bee9190613165565b6001600160a01b03167fc82eec7583c53899b64fb6045cd68bf16001c25e458bee4727264c146a8870d282604051611c2891815260200190565b60405180910390a2611caa565b848483818110611c4757611c476138da565b9050602002016020810190611c5c9190613165565b6001600160a01b03167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf782601154604051611ca1929190918252602082015260400190565b60405180910390a25b5080611cb581613869565b915050611b40565b600b546001600160a01b03163314611ce75760405162461bcd60e51b8152600401610ae89061371a565b6001600160a01b038116611d4c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ae8565b610e3681612494565b6000601b544210158015610c6a575050601c5442111590565b60006001600160e01b0319821663780e9d6360e01b14806109db57506109db82612814565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611dc882610f0d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e7a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ae8565b6000611e8583610f0d565b9050806001600160a01b0316846001600160a01b03161480611ec05750836001600160a01b0316611eb584610a73565b6001600160a01b0316145b80611ef057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f0b82610f0d565b6001600160a01b031614611f6f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610ae8565b6001600160a01b038216611fd15760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ae8565b611fdc838383612864565b611fe7600082611d93565b6001600160a01b03831660009081526003602052604081208054600192906120109084906137eb565b90915550506001600160a01b038216600090815260036020526040812080546001929061203e9084906137a0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006120ab82846137cc565b9392505050565b60006120ab82846137b8565b81610c1e818361286f565b601754600090815260226020908152604080832033808552925290912054349084158015906120f9575060148511155b6121415760405162461bcd60e51b815260206004820152601960248201527813155492ce88135a5b9d08105b5bdd5b9d081a5b9d985b1a59603a1b6044820152606401610ae8565b60105460ff161561218a5760405162461bcd60e51b815260206004820152601360248201527213155492ce8814dc185ddb8814dd185c9d1959606a1b6044820152606401610ae8565b612192610c54565b6121d55760405162461bcd60e51b8152602060048201526014602482015273262aa9259d1021b630b4b6902737ba1027b832b760611b6044820152606401610ae8565b60155460ff1661236a576012546121f4866121ee611012565b90612988565b11156122425760405162461bcd60e51b815260206004820152601e60248201527f4c55524b3a2052656163686564204d696e74205374616765204c696d697400006044820152606401610ae8565b601354158061225c57506013546122598287612988565b11155b6122a85760405162461bcd60e51b815260206004820152601f60248201527f4c55524b3a2052656163686564204d696e742057616c6c6574204c696d6974006044820152606401610ae8565b6040516bffffffffffffffffffffffff19606085901b166020820152600090603401604051602081830303815290604052805190602001209050612323888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506016549150849050612994565b6123685760405162461bcd60e51b815260206004820152601660248201527513155492ce88139bdd081a5b881dda1a5d195b1a5cdd60521b6044820152606401610ae8565b505b838210156119375760405162461bcd60e51b815260206004820152601f60248201527f4c55524b3a205061796d656e7420616d6f756e74206e6f7420656e6f756768006044820152606401610ae8565b601754600090815260226020908152604080832033808552925282205490915b838110156124505760006123ed846126e6565b9050836001600160a01b03167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf782601154604051612435929190918252602082015260400190565b60405180910390a2508061244881613869565b9150506123da565b5061245b8184612988565b60175460009081526022602090815260408083206001600160a01b03909616835294905292909220919091555050565b610e36816129aa565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156125485760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ae8565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6125c0848484611ef8565b6125cc848484846129ea565b610e0c5760405162461bcd60e51b8152600401610ae8906136c8565b60608161260c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612636578061262081613869565b915061262f9050600a836137b8565b9150612610565b60008167ffffffffffffffff811115612651576126516138f0565b6040519080825280601f01601f19166020018201604052801561267b576020820181803683370190505b5090505b8415611ef0576126906001836137eb565b915061269d600a86613884565b6126a89060306137a0565b60f81b8183815181106126bd576126bd6138da565b60200101906001600160f81b031916908160001a9053506126df600a866137b8565b945061267f565b6000600f546126f4600c5490565b106127415760405162461bcd60e51b815260206004820152601860248201527f4c55524b3a204d617820537570706c79207265616368656400000000000000006044820152606401610ae8565b61274f600c80546001019055565b600061275a600c5490565b90506109db8382612af7565b60006120ab82846137eb565b6026546001600160a01b031682156127e15760405163390fe10960e21b8152336004820152602481018490526001600160a01b0382169063e43f8424906044015b600060405180830381600087803b1580156127cd57600080fd5b505af1158015611937573d6000803e3d6000fd5b604051633cb8f14360e01b8152336004820152602481018390526001600160a01b03821690633cb8f143906044016127b3565b60006001600160e01b031982166380ac58cd60e01b148061284557506001600160e01b03198216635b5e139f60e01b145b806109db57506301ffc9a760e01b6001600160e01b03198316146109db565b610c1e838383612c45565b804710156128bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ae8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461290c576040519150601f19603f3d011682016040523d82523d6000602084013e612911565b606091505b5050905080610c1e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ae8565b60006120ab82846137a0565b6000826129a18584612cfd565b14949350505050565b6129b381612d71565b600081815260066020526040902080546129cc9061382e565b159050610e36576000818152600660205260408120610e369161302c565b60006001600160a01b0384163b15612aec57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a2e903390899088908890600401613678565b602060405180830381600087803b158015612a4857600080fd5b505af1925050508015612a78575060408051601f3d908101601f19168201909252612a7591810190613418565b60015b612ad2573d808015612aa6576040519150601f19603f3d011682016040523d82523d6000602084013e612aab565b606091505b508051612aca5760405162461bcd60e51b8152600401610ae8906136c8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ef0565b506001949350505050565b6001600160a01b038216612b4d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ae8565b6000818152600260205260409020546001600160a01b031615612bb25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ae8565b612bbe60008383612864565b6001600160a01b0382166000908152600360205260408120805460019290612be79084906137a0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038316612ca057612c9b81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612cc3565b816001600160a01b0316836001600160a01b031614612cc357612cc38382612e18565b6001600160a01b038216612cda57610c1e81612eb5565b826001600160a01b0316826001600160a01b031614610c1e57610c1e8282612f64565b600081815b8451811015612d69576000858281518110612d1f57612d1f6138da565b60200260200101519050808311612d455760008381526020829052604090209250612d56565b600081815260208490526040902092505b5080612d6181613869565b915050612d02565b509392505050565b6000612d7c82610f0d565b9050612d8a81600084612864565b612d95600083611d93565b6001600160a01b0381166000908152600360205260408120805460019290612dbe9084906137eb565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001612e258461101d565b612e2f91906137eb565b600083815260086020526040902054909150808214612e82576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b600954600090612ec7906001906137eb565b6000838152600a602052604081205460098054939450909284908110612eef57612eef6138da565b906000526020600020015490508060098381548110612f1057612f106138da565b6000918252602080832090910192909255828152600a90915260408082208490558582528120556009805480612f4857612f486138c4565b6001900381819060005260206000200160009055905550505050565b6000612f6f8361101d565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b828054612fb49061382e565b90600052602060002090601f016020900481019282612fd6576000855561301c565b82601f10612fef57805160ff191683800117855561301c565b8280016001018555821561301c579182015b8281111561301c578251825591602001919060010190613001565b50613028929150613062565b5090565b5080546130389061382e565b6000825580601f10613048575050565b601f016020900490600052602060002090810190610e3691905b5b808211156130285760008155600101613063565b600067ffffffffffffffff80841115613092576130926138f0565b604051601f8501601f19908116603f011681019082821181831017156130ba576130ba6138f0565b816040528093508581528686860111156130d357600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461310457600080fd5b919050565b60008083601f84011261311b57600080fd5b50813567ffffffffffffffff81111561313357600080fd5b6020830191508360208260051b850101111561314e57600080fd5b9250929050565b8035801515811461310457600080fd5b60006020828403121561317757600080fd5b6120ab826130ed565b6000806040838503121561319357600080fd5b61319c836130ed565b91506131aa602084016130ed565b90509250929050565b6000806000606084860312156131c857600080fd5b6131d1846130ed565b92506131df602085016130ed565b9150604084013590509250925092565b6000806000806080858703121561320557600080fd5b61320e856130ed565b935061321c602086016130ed565b925060408501359150606085013567ffffffffffffffff81111561323f57600080fd5b8501601f8101871361325057600080fd5b61325f87823560208401613077565b91505092959194509250565b6000806040838503121561327e57600080fd5b613287836130ed565b91506131aa60208401613155565b600080604083850312156132a857600080fd5b6132b1836130ed565b946020939093013593505050565b6000806000604084860312156132d457600080fd5b833567ffffffffffffffff8111156132eb57600080fd5b6132f786828701613109565b909450925061330a905060208501613155565b90509250925092565b60008060006040848603121561332857600080fd5b833567ffffffffffffffff81111561333f57600080fd5b61334b86828701613109565b909790965060209590950135949350505050565b60008060008060006080868803121561337757600080fd5b853567ffffffffffffffff81111561338e57600080fd5b61339a88828901613109565b9099909850602088013597604081013597506060013595509350505050565b600080602083850312156133cc57600080fd5b823567ffffffffffffffff8111156133e357600080fd5b6133ef85828601613109565b90969095509350505050565b60006020828403121561340d57600080fd5b81356120ab81613906565b60006020828403121561342a57600080fd5b81516120ab81613906565b60006020828403121561344757600080fd5b813567ffffffffffffffff81111561345e57600080fd5b8201601f8101841361346f57600080fd5b611ef084823560208401613077565b60006020828403121561349057600080fd5b5035919050565b600080604083850312156134aa57600080fd5b823591506131aa602084016130ed565b600080604083850312156134cd57600080fd5b50508035926020909101359150565b6000806000606084860312156134f157600080fd5b505081359360208301359350604090920135919050565b60008060008060008060008060006101208a8c03121561352757600080fd5b8935985060208a0135975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135925061356160e08b01613155565b91506135706101008b01613155565b90509295985092959850929598565b60008151808452613597816020860160208601613802565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806135c557607f831692505b60208084108214156135e757634e487b7160e01b600052602260045260246000fd5b8180156135fb576001811461360c57613639565b60ff19861689528489019650613639565b60008881526020902060005b868110156136315781548b820152908501908301613618565b505084890196505b50505050505092915050565b600061365182866135ab565b8451613661818360208901613802565b61366d818301866135ab565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906136ab9083018461357f565b9695505050505050565b6020815260006120ab602083018461357f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156137b3576137b3613898565b500190565b6000826137c7576137c76138ae565b500490565b60008160001904831182151516156137e6576137e6613898565b500290565b6000828210156137fd576137fd613898565b500390565b60005b8381101561381d578181015183820152602001613805565b83811115610e0c5750506000910152565b600181811c9082168061384257607f821691505b6020821081141561386357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561387d5761387d613898565b5060010190565b600082613893576138936138ae565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e3657600080fdfea264697066735822122097e95ce562b605b1b916d0f3ac9fa315c8340145b93831eb3209a573eb458aaa64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000077ad1a4031e180a599cb8a930c9da621901aebc2
-----Decoded View---------------
Arg [0] : _incineratorAddress (address): 0x77AD1a4031e180a599Cb8a930C9da621901AEBC2
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000077ad1a4031e180a599cb8a930c9da621901aebc2
Deployed Bytecode Sourcemap
61203:13908:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62566:71;;;;;;;;;;-1:-1:-1;62566:71:0;;;;-1:-1:-1;;;;;62566:71:0;;;;;;-1:-1:-1;;;;;10473:32:1;;;10455:51;;10443:2;10428:18;62566:71:0;;;;;;;;74896:212;;;;;;;;;;-1:-1:-1;74896:212:0;;;;;:::i;:::-;;:::i;:::-;;;11454:14:1;;11447:22;11429:41;;11417:2;11402:18;74896:212:0;11289:187:1;26434:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28127:308::-;;;;;;;;;;-1:-1:-1;28127:308:0;;;;;:::i;:::-;;:::i;27650:411::-;;;;;;;;;;-1:-1:-1;27650:411:0;;;;;:::i;:::-;;:::i;:::-;;42262:113;;;;;;;;;;-1:-1:-1;42350:10:0;:17;42262:113;;;11627:25:1;;;11615:2;11600:18;42262:113:0;11481:177:1;29046:376:0;;;;;;;;;;-1:-1:-1;29046:376:0;;;;;:::i;:::-;;:::i;66601:198::-;;;;;;;;;;;;;:::i;61628:40::-;;;;;;;;;;;;;;;;41843:343;;;;;;;;;;-1:-1:-1;41843:343:0;;;;;:::i;:::-;;:::i;72259:693::-;;;;;;;;;;;;;:::i;62802:43::-;;;;;;;;;;-1:-1:-1;62802:43:0;;;;-1:-1:-1;;;;;62802:43:0;;;62723:70;;;;;;;;;;-1:-1:-1;62723:70:0;;;;-1:-1:-1;;;;;62723:70:0;;;68244:288;;;;;;:::i;:::-;;:::i;62037:37::-;;;;;;;;;;;;;;;;61777:41;;;;;;;;;;-1:-1:-1;61777:41:0;;;;;;;;29493:185;;;;;;;;;;-1:-1:-1;29493:185:0;;;;;:::i;:::-;;:::i;73490:71::-;;;;;;;;;;-1:-1:-1;73490:71:0;;;;;:::i;:::-;;:::i;62338:66::-;;;;;;;;;;-1:-1:-1;62338:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;42452:320;;;;;;;;;;-1:-1:-1;42452:320:0;;;;;:::i;:::-;;:::i;61982:46::-;;;;;;;;;;;;;;;;64528:98;;;;;;;;;;-1:-1:-1;64528:98:0;;;;;:::i;:::-;;:::i;26041:326::-;;;;;;;;;;-1:-1:-1;26041:326:0;;;;;:::i;:::-;;:::i;61825:41::-;;;;;;;;;;;;;;;;61471:26;;;;;;;;;;;;;:::i;74420:99::-;;;;;;;;;;;;;:::i;61731:39::-;;;;;;;;;;;;;;;;25684:295;;;;;;;;;;-1:-1:-1;25684:295:0;;;;;:::i;:::-;;:::i;8949:103::-;;;;;;;;;;;;;:::i;61586:35::-;;;;;;;;;;;;;;;;62081:42;;;;;;;;;;;;;;;;62411:69;;;;;;;;;;-1:-1:-1;62411:69:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;8298:87;;;;;;;;;;-1:-1:-1;8371:6:0;;-1:-1:-1;;;;;8371:6:0;8298:87;;26603:104;;;;;;;;;;;;;:::i;61929:46::-;;;;;;;;;;;;;;;;62487:70;;;;;;;;;;-1:-1:-1;62487:70:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;62179:35;;;;;;;;;;;;;;;;28507:187;;;;;;;;;;-1:-1:-1;28507:187:0;;;;;:::i;:::-;;:::i;64793:1205::-;;;;;;;;;;-1:-1:-1;64793:1205:0;;;;;:::i;:::-;;:::i;29749:365::-;;;;;;;;;;-1:-1:-1;29749:365:0;;;;;:::i;:::-;;:::i;61873:47::-;;;;;;;;;;;;;;;;61675:49;;;;;;;;;;;;;;;;61427:37;;;;;;;;;;;;;:::i;63987:533::-;;;;;;;;;;-1:-1:-1;63987:533:0;;;;;:::i;:::-;;:::i;62130:42::-;;;;;;;;;;;;;;;;67005:1231;;;;;;:::i;:::-;;:::i;70541:1246::-;;;;;;:::i;:::-;;:::i;66006:587::-;;;;;;;;;;-1:-1:-1;66006:587:0;;;;;:::i;:::-;;:::i;64634:151::-;;;;;;;;;;-1:-1:-1;64634:151:0;;;;;:::i;:::-;;:::i;73569:843::-;;;;;;;;;;-1:-1:-1;73569:843:0;;;;;:::i;:::-;;:::i;61506:38::-;;;;;;;;;;;;;;;;62644:72;;;;;;;;;;-1:-1:-1;62644:72:0;;;;-1:-1:-1;;;;;62644:72:0;;;28765:214;;;;;;;;;;-1:-1:-1;28765:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;28936:25:0;;;28907:4;28936:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28765:214;9207:238;;;;;;;;;;-1:-1:-1;9207:238:0;;;;;:::i;:::-;;:::i;66807:190::-;;;;;;;;;;;;;:::i;74896:212::-;75035:4;75064:36;75088:11;75064:23;:36::i;:::-;75057:43;74896:212;-1:-1:-1;;74896:212:0:o;26434:100::-;26488:13;26521:5;26514:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26434:100;:::o;28127:308::-;28248:7;31750:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31750:16:0;28273:110;;;;-1:-1:-1;;;28273:110:0;;20831:2:1;28273:110:0;;;20813:21:1;20870:2;20850:18;;;20843:30;20909:34;20889:18;;;20882:62;-1:-1:-1;;;20960:18:1;;;20953:42;21012:19;;28273:110:0;;;;;;;;;-1:-1:-1;28403:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28403:24:0;;28127:308::o;27650:411::-;27731:13;27747:23;27762:7;27747:14;:23::i;:::-;27731:39;;27795:5;-1:-1:-1;;;;;27789:11:0;:2;-1:-1:-1;;;;;27789:11:0;;;27781:57;;;;-1:-1:-1;;;27781:57:0;;23024:2:1;27781:57:0;;;23006:21:1;23063:2;23043:18;;;23036:30;23102:34;23082:18;;;23075:62;-1:-1:-1;;;23153:18:1;;;23146:31;23194:19;;27781:57:0;22822:397:1;27781:57:0;7075:10;-1:-1:-1;;;;;27873:21:0;;;;:62;;-1:-1:-1;27898:37:0;27915:5;7075:10;28765:214;:::i;27898:37::-;27851:168;;;;-1:-1:-1;;;27851:168:0;;18522:2:1;27851:168:0;;;18504:21:1;18561:2;18541:18;;;18534:30;18600:34;18580:18;;;18573:62;18671:26;18651:18;;;18644:54;18715:19;;27851:168:0;18320:420:1;27851:168:0;28032:21;28041:2;28045:7;28032:8;:21::i;:::-;27720:341;27650:411;;:::o;29046:376::-;29255:41;7075:10;29288:7;29255:18;:41::i;:::-;29233:140;;;;-1:-1:-1;;;29233:140:0;;;;;;;:::i;:::-;29386:28;29396:4;29402:2;29406:7;29386:9;:28::i;66601:198::-;66645:4;66701:27;;66682:15;:46;;:109;;;;;66764:27;;66745:15;:46;;66682:109;66662:129;;66601:198;:::o;41843:343::-;41985:7;42040:23;42057:5;42040:16;:23::i;:::-;42032:5;:31;42010:124;;;;-1:-1:-1;;;42010:124:0;;13145:2:1;42010:124:0;;;13127:21:1;13184:2;13164:18;;;13157:30;13223:34;13203:18;;;13196:62;-1:-1:-1;;;13274:18:1;;;13267:41;13325:19;;42010:124:0;12943:407:1;42010:124:0;-1:-1:-1;;;;;;42152:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;41843:343::o;72259:693::-;72379:11;;72420:12;;72449:13;;72327:21;;72379:11;72420:12;72449:13;;72445:107;;;-1:-1:-1;;72489:12:0;;72527:13;;72445:107;72564:17;72584:37;72617:3;72584:28;:15;72604:7;72584:19;:28::i;:::-;:32;;:37::i;:::-;72643:11;;72564:57;;-1:-1:-1;72632:34:0;;-1:-1:-1;;;;;72643:11:0;72564:57;72632:10;:34::i;:::-;72679:18;72700:38;72734:3;72700:29;:15;72720:8;72700:19;:29::i;:38::-;72760:12;;72679:59;;-1:-1:-1;72749:36:0;;-1:-1:-1;;;;;72760:12:0;72679:59;72749:10;:36::i;:::-;72860:10;;72817:21;;72849:32;;-1:-1:-1;;;;;72860:10:0;72817:21;72849:10;:32::i;:::-;72899:45;;;27189:25:1;;;27245:2;27230:18;;27223:34;;;27273:18;;;27266:34;;;72899:45:0;;27177:2:1;27162:18;72899:45:0;;;;;;;72290:662;;;;;;72259:693::o;68244:288::-;68362:23;68388:37;68404:20;;68388:11;:15;;:37;;;;:::i;:::-;68362:63;;68438:56;68451:12;;68465:11;68478:15;68438:12;:56::i;:::-;68505:19;68512:11;68505:6;:19::i;:::-;68351:181;68244:288;;;:::o;29493:185::-;29631:39;29648:4;29654:2;29658:7;29631:39;;;;;;;;;;;;:16;:39::i;73490:71::-;73539:14;73545:7;73539:5;:14::i;:::-;73490:71;:::o;42452:320::-;42572:7;42627:30;42350:10;:17;;42262:113;42627:30;42619:5;:38;42597:132;;;;-1:-1:-1;;;42597:132:0;;24914:2:1;42597:132:0;;;24896:21:1;24953:2;24933:18;;;24926:30;24992:34;24972:18;;;24965:62;-1:-1:-1;;;25043:18:1;;;25036:42;25095:19;;42597:132:0;24712:408:1;42597:132:0;42747:10;42758:5;42747:17;;;;;;;;:::i;:::-;;;;;;;;;42740:24;;42452:320;;;:::o;64528:98::-;8371:6;;-1:-1:-1;;;;;8371:6:0;7075:10;8518:23;8510:68;;;;-1:-1:-1;;;8510:68:0;;;;;;;:::i;:::-;64600:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;64528:98:::0;:::o;26041:326::-;26158:7;26199:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26199:16:0;26248:19;26226:110;;;;-1:-1:-1;;;26226:110:0;;19358:2:1;26226:110:0;;;19340:21:1;19397:2;19377:18;;;19370:30;19436:34;19416:18;;;19409:62;-1:-1:-1;;;19487:18:1;;;19480:39;19536:19;;26226:110:0;19156:405:1;61471:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74420:99::-;74465:7;74492:19;:9;50993:14;;50901:114;25684:295;25801:7;-1:-1:-1;;;;;25848:19:0;;25826:111;;;;-1:-1:-1;;;25826:111:0;;18947:2:1;25826:111:0;;;18929:21:1;18986:2;18966:18;;;18959:30;19025:34;19005:18;;;18998:62;-1:-1:-1;;;19076:18:1;;;19069:40;19126:19;;25826:111:0;18745:406:1;25826:111:0;-1:-1:-1;;;;;;25955:16:0;;;;;:9;:16;;;;;;;25684:295::o;8949:103::-;8371:6;;-1:-1:-1;;;;;8371:6:0;7075:10;8518:23;8510:68;;;;-1:-1:-1;;;8510:68:0;;;;;;;:::i;:::-;9014:30:::1;9041:1;9014:18;:30::i;:::-;8949:103::o:0;26603:104::-;26659:13;26692:7;26685:14;;;;;:::i;28507:187::-;28634:52;7075:10;28667:8;28677;28634:18;:52::i;64793:1205::-;8371:6;;-1:-1:-1;;;;;8371:6:0;7075:10;8518:23;8510:68;;;;-1:-1:-1;;;8510:68:0;;;;;;;:::i;:::-;65146:16:::1;;65136:6;:26;;65128:67;;;::::0;-1:-1:-1;;;65128:67:0;;25327:2:1;65128:67:0::1;::::0;::::1;25309:21:1::0;25366:2;25346:18;;;25339:30;25405;25385:18;;;25378:58;25453:18;;65128:67:0::1;25125:352:1::0;65128:67:0::1;65229:12;65214;:27;65206:62;;;::::0;-1:-1:-1;;;65206:62:0;;26403:2:1;65206:62:0::1;::::0;::::1;26385:21:1::0;26442:2;26422:18;;;26415:30;-1:-1:-1;;;26461:18:1;;;26454:52;26523:18;;65206:62:0::1;26201:346:1::0;65206:62:0::1;65281:16;:25:::0;;;65317:21:::1;:35:::0;;;65363:30:::1;:53:::0;;;65427:20:::1;:28:::0;;;65466:26:::1;:49:::0;;;65528:27:::1;:42:::0;;;65581:27:::1;:42:::0;;;65634:21:::1;:33:::0;;-1:-1:-1;;65634:33:0::1;::::0;::::1;;;::::0;;65680:114;::::1;;;65750:28;::::0;:32:::1;::::0;65781:1:::1;65750:32;:::i;:::-;65719:28;:63:::0;65680:114:::1;65811:179;::::0;;27570:25:1;;;27626:2;27611:18;;27604:34;;;27654:18;;;27647:34;;;27712:2;27697:18;;27690:34;;;27755:3;27740:19;;27733:35;;;65838:6:0;;65811:179:::1;::::0;27557:3:1;27542:19;65811:179:0::1;;;;;;;64793:1205:::0;;;;;;;;;:::o;29749:365::-;29938:41;7075:10;29971:7;29938:18;:41::i;:::-;29916:140;;;;-1:-1:-1;;;29916:140:0;;;;;;;:::i;:::-;30067:39;30081:4;30087:2;30091:7;30100:5;30067:13;:39::i;61427:37::-;;;;;;;:::i;63987:533::-;64115:13;64165:1;64154:8;:12;64146:56;;;;-1:-1:-1;;;64146:56:0;;23778:2:1;64146:56:0;;;23760:21:1;23817:2;23797:18;;;23790:30;23856:33;23836:18;;;23829:61;23907:18;;64146:56:0;23576:355:1;64146:56:0;64257:1;64239:7;64233:21;;;;;:::i;:::-;;;:25;:279;;64505:7;64233:279;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64350:7;64384:19;:8;:17;:19::i;:::-;64430:13;64307:159;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64213:299;63987:533;-1:-1:-1;;63987:533:0:o;67005:1231::-;67176:16;;67088:10;;67130:9;;67071:14;;67176:33;;67197:4;67176:20;:33::i;:::-;67150:59;-1:-1:-1;62891:2:0;67230:26;;;67222:66;;;;-1:-1:-1;;;67222:66:0;;15146:2:1;67222:66:0;;;15128:21:1;15185:2;15165:18;;;15158:30;15224:29;15204:18;;;15197:57;15271:18;;67222:66:0;14944:351:1;67222:66:0;67307:13;:11;:13::i;:::-;67299:46;;;;-1:-1:-1;;;67299:46:0;;12796:2:1;67299:46:0;;;12778:21:1;12835:2;12815:18;;;12808:30;-1:-1:-1;;;12854:18:1;;;12847:50;12914:18;;67299:46:0;12594:344:1;67299:46:0;67392:15;67378:10;:29;;67356:110;;;;-1:-1:-1;;;67356:110:0;;26043:2:1;67356:110:0;;;26025:21:1;26082:2;26062:18;;;26055:30;26121:33;26101:18;;;26094:61;26172:18;;67356:110:0;25841:355:1;67356:110:0;67484:9;67479:750;67499:15;;;67479:750;;;67536:18;67557:16;67565:4;;67570:1;67565:7;;;;;;;:::i;:::-;;;;;;;67557;:16::i;:::-;67536:37;;67612:6;-1:-1:-1;;;;;67598:20:0;:10;-1:-1:-1;;;;;67598:20:0;;67590:58;;;;-1:-1:-1;;;67590:58:0;;18168:2:1;67590:58:0;;;18150:21:1;18207:2;18187:18;;;18180:30;18246:27;18226:18;;;18219:55;18291:18;;67590:58:0;17966:349:1;67590:58:0;67707:18;;67689:37;;;;:17;:37;;;;;;67727:4;;67732:1;67727:7;;;;;;;:::i;:::-;;;;;;;;;;67689:46;;-1:-1:-1;67689:46:0;;;;;;;;-1:-1:-1;67689:46:0;;;;:55;67663:144;;;;-1:-1:-1;;;67663:144:0;;12089:2:1;67663:144:0;;;12071:21:1;12128:2;12108:18;;;12101:30;12167:29;12147:18;;;12140:57;12214:18;;67663:144:0;11887:351:1;67663:144:0;67863:18;;67848:34;;;;:14;:34;;;;;;67883:4;;67888:1;67883:7;;;;;;;:::i;:::-;;;;;;;;;;67848:43;;-1:-1:-1;67848:43:0;;;;;;;;-1:-1:-1;67848:43:0;;;;:52;67822:139;;;;-1:-1:-1;;;67822:139:0;;22317:2:1;67822:139:0;;;22299:21:1;22356:2;22336:18;;;22329:30;22395:27;22375:18;;;22368:55;22440:18;;67822:139:0;22115:349:1;67822:139:0;67978:22;68003:12;68008:6;68003:4;:12::i;:::-;68047:18;;68032:34;;;;:14;:34;;;;;67978:37;;-1:-1:-1;68078:4:0;;68032:34;68067:4;;68072:1;68067:7;;;;;;;:::i;:::-;;;;;;;;;;68032:43;;-1:-1:-1;68032:43:0;;;;;;;;;;;-1:-1:-1;68032:43:0;;;:50;;;;;-1:-1:-1;;68032:50:0;;;;;;68115:18;;68097:37;;:17;:37;;;;;:53;;;;;;;;:60;;;;;68032:50;68097:60;;;-1:-1:-1;;;;;68179:38:0;;;68193:4;;68198:1;68193:7;;;;;;;:::i;:::-;;;;;;;68202:14;68179:38;;;;;;26908:25:1;;;26964:2;26949:18;;26942:34;26896:2;26881:18;;26734:248;68179:38:0;;;;;;;;67521:708;;67516:3;;;;;:::i;:::-;;;;67479:750;;;;67060:1176;;;67005:1231;;:::o;70541:1246::-;70736:20;;70829:18;;;;:41;;;70869:1;70851:15;:19;70829:41;70807:120;;;;-1:-1:-1;;;70807:120:0;;24138:2:1;70807:120:0;;;24120:21:1;24177:2;24157:18;;;24150:30;24216:31;24196:18;;;24189:59;24265:18;;70807:120:0;23936:353:1;70807:120:0;70944:18;;70940:678;;71005:18;71022:1;71005:14;:18;:::i;:::-;:23;70979:117;;;;-1:-1:-1;;;70979:117:0;;21956:2:1;70979:117:0;;;21938:21:1;;;21975:18;;;21968:30;22034:34;22014:18;;;22007:62;22086:18;;70979:117:0;21754:356:1;70979:117:0;71126:18;71143:1;71126:14;:18;:::i;:::-;71111:33;;70940:678;;;71199:1;71185:11;:15;71177:53;;;;-1:-1:-1;;;71177:53:0;;19768:2:1;71177:53:0;;;19750:21:1;19807:2;19787:18;;;19780:30;-1:-1:-1;;;19826:18:1;;;19819:55;19891:18;;71177:53:0;19566:349:1;71177:53:0;71245:20;71268:78;71306:25;;71268:15;:19;;:78;;;;:::i;:::-;71245:101;;71379:37;71395:20;;71379:11;:15;;:37;;;;:::i;:::-;71361:55;;71446:11;71431:26;;71498:15;71482:12;:31;;71474:66;;;;-1:-1:-1;;;71474:66:0;;21605:2:1;71474:66:0;;;21587:21:1;21644:2;21624:18;;;21617:30;-1:-1:-1;;;21663:18:1;;;21656:52;21725:18;;71474:66:0;21403:346:1;71474:66:0;71573:33;:15;71593:12;71573:19;:33::i;:::-;71555:51;;71162:456;70940:678;71630:57;71643:12;;71657;71671:15;71630:12;:57::i;:::-;71698:50;71716:14;71732:15;71698:17;:50::i;:::-;71759:20;71766:12;71759:6;:20::i;:::-;70725:1062;;70541:1246;;;;;:::o;66006:587::-;8371:6;;-1:-1:-1;;;;;8371:6:0;7075:10;8518:23;8510:68;;;;-1:-1:-1;;;8510:68:0;;;;;;;:::i;:::-;66174:12:::1;66159;:27;66151:62;;;::::0;-1:-1:-1;;;66151:62:0;;26403:2:1;66151:62:0::1;::::0;::::1;26385:21:1::0;26442:2;26422:18;;;26415:30;-1:-1:-1;;;26461:18:1;;;26454:52;26523:18;;66151:62:0::1;26201:346:1::0;66151:62:0::1;66226:13;:20:::0;;-1:-1:-1;;66226:20:0::1;66242:4;66226:20:::0;;::::1;::::0;;;66280:18:::1;::::0;:22:::1;::::0;::::1;:::i;:::-;66259:18;:43:::0;;;66313:23:::1;:38:::0;;;66362:23:::1;:38:::0;;;66411:16:::1;:24:::0;;;66453:132:::1;::::0;;27189:25:1;;;27245:2;27230:18;;27223:34;;;27273:18;;;27266:34;;;66453:132:0::1;::::0;27177:2:1;27162:18;66453:132:0::1;;;;;;;66006:587:::0;;;:::o;64634:151::-;8371:6;;-1:-1:-1;;;;;8371:6:0;7075:10;8518:23;8510:68;;;;-1:-1:-1;;;8510:68:0;;;;;;;:::i;:::-;64744:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;73569:843::-:0;8371:6;;-1:-1:-1;;;;;8371:6:0;7075:10;8518:23;8510:68;;;;-1:-1:-1;;;8510:68:0;;;;;;;:::i;:::-;62891:2:::1;73719:33:::0;::::1;;73697:110;;;::::0;-1:-1:-1;;;73697:110:0;;15146:2:1;73697:110:0::1;::::0;::::1;15128:21:1::0;15185:2;15165:18;;;15158:30;15224:29;15204:18;;;15197:57;15271:18;;73697:110:0::1;14944:351:1::0;73697:110:0::1;73824:16;73820:106;;;73865:13;::::0;::::1;;:21;;:13:::0;:21:::1;73857:57;;;::::0;-1:-1:-1;;;73857:57:0;;23426:2:1;73857:57:0::1;::::0;::::1;23408:21:1::0;23465:2;23445:18;;;23438:30;23504:25;23484:18;;;23477:53;23547:18;;73857:57:0::1;23224:347:1::0;73857:57:0::1;73943:9;73938:467;73958:22:::0;;::::1;73938:467;;;74002:15;74020:20;74025:11;;74037:1;74025:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;74020:4;:20::i;:::-;74002:38;;74061:16;74057:337;;;74113:18;::::0;;74098:34:::1;::::0;;;:14:::1;:34:::0;;;;;;;:43;;;;;;;;:50;;74144:4:::1;-1:-1:-1::0;;74098:50:0;;::::1;::::0;::::1;::::0;;;74185:18;;74167:37;;:17:::1;:37:::0;;;;;:46;;;;;;;;;:53;;;;::::1;;::::0;;74260:11;;74272:1;74260:14;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;74246:38:0::1;;74276:7;74246:38;;;;11627:25:1::0;;11615:2;11600:18;;11481:177;74246:38:0::1;;;;;;;;74057:337;;;74336:11;;74348:1;74336:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;74330:48:0::1;;74352:7;74361:16;;74330:48;;;;;;26908:25:1::0;;;26964:2;26949:18;;26942:34;26896:2;26881:18;;26734:248;74330:48:0::1;;;;;;;;74057:337;-1:-1:-1::0;73982:3:0;::::1;::::0;::::1;:::i;:::-;;;;73938:467;;9207:238:::0;8371:6;;-1:-1:-1;;;;;8371:6:0;7075:10;8518:23;8510:68;;;;-1:-1:-1;;;8510:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9310:22:0;::::1;9288:110;;;::::0;-1:-1:-1;;;9288:110:0;;13976:2:1;9288:110:0::1;::::0;::::1;13958:21:1::0;14015:2;13995:18;;;13988:30;14054:34;14034:18;;;14027:62;-1:-1:-1;;;14105:18:1;;;14098:36;14151:19;;9288:110:0::1;13774:402:1::0;9288:110:0::1;9409:28;9428:8;9409:18;:28::i;66807:190::-:0;66851:4;66907:23;;66888:15;:42;;:101;;;;-1:-1:-1;;66966:23:0;;66947:15;:42;;;66807:190::o;41459:300::-;41606:4;-1:-1:-1;;;;;;41648:50:0;;-1:-1:-1;;;41648:50:0;;:103;;;41715:36;41739:11;41715:23;:36::i;35948:174::-;36023:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36023:29:0;-1:-1:-1;;;;;36023:29:0;;;;;;;;:24;;36077:23;36023:24;36077:14;:23::i;:::-;-1:-1:-1;;;;;36068:46:0;;;;;;;;;;;35948:174;;:::o;31955:452::-;32084:4;31750:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31750:16:0;32106:110;;;;-1:-1:-1;;;32106:110:0;;17755:2:1;32106:110:0;;;17737:21:1;17794:2;17774:18;;;17767:30;17833:34;17813:18;;;17806:62;-1:-1:-1;;;17884:18:1;;;17877:42;17936:19;;32106:110:0;17553:408:1;32106:110:0;32227:13;32243:23;32258:7;32243:14;:23::i;:::-;32227:39;;32296:5;-1:-1:-1;;;;;32285:16:0;:7;-1:-1:-1;;;;;32285:16:0;;:64;;;;32342:7;-1:-1:-1;;;;;32318:31:0;:20;32330:7;32318:11;:20::i;:::-;-1:-1:-1;;;;;32318:31:0;;32285:64;:113;;;-1:-1:-1;;;;;;28936:25:0;;;28907:4;28936:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32366:32;32277:122;31955:452;-1:-1:-1;;;;31955:452:0:o;35168:662::-;35341:4;-1:-1:-1;;;;;35314:31:0;:23;35329:7;35314:14;:23::i;:::-;-1:-1:-1;;;;;35314:31:0;;35292:118;;;;-1:-1:-1;;;35292:118:0;;14383:2:1;35292:118:0;;;14365:21:1;14422:2;14402:18;;;14395:30;14461:34;14441:18;;;14434:62;-1:-1:-1;;;14512:18:1;;;14505:35;14557:19;;35292:118:0;14181:401:1;35292:118:0;-1:-1:-1;;;;;35429:16:0;;35421:65;;;;-1:-1:-1;;;35421:65:0;;15502:2:1;35421:65:0;;;15484:21:1;15541:2;15521:18;;;15514:30;15580:34;15560:18;;;15553:62;-1:-1:-1;;;15631:18:1;;;15624:34;15675:19;;35421:65:0;15300:400:1;35421:65:0;35499:39;35520:4;35526:2;35530:7;35499:20;:39::i;:::-;35603:29;35620:1;35624:7;35603:8;:29::i;:::-;-1:-1:-1;;;;;35645:15:0;;;;;;:9;:15;;;;;:20;;35664:1;;35645:15;:20;;35664:1;;35645:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35676:13:0;;;;;;:9;:13;;;;;:18;;35693:1;;35676:13;:18;;35693:1;;35676:18;:::i;:::-;;;;-1:-1:-1;;35705:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35705:21:0;-1:-1:-1;;;;;35705:21:0;;;;;;;;;35744:27;;35705:16;;35744:27;;;;;;;27720:341;27650:411;;:::o;57715:98::-;57773:7;57800:5;57804:1;57800;:5;:::i;:::-;57793:12;57715:98;-1:-1:-1;;;57715:98:0:o;58114:::-;58172:7;58199:5;58203:1;58199;:5;:::i;72960:175::-;73070:10;73092:35;73070:10;73121:5;73092:17;:35::i;68540:1496::-;68810:28;;68695:14;68794:45;;;:15;:45;;;;;;;;68712:10;68794:77;;;;;;;;;68754:9;;68906:15;;;;;:45;;;62891:2;68925:11;:26;;68906:45;68884:120;;;;-1:-1:-1;;;68884:120:0;;19768:2:1;68884:120:0;;;19750:21:1;19807:2;19787:18;;;19780:30;-1:-1:-1;;;19826:18:1;;;19819:55;19891:18;;68884:120:0;19566:349:1;68884:120:0;69023:13;;;;:22;69015:54;;;;-1:-1:-1;;;69015:54:0;;20483:2:1;69015:54:0;;;20465:21:1;20522:2;20502:18;;;20495:30;-1:-1:-1;;;20541:18:1;;;20534:49;20600:18;;69015:54:0;20281:343:1;69015:54:0;69088:13;:11;:13::i;:::-;69080:46;;;;-1:-1:-1;;;69080:46:0;;16261:2:1;69080:46:0;;;16243:21:1;16300:2;16280:18;;;16273:30;-1:-1:-1;;;16319:18:1;;;16312:50;16379:18;;69080:46:0;16059:344:1;69080:46:0;69144:21;;;;69139:766;;69243:21;;69208:31;69227:11;69208:14;:12;:14::i;:::-;:18;;:31::i;:::-;:56;;69182:148;;;;-1:-1:-1;;;69182:148:0;;25684:2:1;69182:148:0;;;25666:21:1;25723:2;25703:18;;;25696:30;25762:32;25742:18;;;25735:60;25812:18;;69182:148:0;25482:354:1;69182:148:0;69371:30;;:35;;:141;;-1:-1:-1;69482:30:0;;69431:26;:9;69445:11;69431:13;:26::i;:::-;:81;;69371:141;69345:234;;;;-1:-1:-1;;;69345:234:0;;16610:2:1;69345:234:0;;;16592:21:1;16649:2;16629:18;;;16622:30;16688:33;16668:18;;;16661:61;16739:18;;69345:234:0;16408:355:1;69345:234:0;69621:24;;-1:-1:-1;;9553:2:1;9549:15;;;9545:53;69621:24:0;;;9533:66:1;69596:12:0;;9615::1;;69621:24:0;;;;;;;;;;;;69611:35;;;;;;69596:50;;69687:148;69728:12;;69687:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69763:26:0;;;-1:-1:-1;69812:4:0;;-1:-1:-1;69687:18:0;:148::i;:::-;69661:232;;;;-1:-1:-1;;;69661:232:0;;12445:2:1;69661:232:0;;;12427:21:1;12484:2;12464:18;;;12457:30;-1:-1:-1;;;12503:18:1;;;12496:52;12565:18;;69661:232:0;12243:346:1;69661:232:0;69167:738;69139:766;69953:16;69939:10;:30;;69917:111;;;;-1:-1:-1;;;69917:111:0;;26043:2:1;69917:111:0;;;26025:21:1;26082:2;26062:18;;;26055:30;26121:33;26101:18;;;26094:61;26172:18;;69917:111:0;25841:355:1;70044:489:0;70174:28;;70100:14;70158:45;;;:15;:45;;;;;;;;70117:10;70158:77;;;;;;;;70117:10;;70248:159;70272:11;70268:1;:15;70248:159;;;70305:15;70323:12;70328:6;70323:4;:12::i;:::-;70305:30;;70361:6;-1:-1:-1;;;;;70355:40:0;;70369:7;70378:16;;70355:40;;;;;;26908:25:1;;;26964:2;26949:18;;26942:34;26896:2;26881:18;;26734:248;70355:40:0;;;;;;;;-1:-1:-1;70285:3:0;;;;:::i;:::-;;;;70248:159;;;-1:-1:-1;70475:50:0;:9;70503:11;70475:13;:50::i;:::-;70435:28;;70419:45;;;;:15;:45;;;;;;;;-1:-1:-1;;;;;70419:53:0;;;;;;;;;;;;:106;;;;-1:-1:-1;;70044:489:0:o;74750:138::-;74860:20;74872:7;74860:11;:20::i;9605:191::-;9698:6;;;-1:-1:-1;;;;;9715:17:0;;;-1:-1:-1;;;;;;9715:17:0;;;;;;;9748:40;;9698:6;;;9715:17;9698:6;;9748:40;;9679:16;;9748:40;9668:128;9605:191;:::o;36264:315::-;36419:8;-1:-1:-1;;;;;36410:17:0;:5;-1:-1:-1;;;;;36410:17:0;;;36402:55;;;;-1:-1:-1;;;36402:55:0;;15907:2:1;36402:55:0;;;15889:21:1;15946:2;15926:18;;;15919:30;15985:27;15965:18;;;15958:55;16030:18;;36402:55:0;15705:349:1;36402:55:0;-1:-1:-1;;;;;36468:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;36468:46:0;;;;;;;;;;36530:41;;11429::1;;;36530::0;;11402:18:1;36530:41:0;;;;;;;36264:315;;;:::o;30996:352::-;31153:28;31163:4;31169:2;31173:7;31153:9;:28::i;:::-;31214:48;31237:4;31243:2;31247:7;31256:5;31214:22;:48::i;:::-;31192:148;;;;-1:-1:-1;;;31192:148:0;;;;;;;:::i;20996:723::-;21052:13;21273:10;21269:53;;-1:-1:-1;;21300:10:0;;;;;;;;;;;;-1:-1:-1;;;21300:10:0;;;;;20996:723::o;21269:53::-;21347:5;21332:12;21388:78;21395:9;;21388:78;;21421:8;;;;:::i;:::-;;-1:-1:-1;21444:10:0;;-1:-1:-1;21452:2:0;21444:10;;:::i;:::-;;;21388:78;;;21476:19;21508:6;21498:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21498:17:0;;21476:39;;21526:154;21533:10;;21526:154;;21560:11;21570:1;21560:11;;:::i;:::-;;-1:-1:-1;21629:10:0;21637:2;21629:5;:10;:::i;:::-;21616:24;;:2;:24;:::i;:::-;21603:39;;21586:6;21593;21586:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;21586:56:0;;;;;;;;-1:-1:-1;21657:11:0;21666:2;21657:11;;:::i;:::-;;;21526:154;;73143:339;73193:7;73257:16;;73235:19;:9;50993:14;;50901:114;73235:19;:38;73213:112;;;;-1:-1:-1;;;73213:112:0;;22671:2:1;73213:112:0;;;22653:21:1;22710:2;22690:18;;;22683:30;22749:26;22729:18;;;22722:54;22793:18;;73213:112:0;22469:348:1;73213:112:0;73338:21;:9;51112:19;;51130:1;51112:19;;;51023:127;73338:21;73370:17;73390:19;:9;50993:14;;50901:114;73390:19;73370:39;;73420:27;73426:9;73437;73420:5;:27::i;57358:98::-;57416:7;57443:5;57447:1;57443;:5;:::i;71795:456::-;71982:28;;-1:-1:-1;;;;;71982:28:0;72038:18;;72034:210;;72073:62;;-1:-1:-1;;;72073:62:0;;72108:10;72073:62;;;11184:51:1;11251:18;;;11244:34;;;-1:-1:-1;;;;;72073:34:0;;;;;11157:18:1;;72073:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72034:210;72168:64;;-1:-1:-1;;;72168:64:0;;72204:10;72168:64;;;11184:51:1;11251:18;;;11244:34;;;-1:-1:-1;;;;;72168:35:0;;;;;11157:18:1;;72168:64:0;11010:274:1;25265:355:0;25412:4;-1:-1:-1;;;;;;25454:40:0;;-1:-1:-1;;;25454:40:0;;:105;;-1:-1:-1;;;;;;;25511:48:0;;-1:-1:-1;;;25511:48:0;25454:105;:158;;;-1:-1:-1;;;;;;;;;;23813:40:0;;;25576:36;23654:207;74527:215;74689:45;74716:4;74722:2;74726:7;74689:26;:45::i;14151:391::-;14280:6;14255:21;:31;;14233:110;;;;-1:-1:-1;;;14233:110:0;;17397:2:1;14233:110:0;;;17379:21:1;17436:2;17416:18;;;17409:30;17475:31;17455:18;;;17448:59;17524:18;;14233:110:0;17195:353:1;14233:110:0;14357:12;14375:9;-1:-1:-1;;;;;14375:14:0;14397:6;14375:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14356:52;;;14441:7;14419:115;;;;-1:-1:-1;;;14419:115:0;;16970:2:1;14419:115:0;;;16952:21:1;17009:2;16989:18;;;16982:30;17048:34;17028:18;;;17021:62;17119:28;17099:18;;;17092:56;17165:19;;14419:115:0;16768:422:1;56977:98:0;57035:7;57062:5;57066:1;57062;:5;:::i;52421:190::-;52546:4;52599;52570:25;52583:5;52590:4;52570:12;:25::i;:::-;:33;;52421:190;-1:-1:-1;;;;52421:190:0:o;49812:206::-;49881:20;49893:7;49881:11;:20::i;:::-;49924:19;;;;:10;:19;;;;;49918:33;;;;;:::i;:::-;:38;;-1:-1:-1;49914:97:0;;49980:19;;;;:10;:19;;;;;49973:26;;;:::i;37144:980::-;37299:4;-1:-1:-1;;;;;37320:13:0;;13185:19;:23;37316:801;;37373:175;;-1:-1:-1;;;37373:175:0;;-1:-1:-1;;;;;37373:36:0;;;;;:175;;7075:10;;37467:4;;37494:7;;37524:5;;37373:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37373:175:0;;;;;;;;-1:-1:-1;;37373:175:0;;;;;;;;;;;;:::i;:::-;;;37352:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37731:13:0;;37727:320;;37774:108;;-1:-1:-1;;;37774:108:0;;;;;;;:::i;37727:320::-;37997:6;37991:13;37982:6;37978:2;37974:15;37967:38;37352:710;-1:-1:-1;;;;;;37612:51:0;-1:-1:-1;;;37612:51:0;;-1:-1:-1;37605:58:0;;37316:801;-1:-1:-1;38101:4:0;37144:980;;;;;;:::o;33743:439::-;-1:-1:-1;;;;;33823:16:0;;33815:61;;;;-1:-1:-1;;;33815:61:0;;20122:2:1;33815:61:0;;;20104:21:1;;;20141:18;;;20134:30;20200:34;20180:18;;;20173:62;20252:18;;33815:61:0;19920:356:1;33815:61:0;31726:4;31750:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31750:16:0;:30;33887:58;;;;-1:-1:-1;;;33887:58:0;;14789:2:1;33887:58:0;;;14771:21:1;14828:2;14808:18;;;14801:30;14867;14847:18;;;14840:58;14915:18;;33887:58:0;14587:352:1;33887:58:0;33958:45;33987:1;33991:2;33995:7;33958:20;:45::i;:::-;-1:-1:-1;;;;;34016:13:0;;;;;;:9;:13;;;;;:18;;34033:1;;34016:13;:18;;34033:1;;34016:18;:::i;:::-;;;;-1:-1:-1;;34045:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34045:21:0;-1:-1:-1;;;;;34045:21:0;;;;;;;;34084:33;;34045:16;;;34084:33;;34045:16;;34084:33;64600:18:::1;64528:98:::0;:::o;43385:589::-;-1:-1:-1;;;;;43591:18:0;;43587:187;;43626:40;43658:7;44801:10;:17;;44774:24;;;;:15;:24;;;;;:44;;;44829:24;;;;;;;;;;;;44697:164;43626:40;43587:187;;;43696:2;-1:-1:-1;;;;;43688:10:0;:4;-1:-1:-1;;;;;43688:10:0;;43684:90;;43715:47;43748:4;43754:7;43715:32;:47::i;:::-;-1:-1:-1;;;;;43788:16:0;;43784:183;;43821:45;43858:7;43821:36;:45::i;43784:183::-;43894:4;-1:-1:-1;;;;;43888:10:0;:2;-1:-1:-1;;;;;43888:10:0;;43884:83;;43915:40;43943:2;43947:7;43915:27;:40::i;52973:707::-;53083:7;53131:4;53083:7;53146:497;53170:5;:12;53166:1;:16;53146:497;;;53204:20;53227:5;53233:1;53227:8;;;;;;;;:::i;:::-;;;;;;;53204:31;;53270:12;53254;:28;53250:382;;53783:13;53838:15;;;53874:4;53867:15;;;53921:4;53905:21;;53382:57;;53250:382;;;53783:13;53838:15;;;53874:4;53867:15;;;53921:4;53905:21;;53559:57;;53250:382;-1:-1:-1;53184:3:0;;;;:::i;:::-;;;;53146:497;;;-1:-1:-1;53660:12:0;52973:707;-1:-1:-1;;;52973:707:0:o;34411:420::-;34471:13;34487:23;34502:7;34487:14;:23::i;:::-;34471:39;;34523:48;34544:5;34559:1;34563:7;34523:20;:48::i;:::-;34612:29;34629:1;34633:7;34612:8;:29::i;:::-;-1:-1:-1;;;;;34654:16:0;;;;;;:9;:16;;;;;:21;;34674:1;;34654:16;:21;;34674:1;;34654:21;:::i;:::-;;;;-1:-1:-1;;34693:16:0;;;;:7;:16;;;;;;34686:23;;-1:-1:-1;;;;;;34686:23:0;;;34727:36;34701:7;;34693:16;-1:-1:-1;;;;;34727:36:0;;;;;34693:16;;34727:36;64600:18:::1;64528:98:::0;:::o;45488:1002::-;45768:22;45818:1;45793:22;45810:4;45793:16;:22::i;:::-;:26;;;;:::i;:::-;45830:18;45851:26;;;:17;:26;;;;;;45768:51;;-1:-1:-1;45984:28:0;;;45980:328;;-1:-1:-1;;;;;46051:18:0;;46029:19;46051:18;;;:12;:18;;;;;;;;:34;;;;;;;;;46102:30;;;;;;:44;;;46219:30;;:17;:30;;;;;:43;;;45980:328;-1:-1:-1;46404:26:0;;;;:17;:26;;;;;;;;46397:33;;;-1:-1:-1;;;;;46448:18:0;;;;;:12;:18;;;;;:34;;;;;;;46441:41;45488:1002::o;46785:1079::-;47063:10;:17;47038:22;;47063:21;;47083:1;;47063:21;:::i;:::-;47095:18;47116:24;;;:15;:24;;;;;;47489:10;:26;;47038:46;;-1:-1:-1;47116:24:0;;47038:46;;47489:26;;;;;;:::i;:::-;;;;;;;;;47467:48;;47553:11;47528:10;47539;47528:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;47633:28;;;:15;:28;;;;;;;:41;;;47805:24;;;;;47798:31;47840:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;46856:1008;;;46785:1079;:::o;44275:221::-;44360:14;44377:20;44394:2;44377:16;:20::i;:::-;-1:-1:-1;;;;;44408:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;44453:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;44275:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:367::-;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:55;;973:1;970;963:12;922:55;-1:-1:-1;996:20:1;;1039:18;1028:30;;1025:50;;;1071:1;1068;1061:12;1025:50;1108:4;1100:6;1096:17;1084:29;;1168:3;1161:4;1151:6;1148:1;1144:14;1136:6;1132:27;1128:38;1125:47;1122:67;;;1185:1;1182;1175:12;1122:67;828:367;;;;;:::o;1200:160::-;1265:20;;1321:13;;1314:21;1304:32;;1294:60;;1350:1;1347;1340:12;1365:186;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;1516:29;1535:9;1516:29;:::i;1556:260::-;1624:6;1632;1685:2;1673:9;1664:7;1660:23;1656:32;1653:52;;;1701:1;1698;1691:12;1653:52;1724:29;1743:9;1724:29;:::i;:::-;1714:39;;1772:38;1806:2;1795:9;1791:18;1772:38;:::i;:::-;1762:48;;1556:260;;;;;:::o;1821:328::-;1898:6;1906;1914;1967:2;1955:9;1946:7;1942:23;1938:32;1935:52;;;1983:1;1980;1973:12;1935:52;2006:29;2025:9;2006:29;:::i;:::-;1996:39;;2054:38;2088:2;2077:9;2073:18;2054:38;:::i;:::-;2044:48;;2139:2;2128:9;2124:18;2111:32;2101:42;;1821:328;;;;;:::o;2154:666::-;2249:6;2257;2265;2273;2326:3;2314:9;2305:7;2301:23;2297:33;2294:53;;;2343:1;2340;2333:12;2294:53;2366:29;2385:9;2366:29;:::i;:::-;2356:39;;2414:38;2448:2;2437:9;2433:18;2414:38;:::i;:::-;2404:48;;2499:2;2488:9;2484:18;2471:32;2461:42;;2554:2;2543:9;2539:18;2526:32;2581:18;2573:6;2570:30;2567:50;;;2613:1;2610;2603:12;2567:50;2636:22;;2689:4;2681:13;;2677:27;-1:-1:-1;2667:55:1;;2718:1;2715;2708:12;2667:55;2741:73;2806:7;2801:2;2788:16;2783:2;2779;2775:11;2741:73;:::i;:::-;2731:83;;;2154:666;;;;;;;:::o;2825:254::-;2890:6;2898;2951:2;2939:9;2930:7;2926:23;2922:32;2919:52;;;2967:1;2964;2957:12;2919:52;2990:29;3009:9;2990:29;:::i;:::-;2980:39;;3038:35;3069:2;3058:9;3054:18;3038:35;:::i;3084:254::-;3152:6;3160;3213:2;3201:9;3192:7;3188:23;3184:32;3181:52;;;3229:1;3226;3219:12;3181:52;3252:29;3271:9;3252:29;:::i;:::-;3242:39;3328:2;3313:18;;;;3300:32;;-1:-1:-1;;;3084:254:1:o;3343:505::-;3435:6;3443;3451;3504:2;3492:9;3483:7;3479:23;3475:32;3472:52;;;3520:1;3517;3510:12;3472:52;3560:9;3547:23;3593:18;3585:6;3582:30;3579:50;;;3625:1;3622;3615:12;3579:50;3664:70;3726:7;3717:6;3706:9;3702:22;3664:70;:::i;:::-;3753:8;;-1:-1:-1;3638:96:1;-1:-1:-1;3807:35:1;;-1:-1:-1;3838:2:1;3823:18;;3807:35;:::i;:::-;3797:45;;3343:505;;;;;:::o;3853:::-;3948:6;3956;3964;4017:2;4005:9;3996:7;3992:23;3988:32;3985:52;;;4033:1;4030;4023:12;3985:52;4073:9;4060:23;4106:18;4098:6;4095:30;4092:50;;;4138:1;4135;4128:12;4092:50;4177:70;4239:7;4230:6;4219:9;4215:22;4177:70;:::i;:::-;4266:8;;4151:96;;-1:-1:-1;4348:2:1;4333:18;;;;4320:32;;3853:505;-1:-1:-1;;;;3853:505:1:o;4363:642::-;4476:6;4484;4492;4500;4508;4561:3;4549:9;4540:7;4536:23;4532:33;4529:53;;;4578:1;4575;4568:12;4529:53;4618:9;4605:23;4651:18;4643:6;4640:30;4637:50;;;4683:1;4680;4673:12;4637:50;4722:70;4784:7;4775:6;4764:9;4760:22;4722:70;:::i;:::-;4811:8;;4696:96;;-1:-1:-1;4893:2:1;4878:18;;4865:32;;4944:2;4929:18;;4916:32;;-1:-1:-1;4995:2:1;4980:18;4967:32;;-1:-1:-1;4363:642:1;-1:-1:-1;;;;4363:642:1:o;5010:437::-;5096:6;5104;5157:2;5145:9;5136:7;5132:23;5128:32;5125:52;;;5173:1;5170;5163:12;5125:52;5213:9;5200:23;5246:18;5238:6;5235:30;5232:50;;;5278:1;5275;5268:12;5232:50;5317:70;5379:7;5370:6;5359:9;5355:22;5317:70;:::i;:::-;5406:8;;5291:96;;-1:-1:-1;5010:437:1;-1:-1:-1;;;;5010:437:1:o;5452:245::-;5510:6;5563:2;5551:9;5542:7;5538:23;5534:32;5531:52;;;5579:1;5576;5569:12;5531:52;5618:9;5605:23;5637:30;5661:5;5637:30;:::i;5702:249::-;5771:6;5824:2;5812:9;5803:7;5799:23;5795:32;5792:52;;;5840:1;5837;5830:12;5792:52;5872:9;5866:16;5891:30;5915:5;5891:30;:::i;5956:450::-;6025:6;6078:2;6066:9;6057:7;6053:23;6049:32;6046:52;;;6094:1;6091;6084:12;6046:52;6134:9;6121:23;6167:18;6159:6;6156:30;6153:50;;;6199:1;6196;6189:12;6153:50;6222:22;;6275:4;6267:13;;6263:27;-1:-1:-1;6253:55:1;;6304:1;6301;6294:12;6253:55;6327:73;6392:7;6387:2;6374:16;6369:2;6365;6361:11;6327:73;:::i;6411:180::-;6470:6;6523:2;6511:9;6502:7;6498:23;6494:32;6491:52;;;6539:1;6536;6529:12;6491:52;-1:-1:-1;6562:23:1;;6411:180;-1:-1:-1;6411:180:1:o;6596:254::-;6664:6;6672;6725:2;6713:9;6704:7;6700:23;6696:32;6693:52;;;6741:1;6738;6731:12;6693:52;6777:9;6764:23;6754:33;;6806:38;6840:2;6829:9;6825:18;6806:38;:::i;6855:248::-;6923:6;6931;6984:2;6972:9;6963:7;6959:23;6955:32;6952:52;;;7000:1;6997;6990:12;6952:52;-1:-1:-1;;7023:23:1;;;7093:2;7078:18;;;7065:32;;-1:-1:-1;6855:248:1:o;7108:316::-;7185:6;7193;7201;7254:2;7242:9;7233:7;7229:23;7225:32;7222:52;;;7270:1;7267;7260:12;7222:52;-1:-1:-1;;7293:23:1;;;7363:2;7348:18;;7335:32;;-1:-1:-1;7414:2:1;7399:18;;;7386:32;;7108:316;-1:-1:-1;7108:316:1:o;7429:730::-;7554:6;7562;7570;7578;7586;7594;7602;7610;7618;7671:3;7659:9;7650:7;7646:23;7642:33;7639:53;;;7688:1;7685;7678:12;7639:53;7724:9;7711:23;7701:33;;7781:2;7770:9;7766:18;7753:32;7743:42;;7832:2;7821:9;7817:18;7804:32;7794:42;;7883:2;7872:9;7868:18;7855:32;7845:42;;7934:3;7923:9;7919:19;7906:33;7896:43;;7986:3;7975:9;7971:19;7958:33;7948:43;;8038:3;8027:9;8023:19;8010:33;8000:43;;8062:36;8093:3;8082:9;8078:19;8062:36;:::i;:::-;8052:46;;8117:36;8148:3;8137:9;8133:19;8117:36;:::i;:::-;8107:46;;7429:730;;;;;;;;;;;:::o;8164:257::-;8205:3;8243:5;8237:12;8270:6;8265:3;8258:19;8286:63;8342:6;8335:4;8330:3;8326:14;8319:4;8312:5;8308:16;8286:63;:::i;:::-;8403:2;8382:15;-1:-1:-1;;8378:29:1;8369:39;;;;8410:4;8365:50;;8164:257;-1:-1:-1;;8164:257:1:o;8426:973::-;8511:12;;8476:3;;8566:1;8586:18;;;;8639;;;;8666:61;;8720:4;8712:6;8708:17;8698:27;;8666:61;8746:2;8794;8786:6;8783:14;8763:18;8760:38;8757:161;;;8840:10;8835:3;8831:20;8828:1;8821:31;8875:4;8872:1;8865:15;8903:4;8900:1;8893:15;8757:161;8934:18;8961:104;;;;9079:1;9074:319;;;;8927:466;;8961:104;-1:-1:-1;;8994:24:1;;8982:37;;9039:16;;;;-1:-1:-1;8961:104:1;;9074:319;27852:1;27845:14;;;27889:4;27876:18;;9168:1;9182:165;9196:6;9193:1;9190:13;9182:165;;;9274:14;;9261:11;;;9254:35;9317:16;;;;9211:10;;9182:165;;;9186:3;;9376:6;9371:3;9367:16;9360:23;;8927:466;;;;;;;8426:973;;;;:::o;9638:456::-;9859:3;9887:38;9921:3;9913:6;9887:38;:::i;:::-;9954:6;9948:13;9970:52;10015:6;10011:2;10004:4;9996:6;9992:17;9970:52;:::i;:::-;10038:50;10080:6;10076:2;10072:15;10064:6;10038:50;:::i;:::-;10031:57;9638:456;-1:-1:-1;;;;;;;9638:456:1:o;10517:488::-;-1:-1:-1;;;;;10786:15:1;;;10768:34;;10838:15;;10833:2;10818:18;;10811:43;10885:2;10870:18;;10863:34;;;10933:3;10928:2;10913:18;;10906:31;;;10711:4;;10954:45;;10979:19;;10971:6;10954:45;:::i;:::-;10946:53;10517:488;-1:-1:-1;;;;;;10517:488:1:o;11663:219::-;11812:2;11801:9;11794:21;11775:4;11832:44;11872:2;11861:9;11857:18;11849:6;11832:44;:::i;13355:414::-;13557:2;13539:21;;;13596:2;13576:18;;;13569:30;13635:34;13630:2;13615:18;;13608:62;-1:-1:-1;;;13701:2:1;13686:18;;13679:48;13759:3;13744:19;;13355:414::o;21042:356::-;21244:2;21226:21;;;21263:18;;;21256:30;21322:34;21317:2;21302:18;;21295:62;21389:2;21374:18;;21042:356::o;24294:413::-;24496:2;24478:21;;;24535:2;24515:18;;;24508:30;24574:34;24569:2;24554:18;;24547:62;-1:-1:-1;;;24640:2:1;24625:18;;24618:47;24697:3;24682:19;;24294:413::o;27905:128::-;27945:3;27976:1;27972:6;27969:1;27966:13;27963:39;;;27982:18;;:::i;:::-;-1:-1:-1;28018:9:1;;27905:128::o;28038:120::-;28078:1;28104;28094:35;;28109:18;;:::i;:::-;-1:-1:-1;28143:9:1;;28038:120::o;28163:168::-;28203:7;28269:1;28265;28261:6;28257:14;28254:1;28251:21;28246:1;28239:9;28232:17;28228:45;28225:71;;;28276:18;;:::i;:::-;-1:-1:-1;28316:9:1;;28163:168::o;28336:125::-;28376:4;28404:1;28401;28398:8;28395:34;;;28409:18;;:::i;:::-;-1:-1:-1;28446:9:1;;28336:125::o;28466:258::-;28538:1;28548:113;28562:6;28559:1;28556:13;28548:113;;;28638:11;;;28632:18;28619:11;;;28612:39;28584:2;28577:10;28548:113;;;28679:6;28676:1;28673:13;28670:48;;;-1:-1:-1;;28714:1:1;28696:16;;28689:27;28466:258::o;28729:380::-;28808:1;28804:12;;;;28851;;;28872:61;;28926:4;28918:6;28914:17;28904:27;;28872:61;28979:2;28971:6;28968:14;28948:18;28945:38;28942:161;;;29025:10;29020:3;29016:20;29013:1;29006:31;29060:4;29057:1;29050:15;29088:4;29085:1;29078:15;28942:161;;28729:380;;;:::o;29114:135::-;29153:3;-1:-1:-1;;29174:17:1;;29171:43;;;29194:18;;:::i;:::-;-1:-1:-1;29241:1:1;29230:13;;29114:135::o;29254:112::-;29286:1;29312;29302:35;;29317:18;;:::i;:::-;-1:-1:-1;29351:9:1;;29254:112::o;29371:127::-;29432:10;29427:3;29423:20;29420:1;29413:31;29463:4;29460:1;29453:15;29487:4;29484:1;29477:15;29503:127;29564:10;29559:3;29555:20;29552:1;29545:31;29595:4;29592:1;29585:15;29619:4;29616:1;29609:15;29635:127;29696:10;29691:3;29687:20;29684:1;29677:31;29727:4;29724:1;29717:15;29751:4;29748:1;29741:15;29767:127;29828:10;29823:3;29819:20;29816:1;29809:31;29859:4;29856:1;29849:15;29883:4;29880:1;29873:15;29899:127;29960:10;29955:3;29951:20;29948:1;29941:31;29991:4;29988:1;29981:15;30015:4;30012:1;30005:15;30031:131;-1:-1:-1;;;;;;30105:32:1;;30095:43;;30085:71;;30152:1;30149;30142:12
Swarm Source
ipfs://97e95ce562b605b1b916d0f3ac9fa315c8340145b93831eb3209a573eb458aaa
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.