Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
30 HV
Holders
21
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 HVLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Hornyverse
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-23 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // 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/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.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: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // 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: contracts/Hornyverse.sol pragma solidity ^0.8.16; contract Hornyverse is ERC721, ERC721Enumerable, ReentrancyGuard, Pausable, Ownable { using Strings for uint256; string public baseURI = "https://static.hornyverse.wtf/nft/meta/"; address public mintWallet = 0x08A1937da630b82d4321191209Fbf3B0C38A6A93; uint256 public constant maxSupply = 5200; uint256 public maxCardNo = 13; uint256 public maxCardNoQty = 400; mapping(uint256 => uint256) public countCardNo; uint256 allowlistStartAt = 0; uint256 allowlistEndAt = 0; uint256 allowlistPrice = 0; uint256 allowlistQty = 0; mapping(address => bool) public allowlist; uint256 publicStartAt = 0; uint256 publicPrice = 0; uint256 publicLimitQty = 0; mapping(address => mapping(uint256 => uint256[])) public holderTokens; uint256 claimStartAt = 0; uint256 claimEndAt = 0; uint256 claimTotalPrize = 0; uint256 claimPerPrize = 0; uint256 claimWithdraw = 0; uint256 claimCode; uint256[] claimNo; mapping(uint256 => mapping(uint256 => address)) public claimRecord; uint256[] claimRecordTokens; event claimTokens(uint256[] tokens); constructor() ERC721("Hornyverse", "HV") {} //-------------------// // SET // //-------------------// function setAllowlistData(uint256 startAt, uint256 endAt, uint256 price, uint256 limitQty) external onlyOwner { require(startAt != 0, 'Start time cannot be 0'); require(endAt > startAt, 'The end time must be greater than the start time'); allowlistStartAt = startAt; allowlistEndAt = endAt; allowlistPrice = price; allowlistQty = limitQty; } function resetAllowlistData() external onlyOwner { allowlistStartAt = 0; allowlistEndAt = 0; allowlistPrice = 0; allowlistQty = 0; } function setPublicData(uint256 startAt, uint256 price, uint256 limitQty) external onlyOwner { require(startAt != 0, 'Start time cannot be 0'); publicStartAt = startAt; publicPrice = price; publicLimitQty = limitQty; } function resetPublicData() external onlyOwner { publicStartAt = 0; publicPrice = 0; publicLimitQty = 0; } function addAllowlist(address[] memory account) external onlyOwner { for (uint256 i = 0; i < account.length; i++) { if (account[i] != address(0)) { allowlist[account[i]] = true; } } } function removeAllowlist(address[] memory account) external onlyOwner { for (uint256 i = 0; i < account.length; i++) { if (account[i] != address(0)) { allowlist[account[i]] = false; } } } function setClaimData(uint256 startAt, uint256 endAt, uint256 totalPrize, uint256 perPrize) external onlyOwner { require(startAt != 0, 'Start time cannot be 0'); require(endAt > startAt, 'The end time must be greater than the start time'); require(address(this).balance >= totalPrize, 'Not enough contract amount'); require(totalPrize > perPrize, 'totalPrize must be greater than the perPrize'); claimStartAt = startAt; claimEndAt = endAt; claimTotalPrize = totalPrize; claimPerPrize = perPrize; } function resetClaim() external onlyOwner { claimStartAt = 0; claimEndAt = 0; claimTotalPrize = 0; claimPerPrize = 0; claimWithdraw = 0; claimCode = 0; delete claimNo; delete claimRecordTokens; } function setClaimNo(uint256 _claimCode, uint256[] memory _claimNo) external onlyOwner { require(_claimCode != 0, 'Claim code cannot be set to 0'); require(_claimCode != claimCode, 'Claim code cannot be the same'); claimCode = _claimCode; claimNo = _claimNo; delete claimRecordTokens; } //-------------------// // GET // //-------------------// function getPublicData() public view returns (uint256 _startAt, uint256 _price, uint256 _limitQty) { _startAt = publicStartAt; _price = publicPrice; _limitQty = publicLimitQty; } function getAllowlistData() public view returns (uint256 _startAt, uint256 _endAt, uint256 _price, uint256 _limitQty) { _startAt = allowlistStartAt; _endAt = allowlistEndAt; _price = allowlistPrice; _limitQty = allowlistQty; } function getTokenIds(address account) public view returns (uint256[] memory) { uint256[] memory tokenIds = new uint256[](balanceOf(account)); uint index = 0; for (uint256 cardNo = 1; cardNo <= maxCardNo; cardNo++) { for (uint256 i = 0; i < holderTokens[account][cardNo].length; i++) { tokenIds[index] = holderTokens[account][cardNo][i]; index++; } } return tokenIds; } function getClaimData() public view returns (uint256 _startAt, uint256 _endAt, uint256 _totalPrize, uint256 _perPrize, uint256 _withdraw, uint256 _code, uint256[] memory _no) { _startAt = claimStartAt; _endAt = claimEndAt; _totalPrize = claimTotalPrize; _perPrize = claimPerPrize; _withdraw = claimWithdraw; _code = claimCode; _no = claimNo; } function isAllowlist(address account) public view returns (bool status) { status = allowlist[account]; } function hasClaimed(uint256 tokenId) public view returns (bool) { return claimRecord[claimCode][tokenId] != address(0); } function getClaimTokenIds() public view returns (uint256[] memory tokenIds) { tokenIds = new uint256[](claimRecordTokens.length); for (uint256 i = 0; i < claimRecordTokens.length; i++) { tokenIds[i] = claimRecordTokens[i]; } } //-------------------// // FUNCTION // //-------------------// function ownerMint(address account, uint256 qty) external onlyOwner { require(account != address(0), 'Account cannot be 0'); require(qty > 0, "Mint amount cannot be 0"); require(totalSupply() + qty <= maxSupply, "Sold out"); for (uint256 i = 0; i < qty; i++) { uint256 tokenId = _getTokenId(); _safeMint(account, tokenId); } } function allowlistMint(uint256 qty) external whenNotPaused validMint(allowlistStartAt, qty, allowlistPrice) nonReentrant payable { require(block.timestamp >= allowlistStartAt, 'mint has not started'); require(block.timestamp <= allowlistEndAt, 'mint has ended'); require(balanceOf(msg.sender) + qty <= allowlistQty, 'Exceed the mint limit'); require(allowlist[msg.sender] == true, "Not in the allowlist"); (bool succeed,) = payable(mintWallet).call{value : msg.value}(""); require(succeed, "Transfer failed"); for (uint256 i = 0; i < qty; i++) { uint256 tokenId = _getTokenId(); _safeMint(msg.sender, tokenId); } } function publicMint(uint256 qty) external whenNotPaused validMint(publicStartAt, qty, publicPrice) nonReentrant payable { require(block.timestamp >= publicStartAt, 'mint has not started'); require(balanceOf(msg.sender) + qty <= publicLimitQty, 'Exceed the mint limit'); (bool succeed,) = payable(mintWallet).call{value : msg.value}(""); require(succeed, "Transfer failed"); for (uint256 i = 0; i < qty; i++) { uint256 tokenId = _getTokenId(); _safeMint(msg.sender, tokenId); } } function claim() external whenNotPaused nonReentrant { require(claimStartAt != 0, 'claim is not enabled yet'); require(block.timestamp >= claimStartAt, 'Claim has not started'); require(block.timestamp <= claimEndAt, 'Claim has ended'); require(claimTotalPrize > 0, 'No prize'); require(claimPerPrize > 0, 'No prize has been allocated yet'); require(claimWithdraw < claimTotalPrize, 'The prize has been withdrawn'); require(claimCode != 0, 'Claim code not set'); require(claimNo.length > 0, 'No claim number'); require(balanceOf(msg.sender) >= claimNo.length, 'Insufficient number of tokens'); uint256 prize = 0; (uint256[] memory tokens, uint256 claimQty) = _getClaimTokens(msg.sender); while (claimQty == claimNo.length) { for (uint256 i = 0; i < tokens.length; i++) { claimRecord[claimCode][tokens[i]] = msg.sender; claimRecordTokens.push(tokens[i]); } prize += claimPerPrize; emit claimTokens(tokens); (tokens, claimQty) = _getClaimTokens(msg.sender); } if (prize > 0) { require(address(this).balance >= prize, 'Insufficient balance'); require(claimWithdraw + prize <= claimTotalPrize, 'claim prize cannot exceed the total prize'); claimWithdraw += prize; (bool success,) = payable(msg.sender).call{value : prize}(""); require(success, 'Transfer failed'); } } function singleClaim() external whenNotPaused nonReentrant { require(claimStartAt != 0, 'claim is not enabled yet'); require(block.timestamp >= claimStartAt, 'Claim has not started'); require(block.timestamp <= claimEndAt, 'Claim has ended'); require(claimTotalPrize > 0, 'No prize'); require(claimPerPrize > 0, 'No prize has been allocated yet'); require(claimWithdraw < claimTotalPrize, 'The prize has been withdrawn'); require(claimCode != 0, 'Claim code not set'); require(claimNo.length > 0, 'No claim number'); require(balanceOf(msg.sender) >= claimNo.length, 'Insufficient number of tokens'); uint256 prize = 0; (uint256[] memory tokens, uint256 claimQty) = _getClaimTokens(msg.sender); if (claimQty == claimNo.length) { for (uint256 i = 0; i < tokens.length; i++) { claimRecord[claimCode][tokens[i]] = msg.sender; claimRecordTokens.push(tokens[i]); } prize += claimPerPrize; emit claimTokens(tokens); } if (prize > 0) { require(address(this).balance >= prize, 'Insufficient balance'); require(claimWithdraw + prize <= claimTotalPrize, 'claim prize cannot exceed the total prize'); claimWithdraw += prize; (bool success,) = payable(msg.sender).call{value : prize}(""); require(success, 'Transfer failed'); } } //-------------------// // Private FUNCTION // //-------------------// function _getTokenId() private whenNotPaused returns (uint256 tokenId) { uint256 cardNo = (uint256(sha256(abi.encodePacked(uint160(msg.sender) + block.timestamp + totalSupply()))) % maxCardNo) + 1; while (countCardNo[cardNo] >= maxCardNoQty) { if (cardNo >= maxCardNo) { cardNo = 1; } else { cardNo++; } } uint256 cardNoQtyId = (uint256(sha256(abi.encodePacked(uint160(msg.sender) + block.timestamp + totalSupply()))) % maxCardNoQty) + 1; tokenId = _buildTokenId(cardNo, cardNoQtyId); while (_exists(tokenId)) { if (cardNoQtyId >= maxCardNoQty) { cardNoQtyId = 1; } else { cardNoQtyId++; } tokenId = _buildTokenId(cardNo, cardNoQtyId); } countCardNo[cardNo]++; } function _buildTokenId(uint256 cardNo, uint256 cardNoQtyId) private pure returns (uint256) { return (cardNo * 1e3) + cardNoQtyId; } function _getClaimTokens(address account) private view returns (uint256[] memory tokens, uint256 claimQty) { tokens = new uint256[](claimNo.length); for (uint256 i = 0; i < claimNo.length; i++) { for (uint256 j = 0; j < holderTokens[account][claimNo[i]].length; j++) { if (claimRecord[claimCode][holderTokens[account][claimNo[i]][j]] != address(0)) { continue; } bool isExist = false; for (uint256 k = 0; k < tokens.length; k++) { if (tokens[k] == holderTokens[account][claimNo[i]][j]) { isExist = true; break; } } if (isExist) { continue; } tokens[claimQty] = holderTokens[account][claimNo[i]][j]; claimQty++; break; } } return (tokens, claimQty); } function _getCardNo(uint256 tokenId) private pure returns (uint256 cardNo) { cardNo = tokenId / 1e3; } function _removeHolderToken(address account, uint256 cardNo, uint256 tokenId) private { uint index = 0; for (uint256 i = 0; i < holderTokens[account][cardNo].length; i++) { if (holderTokens[account][cardNo][i] == tokenId) { index = i; break; } } holderTokens[account][cardNo][index] = holderTokens[account][cardNo][holderTokens[account][cardNo].length - 1]; holderTokens[account][cardNo].pop(); } //-------------------// // Validation // //-------------------// modifier validMint(uint256 startAt, uint256 qty, uint256 price) { require(msg.sender != address(0), "Invalid address"); require(qty > 0, 'Mint quantity cannot be 0'); require(startAt != 0, 'mint is not enabled yet'); require(totalSupply() + qty <= maxSupply, "Sold out"); require(msg.value >= qty * price, 'Not enough ETH'); _; } //-------------------// // Bedding // //-------------------// function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); uint256 cardNo = _getCardNo(tokenId); if (from == address(0)) { holderTokens[to][cardNo].push(tokenId); } else if (to == address(0)) { _removeHolderToken(from, cardNo, tokenId); } else { _removeHolderToken(from, cardNo, tokenId); holderTokens[to][cardNo].push(tokenId); } } function tokenURI(uint256 tokenId) public view override returns (string memory) { _requireMinted(tokenId); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } function withdraw(address receiver, uint256 amount) external onlyOwner { require(receiver != address(0), 'Invalid address'); require(address(this).balance >= amount, 'Insufficient balance'); (bool success,) = payable(receiver).call{value : amount}(""); require(success, 'Transfer failed'); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } receive() external payable {} fallback() external {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"claimTokens","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[{"internalType":"address[]","name":"account","type":"address[]"}],"name":"addAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimRecord","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"countCardNo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllowlistData","outputs":[{"internalType":"uint256","name":"_startAt","type":"uint256"},{"internalType":"uint256","name":"_endAt","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_limitQty","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimData","outputs":[{"internalType":"uint256","name":"_startAt","type":"uint256"},{"internalType":"uint256","name":"_endAt","type":"uint256"},{"internalType":"uint256","name":"_totalPrize","type":"uint256"},{"internalType":"uint256","name":"_perPrize","type":"uint256"},{"internalType":"uint256","name":"_withdraw","type":"uint256"},{"internalType":"uint256","name":"_code","type":"uint256"},{"internalType":"uint256[]","name":"_no","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimTokenIds","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicData","outputs":[{"internalType":"uint256","name":"_startAt","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_limitQty","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"holderTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAllowlist","outputs":[{"internalType":"bool","name":"status","type":"bool"}],"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":"maxCardNo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCardNoQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintWallet","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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"account","type":"address[]"}],"name":"removeAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetAllowlistData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetPublicData","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":"uint256","name":"startAt","type":"uint256"},{"internalType":"uint256","name":"endAt","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"limitQty","type":"uint256"}],"name":"setAllowlistData","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":"uint256","name":"startAt","type":"uint256"},{"internalType":"uint256","name":"endAt","type":"uint256"},{"internalType":"uint256","name":"totalPrize","type":"uint256"},{"internalType":"uint256","name":"perPrize","type":"uint256"}],"name":"setClaimData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimCode","type":"uint256"},{"internalType":"uint256[]","name":"_claimNo","type":"uint256[]"}],"name":"setClaimNo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startAt","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"limitQty","type":"uint256"}],"name":"setPublicData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"singleClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040526027608081815290620048ee60a039600c906200002290826200021c565b50600d80546001600160a01b0319167308a1937da630b82d4321191209fbf3b0c38a6a93178155600e55610190600f5560006011819055601281905560138190556014819055601681905560178190556018819055601a819055601b819055601c819055601d819055601e553480156200009b57600080fd5b506040518060400160405280600a815260200169486f726e79766572736560b01b81525060405180604001604052806002815260200161242b60f11b8152508160009081620000eb91906200021c565b506001620000fa82826200021c565b50506001600a5550600b805460ff1916905562000117336200011d565b620002e8565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001a257607f821691505b602082108103620001c357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200021757600081815260208120601f850160051c81016020861015620001f25750805b601f850160051c820191505b818110156200021357828155600101620001fe565b5050505b505050565b81516001600160401b0381111562000238576200023862000177565b62000250816200024984546200018d565b84620001c9565b602080601f8311600181146200028857600084156200026f5750858301515b600019600386901b1c1916600185901b17855562000213565b600085815260208120601f198616915b82811015620002b95788860151825594840194600190910190840162000298565b5085821015620002d85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6145f680620002f86000396000f3fe60806040526004361061031e5760003560e01c80638973d3ba116101ab578063c87b56dd116100f7578063e985e9c511610095578063eef260981161006f578063eef26098146109b1578063f2fde38b146109de578063f3fef3a3146109fe578063f7be084814610a1e57610325565b8063e985e9c514610933578063ec2ca7bc1461097c578063eca665a11461099c57610325565b8063d5abeb01116100d1578063d5abeb01146108c7578063dff8f340146108dd578063e084c4d9146108fd578063e547f9c21461091d57610325565b8063c87b56dd14610835578063ce51650714610855578063d004b0361461089a57610325565b8063a22cb46511610164578063b6b5f74a1161013e578063b6b5f74a14610798578063b88d4fde146107d1578063bf7ce742146107f1578063c180526a1461082257610325565b8063a22cb46514610733578063a4e1b17814610753578063a7cd52cb1461076857610325565b80638973d3ba146106865780638d118b0f146106a65780638da5cb5b146106c65780639387e6dd146106e957806395d89b41146107095780639e17ca691461071e57610325565b8063484b973c1161026a578063624e2b10116102235780636c350ba6116101fd5780636c350ba61461060357806370a082311461063c578063715018a61461065c5780638456cb591461067157610325565b8063624e2b10146105a65780636352211e146105ce5780636c0360eb146105ee57610325565b8063484b973c146104e35780634e71d92d146105035780634f6ccce714610518578063553ea3e9146105385780635561c11b1461054d5780635c975abb1461058e57610325565b806323b872dd116102d75780632f745c59116102b15780632f745c591461046e5780633f3c17a21461048e5780633f4ba83a146104ae57806342842e0e146104c357610325565b806323b872dd1461041b5780632617dd4d1461043b5780632db115441461045b57610325565b806301ffc9a71461033357806306fdde0314610368578063078386ec1461038a578063081812fc146103ae578063095ea7b3146103e657806318160ddd1461040657610325565b3661032557005b34801561033157600080fd5b005b34801561033f57600080fd5b5061035361034e366004613c0b565b610a33565b60405190151581526020015b60405180910390f35b34801561037457600080fd5b5061037d610a44565b60405161035f9190613c78565b34801561039657600080fd5b506103a0600f5481565b60405190815260200161035f565b3480156103ba57600080fd5b506103ce6103c9366004613c8b565b610ad6565b6040516001600160a01b03909116815260200161035f565b3480156103f257600080fd5b50610331610401366004613cc0565b610afd565b34801561041257600080fd5b506008546103a0565b34801561042757600080fd5b50610331610436366004613cea565b610c17565b34801561044757600080fd5b50610331610456366004613d91565b610c48565b610331610469366004613c8b565b610cfd565b34801561047a57600080fd5b506103a0610489366004613cc0565b610fc0565b34801561049a57600080fd5b506103316104a9366004613e2e565b611056565b3480156104ba57600080fd5b506103316110b1565b3480156104cf57600080fd5b506103316104de366004613cea565b6110c3565b3480156104ef57600080fd5b506103316104fe366004613cc0565b6110de565b34801561050f57600080fd5b506103316111eb565b34801561052457600080fd5b506103a0610533366004613c8b565b611705565b34801561054457600080fd5b50610331611798565b34801561055957600080fd5b506103ce610568366004613e60565b60216020908152600092835260408084209091529082529020546001600160a01b031681565b34801561059a57600080fd5b50600b5460ff16610353565b3480156105b257600080fd5b506105bb6117d8565b60405161035f9796959493929190613ebd565b3480156105da57600080fd5b506103ce6105e9366004613c8b565b611844565b3480156105fa57600080fd5b5061037d6118a4565b34801561060f57600080fd5b5061035361061e366004613f01565b6001600160a01b031660009081526015602052604090205460ff1690565b34801561064857600080fd5b506103a0610657366004613f01565b611932565b34801561066857600080fd5b506103316119b8565b34801561067d57600080fd5b506103316119ca565b34801561069257600080fd5b506103a06106a1366004613f1c565b6119da565b3480156106b257600080fd5b506103316106c1366004613f4f565b611a18565b3480156106d257600080fd5b50600b5461010090046001600160a01b03166103ce565b3480156106f557600080fd5b50610331610704366004613d91565b611a4e565b34801561071557600080fd5b5061037d611aff565b34801561072a57600080fd5b50610331611b0e565b34801561073f57600080fd5b5061033161074e366004613f7b565b611b2c565b34801561075f57600080fd5b50610331611b37565b34801561077457600080fd5b50610353610783366004613f01565b60156020526000908152604090205460ff1681565b3480156107a457600080fd5b5060115460125460135460145460408051948552602085019390935291830152606082015260800161035f565b3480156107dd57600080fd5b506103316107ec366004613fb7565b611b50565b3480156107fd57600080fd5b506016546017546018546040805193845260208401929092529082015260600161035f565b610331610830366004613c8b565b611b88565b34801561084157600080fd5b5061037d610850366004613c8b565b611edc565b34801561086157600080fd5b50610353610870366004613c8b565b601f54600090815260216020908152604080832093835292905220546001600160a01b0316151590565b3480156108a657600080fd5b506108ba6108b5366004613f01565b611f43565b60405161035f9190614077565b3480156108d357600080fd5b506103a061145081565b3480156108e957600080fd5b50600d546103ce906001600160a01b031681565b34801561090957600080fd5b50610331610918366004613e2e565b612069565b34801561092957600080fd5b506103a0600e5481565b34801561093f57600080fd5b5061035361094e36600461408a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561098857600080fd5b506103316109973660046140bd565b612178565b3480156109a857600080fd5b50610331612245565b3480156109bd57600080fd5b506103a06109cc366004613c8b565b60106020526000908152604090205481565b3480156109ea57600080fd5b506103316109f9366004613f01565b612650565b348015610a0a57600080fd5b50610331610a19366004613cc0565b6126c9565b348015610a2a57600080fd5b506108ba61278a565b6000610a3e82612832565b92915050565b606060008054610a539061415a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7f9061415a565b8015610acc5780601f10610aa157610100808354040283529160200191610acc565b820191906000526020600020905b815481529060010190602001808311610aaf57829003601f168201915b5050505050905090565b6000610ae182612857565b506000908152600460205260409020546001600160a01b031690565b6000610b0882611844565b9050806001600160a01b0316836001600160a01b031603610b7a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610b965750610b96813361094e565b610c085760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610b71565b610c1283836128b6565b505050565b610c213382612924565b610c3d5760405162461bcd60e51b8152600401610b7190614194565b610c128383836129a3565b610c50612b4a565b60005b8151811015610cf95760006001600160a01b0316828281518110610c7957610c796141e2565b60200260200101516001600160a01b031614610ce757600160156000848481518110610ca757610ca76141e2565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80610cf18161420e565b915050610c53565b5050565b610d05612baa565b601654601754829033610d2a5760405162461bcd60e51b8152600401610b7190614227565b60008211610d765760405162461bcd60e51b815260206004820152601960248201527804d696e74207175616e746974792063616e6e6f74206265203603c1b6044820152606401610b71565b82600003610dc05760405162461bcd60e51b81526020600482015260176024820152761b5a5b9d081a5cc81b9bdd08195b98589b1959081e595d604a1b6044820152606401610b71565b61145082610dcd60085490565b610dd79190614250565b1115610df55760405162461bcd60e51b8152600401610b7190614263565b610dff8183614285565b341015610e3f5760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b6044820152606401610b71565b6002600a5403610e615760405162461bcd60e51b8152600401610b71906142a4565b6002600a55601654421015610eaf5760405162461bcd60e51b81526020600482015260146024820152731b5a5b9d081a185cc81b9bdd081cdd185c9d195960621b6044820152606401610b71565b60185484610ebc33611932565b610ec69190614250565b1115610f0c5760405162461bcd60e51b8152602060048201526015602482015274115e18d95959081d1a19481b5a5b9d081b1a5b5a5d605a1b6044820152606401610b71565b600d546040516000916001600160a01b03169034908381818185875af1925050503d8060008114610f59576040519150601f19603f3d011682016040523d82523d6000602084013e610f5e565b606091505b5050905080610f7f5760405162461bcd60e51b8152600401610b71906142db565b60005b85811015610fb3576000610f94612bf0565b9050610fa03382612e01565b5080610fab8161420e565b915050610f82565b50506001600a5550505050565b6000610fcb83611932565b821061102d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b71565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61105e612b4a565b8360000361107e5760405162461bcd60e51b8152600401610b7190614304565b83831161109d5760405162461bcd60e51b8152600401610b7190614334565b601193909355601291909155601355601455565b6110b9612b4a565b6110c1612e1b565b565b610c1283838360405180602001604052806000815250611b50565b6110e6612b4a565b6001600160a01b0382166111325760405162461bcd60e51b815260206004820152601360248201527204163636f756e742063616e6e6f74206265203606c1b6044820152606401610b71565b600081116111825760405162461bcd60e51b815260206004820152601760248201527f4d696e7420616d6f756e742063616e6e6f7420626520300000000000000000006044820152606401610b71565b6114508161118f60085490565b6111999190614250565b11156111b75760405162461bcd60e51b8152600401610b7190614263565b60005b81811015610c125760006111cc612bf0565b90506111d88482612e01565b50806111e38161420e565b9150506111ba565b6111f3612baa565b6002600a54036112155760405162461bcd60e51b8152600401610b71906142a4565b6002600a55601a546000036112675760405162461bcd60e51b815260206004820152601860248201527718db185a5b481a5cc81b9bdd08195b98589b1959081e595d60421b6044820152606401610b71565b601a544210156112b15760405162461bcd60e51b815260206004820152601560248201527410db185a5b481a185cc81b9bdd081cdd185c9d1959605a1b6044820152606401610b71565b601b544211156112f55760405162461bcd60e51b815260206004820152600f60248201526e10db185a5b481a185cc8195b991959608a1b6044820152606401610b71565b6000601c54116113325760405162461bcd60e51b81526020600482015260086024820152674e6f207072697a6560c01b6044820152606401610b71565b6000601d54116113845760405162461bcd60e51b815260206004820152601f60248201527f4e6f207072697a6520686173206265656e20616c6c6f636174656420796574006044820152606401610b71565b601c54601e54106113d75760405162461bcd60e51b815260206004820152601c60248201527f546865207072697a6520686173206265656e2077697468647261776e000000006044820152606401610b71565b601f5460000361141e5760405162461bcd60e51b815260206004820152601260248201527110db185a5b4818dbd919481b9bdd081cd95d60721b6044820152606401610b71565b60205461145f5760405162461bcd60e51b815260206004820152600f60248201526e27379031b630b4b690373ab6b132b960891b6044820152606401610b71565b60205461146b33611932565b10156114b95760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e74206e756d626572206f6620746f6b656e730000006044820152606401610b71565b600080806114c633612e6d565b915091505b60205481036115e35760005b8251811015611589573360216000601f548152602001908152602001600020600085848151811061150a5761150a6141e2565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506022838281518110611558576115586141e2565b60209081029190910181015182546001810184556000938452919092200155806115818161420e565b9150506114d7565b50601d546115979084614250565b92507f2d08265af3ae2634f524584011369f676de29c0c73122fa33d7860eecc111c2f826040516115c89190614077565b60405180910390a16115d933612e6d565b90925090506114cb565b82156116fb57824710156116095760405162461bcd60e51b8152600401610b7190614384565b601c5483601e5461161a9190614250565b111561167a5760405162461bcd60e51b815260206004820152602960248201527f636c61696d207072697a652063616e6e6f74206578636565642074686520746f60448201526874616c207072697a6560b81b6064820152608401610b71565b82601e600082825461168c9190614250565b9091555050604051600090339085908381818185875af1925050503d80600081146116d3576040519150601f19603f3d011682016040523d82523d6000602084013e6116d8565b606091505b50509050806116f95760405162461bcd60e51b8152600401610b71906142db565b505b50506001600a5550565b600061171060085490565b82106117735760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b71565b60088281548110611786576117866141e2565b90600052602060002001549050919050565b6117a0612b4a565b6000601a819055601b819055601c819055601d819055601e819055601f8190556117cc90602090613b7f565b6110c160226000613b7f565b601a54601b54601c54601d54601e54601f5460208054604080518284028101840190915281815260609290918282018282801561183457602002820191906000526020600020905b815481526020019060010190808311611820575b5050505050905090919293949596565b6000818152600260205260408120546001600160a01b031680610a3e5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610b71565b600c80546118b19061415a565b80601f01602080910402602001604051908101604052809291908181526020018280546118dd9061415a565b801561192a5780601f106118ff5761010080835404028352916020019161192a565b820191906000526020600020905b81548152906001019060200180831161190d57829003601f168201915b505050505081565b60006001600160a01b03821661199c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610b71565b506001600160a01b031660009081526003602052604090205490565b6119c0612b4a565b6110c16000613149565b6119d2612b4a565b6110c16131a3565b60196020528260005260406000206020528160005260406000208181548110611a0257600080fd5b9060005260206000200160009250925050505481565b611a20612b4a565b82600003611a405760405162461bcd60e51b8152600401610b7190614304565b601692909255601755601855565b611a56612b4a565b60005b8151811015610cf95760006001600160a01b0316828281518110611a7f57611a7f6141e2565b60200260200101516001600160a01b031614611aed57600060156000848481518110611aad57611aad6141e2565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80611af78161420e565b915050611a59565b606060018054610a539061415a565b611b16612b4a565b6000601181905560128190556013819055601455565b610cf93383836131e0565b611b3f612b4a565b600060168190556017819055601855565b611b5a3383612924565b611b765760405162461bcd60e51b8152600401610b7190614194565b611b82848484846132ae565b50505050565b611b90612baa565b601154601354829033611bb55760405162461bcd60e51b8152600401610b7190614227565b60008211611c015760405162461bcd60e51b815260206004820152601960248201527804d696e74207175616e746974792063616e6e6f74206265203603c1b6044820152606401610b71565b82600003611c4b5760405162461bcd60e51b81526020600482015260176024820152761b5a5b9d081a5cc81b9bdd08195b98589b1959081e595d604a1b6044820152606401610b71565b61145082611c5860085490565b611c629190614250565b1115611c805760405162461bcd60e51b8152600401610b7190614263565b611c8a8183614285565b341015611cca5760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b6044820152606401610b71565b6002600a5403611cec5760405162461bcd60e51b8152600401610b71906142a4565b6002600a55601154421015611d3a5760405162461bcd60e51b81526020600482015260146024820152731b5a5b9d081a185cc81b9bdd081cdd185c9d195960621b6044820152606401610b71565b601254421115611d7d5760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d081a185cc8195b99195960921b6044820152606401610b71565b60145484611d8a33611932565b611d949190614250565b1115611dda5760405162461bcd60e51b8152602060048201526015602482015274115e18d95959081d1a19481b5a5b9d081b1a5b5a5d605a1b6044820152606401610b71565b3360009081526015602052604090205460ff161515600114611e355760405162461bcd60e51b8152602060048201526014602482015273139bdd081a5b881d1a1948185b1b1bdddb1a5cdd60621b6044820152606401610b71565b600d546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611e82576040519150601f19603f3d011682016040523d82523d6000602084013e611e87565b606091505b5050905080611ea85760405162461bcd60e51b8152600401610b71906142db565b60005b85811015610fb3576000611ebd612bf0565b9050611ec93382612e01565b5080611ed48161420e565b915050611eab565b6060611ee782612857565b6000600c8054611ef69061415a565b905011611f125760405180602001604052806000815250610a3e565b600c611f1d836132e1565b604051602001611f2e9291906143ce565b60405160208183030381529060405292915050565b60606000611f5083611932565b67ffffffffffffffff811115611f6857611f68613d26565b604051908082528060200260200182016040528015611f91578160200160208202803683370190505b509050600060015b600e5481116120605760005b6001600160a01b038616600090815260196020908152604080832085845290915290205481101561204d576001600160a01b03861660009081526019602090815260408083208584529091529020805482908110612005576120056141e2565b9060005260206000200154848481518110612022576120226141e2565b6020908102919091010152826120378161420e565b93505080806120459061420e565b915050611fa5565b50806120588161420e565b915050611f99565b50909392505050565b612071612b4a565b836000036120915760405162461bcd60e51b8152600401610b7190614304565b8383116120b05760405162461bcd60e51b8152600401610b7190614334565b814710156121005760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820636f6e747261637420616d6f756e740000000000006044820152606401610b71565b8082116121645760405162461bcd60e51b815260206004820152602c60248201527f746f74616c5072697a65206d7573742062652067726561746572207468616e2060448201526b746865207065725072697a6560a01b6064820152608401610b71565b601a93909355601b91909155601c55601d55565b612180612b4a565b816000036121d05760405162461bcd60e51b815260206004820152601d60248201527f436c61696d20636f64652063616e6e6f742062652073657420746f20300000006044820152606401610b71565b601f5482036122215760405162461bcd60e51b815260206004820152601d60248201527f436c61696d20636f64652063616e6e6f74206265207468652073616d650000006044820152606401610b71565b601f82905580516122389060209081840190613b9d565b50610cf960226000613b7f565b61224d612baa565b6002600a540361226f5760405162461bcd60e51b8152600401610b71906142a4565b6002600a55601a546000036122c15760405162461bcd60e51b815260206004820152601860248201527718db185a5b481a5cc81b9bdd08195b98589b1959081e595d60421b6044820152606401610b71565b601a5442101561230b5760405162461bcd60e51b815260206004820152601560248201527410db185a5b481a185cc81b9bdd081cdd185c9d1959605a1b6044820152606401610b71565b601b5442111561234f5760405162461bcd60e51b815260206004820152600f60248201526e10db185a5b481a185cc8195b991959608a1b6044820152606401610b71565b6000601c541161238c5760405162461bcd60e51b81526020600482015260086024820152674e6f207072697a6560c01b6044820152606401610b71565b6000601d54116123de5760405162461bcd60e51b815260206004820152601f60248201527f4e6f207072697a6520686173206265656e20616c6c6f636174656420796574006044820152606401610b71565b601c54601e54106124315760405162461bcd60e51b815260206004820152601c60248201527f546865207072697a6520686173206265656e2077697468647261776e000000006044820152606401610b71565b601f546000036124785760405162461bcd60e51b815260206004820152601260248201527110db185a5b4818dbd919481b9bdd081cd95d60721b6044820152606401610b71565b6020546124b95760405162461bcd60e51b815260206004820152600f60248201526e27379031b630b4b690373ab6b132b960891b6044820152606401610b71565b6020546124c533611932565b10156125135760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e74206e756d626572206f6620746f6b656e730000006044820152606401610b71565b6000808061252033612e6d565b602054919350915081036115e35760005b82518110156125e3573360216000601f5481526020019081526020016000206000858481518110612564576125646141e2565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060228382815181106125b2576125b26141e2565b60209081029190910181015182546001810184556000938452919092200155806125db8161420e565b915050612531565b50601d546125f19084614250565b92507f2d08265af3ae2634f524584011369f676de29c0c73122fa33d7860eecc111c2f826040516126229190614077565b60405180910390a182156116fb57824710156116095760405162461bcd60e51b8152600401610b7190614384565b612658612b4a565b6001600160a01b0381166126bd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b71565b6126c681613149565b50565b6126d1612b4a565b6001600160a01b0382166126f75760405162461bcd60e51b8152600401610b7190614227565b804710156127175760405162461bcd60e51b8152600401610b7190614384565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612764576040519150601f19603f3d011682016040523d82523d6000602084013e612769565b606091505b5050905080610c125760405162461bcd60e51b8152600401610b71906142db565b60225460609067ffffffffffffffff8111156127a8576127a8613d26565b6040519080825280602002602001820160405280156127d1578160200160208202803683370190505b50905060005b60225481101561282e57602281815481106127f4576127f46141e2565b9060005260206000200154828281518110612811576128116141e2565b6020908102919091010152806128268161420e565b9150506127d7565b5090565b60006001600160e01b0319821663780e9d6360e01b1480610a3e5750610a3e826133e2565b6000818152600260205260409020546001600160a01b03166126c65760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610b71565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906128eb82611844565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061293083611844565b9050806001600160a01b0316846001600160a01b0316148061297757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061299b5750836001600160a01b031661299084610ad6565b6001600160a01b0316145b949350505050565b826001600160a01b03166129b682611844565b6001600160a01b031614612a1a5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b71565b6001600160a01b038216612a7c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b71565b612a87838383613432565b612a926000826128b6565b6001600160a01b0383166000908152600360205260408120805460019290612abb908490614478565b90915550506001600160a01b0382166000908152600360205260408120805460019290612ae9908490614250565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b546001600160a01b036101009091041633146110c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b71565b600b5460ff16156110c15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b71565b6000612bfa612baa565b6000600e546002612c0a60085490565b612c144233614250565b612c1e9190614250565b604051602001612c3091815260200190565b60408051601f1981840301815290829052612c4a9161448b565b602060405180830381855afa158015612c67573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612c8a91906144a7565b612c9491906144d6565b612c9f906001614250565b90505b600f5460008281526010602052604090205410612cdc57600e548110612cca57506001612ca2565b80612cd48161420e565b915050612ca2565b6000600f546002612cec60085490565b612cf64233614250565b612d009190614250565b604051602001612d1291815260200190565b60408051601f1981840301815290829052612d2c9161448b565b602060405180830381855afa158015612d49573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612d6c91906144a7565b612d7691906144d6565b612d81906001614250565b9050612d8d82826134f2565b92505b6000838152600260205260409020546001600160a01b031615612ddd57600f548110612dbe57506001612dcc565b80612dc88161420e565b9150505b612dd682826134f2565b9250612d90565b6000828152601060205260408120805491612df78361420e565b9190505550505090565b610cf9828260405180602001604052806000815250613512565b612e23613545565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60205460609060009067ffffffffffffffff811115612e8e57612e8e613d26565b604051908082528060200260200182016040528015612eb7578160200160208202803683370190505b50915060005b6020548110156131435760005b60196000866001600160a01b03166001600160a01b03168152602001908152602001600020600060208481548110612f0457612f046141e2565b906000526020600020015481526020019081526020016000208054905081101561313057601f5460009081526021602090815260408083206001600160a01b03891684526019835290832082549192849283919088908110612f6857612f686141e2565b906000526020600020015481526020019081526020016000208481548110612f9257612f926141e2565b600091825260208083209091015483528201929092526040019020546001600160a01b03160361311e576000805b85518110156130725760196000886001600160a01b03166001600160a01b03168152602001908152602001600020600060208681548110613003576130036141e2565b90600052602060002001548152602001908152602001600020838154811061302d5761302d6141e2565b906000526020600020015486828151811061304a5761304a6141e2565b6020026020010151036130605760019150613072565b8061306a8161420e565b915050612fc0565b50801561307f575061311e565b60196000876001600160a01b03166001600160a01b031681526020019081526020016000206000602085815481106130b9576130b96141e2565b9060005260206000200154815260200190815260200160002082815481106130e3576130e36141e2565b9060005260206000200154858581518110613100576131006141e2565b6020908102919091010152836131158161420e565b94505050613130565b806131288161420e565b915050612eca565b508061313b8161420e565b915050612ebd565b50915091565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6131ab612baa565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e503390565b816001600160a01b0316836001600160a01b0316036132415760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b71565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6132b98484846129a3565b6132c58484848461358e565b611b825760405162461bcd60e51b8152600401610b71906144ea565b6060816000036133085750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613332578061331c8161420e565b915061332b9050600a8361453c565b915061330c565b60008167ffffffffffffffff81111561334d5761334d613d26565b6040519080825280601f01601f191660200182016040528015613377576020820181803683370190505b5090505b841561299b5761338c600183614478565b9150613399600a866144d6565b6133a4906030614250565b60f81b8183815181106133b9576133b96141e2565b60200101906001600160f81b031916908160001a9053506133db600a8661453c565b945061337b565b60006001600160e01b031982166380ac58cd60e01b148061341357506001600160e01b03198216635b5e139f60e01b145b80610a3e57506301ffc9a760e01b6001600160e01b0319831614610a3e565b61343d83838361368f565b600061344882613747565b90506001600160a01b038416613490576001600160a01b0383166000908152601960209081526040808320848452825282208054600181018255908352912001829055611b82565b6001600160a01b0383166134ae576134a9848284613755565b611b82565b6134b9848284613755565b6001600160a01b038316600090815260196020908152604080832084845282528220805460018101825590835291200182905550505050565b600081613501846103e8614285565b61350b9190614250565b9392505050565b61351c83836138bd565b613529600084848461358e565b610c125760405162461bcd60e51b8152600401610b71906144ea565b600b5460ff166110c15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b71565b60006001600160a01b0384163b1561368457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906135d2903390899088908890600401614550565b6020604051808303816000875af192505050801561360d575060408051601f3d908101601f1916820190925261360a9181019061458d565b60015b61366a573d80801561363b576040519150601f19603f3d011682016040523d82523d6000602084013e613640565b606091505b5080516000036136625760405162461bcd60e51b8152600401610b71906144ea565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061299b565b506001949350505050565b6001600160a01b0383166136ea576136e581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61370d565b816001600160a01b0316836001600160a01b03161461370d5761370d8382613a0b565b6001600160a01b03821661372457610c1281613aa8565b826001600160a01b0316826001600160a01b031614610c1257610c128282613b3b565b6000610a3e6103e88361453c565b6000805b6001600160a01b03851660009081526019602090815260408083208784529091529020548110156137e6576001600160a01b038516600090815260196020908152604080832087845290915290208054849190839081106137bc576137bc6141e2565b9060005260206000200154036137d4578091506137e6565b806137de8161420e565b915050613759565b506001600160a01b03841660009081526019602090815260408083208684529091529020805461381890600190614478565b81548110613828576138286141e2565b60009182526020808320909101546001600160a01b03871683526019825260408084208785529092529120805483908110613865576138656141e2565b60009182526020808320909101929092556001600160a01b0386168152601982526040808220868352909252208054806138a1576138a16145aa565b6001900381819060005260206000200160009055905550505050565b6001600160a01b0382166139135760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b71565b6000818152600260205260409020546001600160a01b0316156139785760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b71565b61398460008383613432565b6001600160a01b03821660009081526003602052604081208054600192906139ad908490614250565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001613a1884611932565b613a229190614478565b600083815260076020526040902054909150808214613a75576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613aba90600190614478565b60008381526009602052604081205460088054939450909284908110613ae257613ae26141e2565b906000526020600020015490508060088381548110613b0357613b036141e2565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806138a1576138a16145aa565b6000613b4683611932565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b50805460008255906000526020600020908101906126c69190613be0565b828054828255906000526020600020908101928215613bd8579160200282015b82811115613bd8578251825591602001919060010190613bbd565b5061282e9291505b5b8082111561282e5760008155600101613be1565b6001600160e01b0319811681146126c657600080fd5b600060208284031215613c1d57600080fd5b813561350b81613bf5565b60005b83811015613c43578181015183820152602001613c2b565b50506000910152565b60008151808452613c64816020860160208601613c28565b601f01601f19169290920160200192915050565b60208152600061350b6020830184613c4c565b600060208284031215613c9d57600080fd5b5035919050565b80356001600160a01b0381168114613cbb57600080fd5b919050565b60008060408385031215613cd357600080fd5b613cdc83613ca4565b946020939093013593505050565b600080600060608486031215613cff57600080fd5b613d0884613ca4565b9250613d1660208501613ca4565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613d6557613d65613d26565b604052919050565b600067ffffffffffffffff821115613d8757613d87613d26565b5060051b60200190565b60006020808385031215613da457600080fd5b823567ffffffffffffffff811115613dbb57600080fd5b8301601f81018513613dcc57600080fd5b8035613ddf613dda82613d6d565b613d3c565b81815260059190911b82018301908381019087831115613dfe57600080fd5b928401925b82841015613e2357613e1484613ca4565b82529284019290840190613e03565b979650505050505050565b60008060008060808587031215613e4457600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215613e7357600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015613eb257815187529582019590820190600101613e96565b509495945050505050565b8781528660208201528560408201528460608201528360808201528260a082015260e060c08201526000613ef460e0830184613e82565b9998505050505050505050565b600060208284031215613f1357600080fd5b61350b82613ca4565b600080600060608486031215613f3157600080fd5b613f3a84613ca4565b95602085013595506040909401359392505050565b600080600060608486031215613f6457600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613f8e57600080fd5b613f9783613ca4565b915060208301358015158114613fac57600080fd5b809150509250929050565b60008060008060808587031215613fcd57600080fd5b613fd685613ca4565b93506020613fe5818701613ca4565b935060408601359250606086013567ffffffffffffffff8082111561400957600080fd5b818801915088601f83011261401d57600080fd5b81358181111561402f5761402f613d26565b614041601f8201601f19168501613d3c565b9150808252898482850101111561405757600080fd5b808484018584013760008482840101525080935050505092959194509250565b60208152600061350b6020830184613e82565b6000806040838503121561409d57600080fd5b6140a683613ca4565b91506140b460208401613ca4565b90509250929050565b600080604083850312156140d057600080fd5b8235915060208084013567ffffffffffffffff8111156140ef57600080fd5b8401601f8101861361410057600080fd5b803561410e613dda82613d6d565b81815260059190911b8201830190838101908883111561412d57600080fd5b928401925b8284101561414b57833582529284019290840190614132565b80955050505050509250929050565b600181811c9082168061416e57607f821691505b60208210810361418e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614220576142206141f8565b5060010190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b80820180821115610a3e57610a3e6141f8565b60208082526008908201526714dbdb19081bdd5d60c21b604082015260600190565b600081600019048311821515161561429f5761429f6141f8565b500290565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b602080825260169082015275053746172742074696d652063616e6e6f7420626520360541b604082015260600190565b60208082526030908201527f54686520656e642074696d65206d75737420626520677265617465722074686160408201526f6e207468652073746172742074696d6560801b606082015260800190565b602080825260149082015273496e73756666696369656e742062616c616e636560601b604082015260600190565b600081516143c4818560208601613c28565b9290920192915050565b600080845481600182811c9150808316806143ea57607f831692505b6020808410820361440957634e487b7160e01b86526022600452602486fd5b81801561441d57600181146144325761445f565b60ff198616895284151585028901965061445f565b60008b81526020902060005b868110156144575781548b82015290850190830161443e565b505084890196505b50505050505061446f81856143b2565b95945050505050565b81810381811115610a3e57610a3e6141f8565b6000825161449d818460208701613c28565b9190910192915050565b6000602082840312156144b957600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826144e5576144e56144c0565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261454b5761454b6144c0565b500490565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061458390830184613c4c565b9695505050505050565b60006020828403121561459f57600080fd5b815161350b81613bf5565b634e487b7160e01b600052603160045260246000fdfea264697066735822122033520538901d95a9d8df1a7438f2bcebf5af833d448441b661ce8911a5347cc564736f6c6343000810003368747470733a2f2f7374617469632e686f726e7976657273652e7774662f6e66742f6d6574612f
Deployed Bytecode
0x60806040526004361061031e5760003560e01c80638973d3ba116101ab578063c87b56dd116100f7578063e985e9c511610095578063eef260981161006f578063eef26098146109b1578063f2fde38b146109de578063f3fef3a3146109fe578063f7be084814610a1e57610325565b8063e985e9c514610933578063ec2ca7bc1461097c578063eca665a11461099c57610325565b8063d5abeb01116100d1578063d5abeb01146108c7578063dff8f340146108dd578063e084c4d9146108fd578063e547f9c21461091d57610325565b8063c87b56dd14610835578063ce51650714610855578063d004b0361461089a57610325565b8063a22cb46511610164578063b6b5f74a1161013e578063b6b5f74a14610798578063b88d4fde146107d1578063bf7ce742146107f1578063c180526a1461082257610325565b8063a22cb46514610733578063a4e1b17814610753578063a7cd52cb1461076857610325565b80638973d3ba146106865780638d118b0f146106a65780638da5cb5b146106c65780639387e6dd146106e957806395d89b41146107095780639e17ca691461071e57610325565b8063484b973c1161026a578063624e2b10116102235780636c350ba6116101fd5780636c350ba61461060357806370a082311461063c578063715018a61461065c5780638456cb591461067157610325565b8063624e2b10146105a65780636352211e146105ce5780636c0360eb146105ee57610325565b8063484b973c146104e35780634e71d92d146105035780634f6ccce714610518578063553ea3e9146105385780635561c11b1461054d5780635c975abb1461058e57610325565b806323b872dd116102d75780632f745c59116102b15780632f745c591461046e5780633f3c17a21461048e5780633f4ba83a146104ae57806342842e0e146104c357610325565b806323b872dd1461041b5780632617dd4d1461043b5780632db115441461045b57610325565b806301ffc9a71461033357806306fdde0314610368578063078386ec1461038a578063081812fc146103ae578063095ea7b3146103e657806318160ddd1461040657610325565b3661032557005b34801561033157600080fd5b005b34801561033f57600080fd5b5061035361034e366004613c0b565b610a33565b60405190151581526020015b60405180910390f35b34801561037457600080fd5b5061037d610a44565b60405161035f9190613c78565b34801561039657600080fd5b506103a0600f5481565b60405190815260200161035f565b3480156103ba57600080fd5b506103ce6103c9366004613c8b565b610ad6565b6040516001600160a01b03909116815260200161035f565b3480156103f257600080fd5b50610331610401366004613cc0565b610afd565b34801561041257600080fd5b506008546103a0565b34801561042757600080fd5b50610331610436366004613cea565b610c17565b34801561044757600080fd5b50610331610456366004613d91565b610c48565b610331610469366004613c8b565b610cfd565b34801561047a57600080fd5b506103a0610489366004613cc0565b610fc0565b34801561049a57600080fd5b506103316104a9366004613e2e565b611056565b3480156104ba57600080fd5b506103316110b1565b3480156104cf57600080fd5b506103316104de366004613cea565b6110c3565b3480156104ef57600080fd5b506103316104fe366004613cc0565b6110de565b34801561050f57600080fd5b506103316111eb565b34801561052457600080fd5b506103a0610533366004613c8b565b611705565b34801561054457600080fd5b50610331611798565b34801561055957600080fd5b506103ce610568366004613e60565b60216020908152600092835260408084209091529082529020546001600160a01b031681565b34801561059a57600080fd5b50600b5460ff16610353565b3480156105b257600080fd5b506105bb6117d8565b60405161035f9796959493929190613ebd565b3480156105da57600080fd5b506103ce6105e9366004613c8b565b611844565b3480156105fa57600080fd5b5061037d6118a4565b34801561060f57600080fd5b5061035361061e366004613f01565b6001600160a01b031660009081526015602052604090205460ff1690565b34801561064857600080fd5b506103a0610657366004613f01565b611932565b34801561066857600080fd5b506103316119b8565b34801561067d57600080fd5b506103316119ca565b34801561069257600080fd5b506103a06106a1366004613f1c565b6119da565b3480156106b257600080fd5b506103316106c1366004613f4f565b611a18565b3480156106d257600080fd5b50600b5461010090046001600160a01b03166103ce565b3480156106f557600080fd5b50610331610704366004613d91565b611a4e565b34801561071557600080fd5b5061037d611aff565b34801561072a57600080fd5b50610331611b0e565b34801561073f57600080fd5b5061033161074e366004613f7b565b611b2c565b34801561075f57600080fd5b50610331611b37565b34801561077457600080fd5b50610353610783366004613f01565b60156020526000908152604090205460ff1681565b3480156107a457600080fd5b5060115460125460135460145460408051948552602085019390935291830152606082015260800161035f565b3480156107dd57600080fd5b506103316107ec366004613fb7565b611b50565b3480156107fd57600080fd5b506016546017546018546040805193845260208401929092529082015260600161035f565b610331610830366004613c8b565b611b88565b34801561084157600080fd5b5061037d610850366004613c8b565b611edc565b34801561086157600080fd5b50610353610870366004613c8b565b601f54600090815260216020908152604080832093835292905220546001600160a01b0316151590565b3480156108a657600080fd5b506108ba6108b5366004613f01565b611f43565b60405161035f9190614077565b3480156108d357600080fd5b506103a061145081565b3480156108e957600080fd5b50600d546103ce906001600160a01b031681565b34801561090957600080fd5b50610331610918366004613e2e565b612069565b34801561092957600080fd5b506103a0600e5481565b34801561093f57600080fd5b5061035361094e36600461408a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561098857600080fd5b506103316109973660046140bd565b612178565b3480156109a857600080fd5b50610331612245565b3480156109bd57600080fd5b506103a06109cc366004613c8b565b60106020526000908152604090205481565b3480156109ea57600080fd5b506103316109f9366004613f01565b612650565b348015610a0a57600080fd5b50610331610a19366004613cc0565b6126c9565b348015610a2a57600080fd5b506108ba61278a565b6000610a3e82612832565b92915050565b606060008054610a539061415a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7f9061415a565b8015610acc5780601f10610aa157610100808354040283529160200191610acc565b820191906000526020600020905b815481529060010190602001808311610aaf57829003601f168201915b5050505050905090565b6000610ae182612857565b506000908152600460205260409020546001600160a01b031690565b6000610b0882611844565b9050806001600160a01b0316836001600160a01b031603610b7a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610b965750610b96813361094e565b610c085760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610b71565b610c1283836128b6565b505050565b610c213382612924565b610c3d5760405162461bcd60e51b8152600401610b7190614194565b610c128383836129a3565b610c50612b4a565b60005b8151811015610cf95760006001600160a01b0316828281518110610c7957610c796141e2565b60200260200101516001600160a01b031614610ce757600160156000848481518110610ca757610ca76141e2565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80610cf18161420e565b915050610c53565b5050565b610d05612baa565b601654601754829033610d2a5760405162461bcd60e51b8152600401610b7190614227565b60008211610d765760405162461bcd60e51b815260206004820152601960248201527804d696e74207175616e746974792063616e6e6f74206265203603c1b6044820152606401610b71565b82600003610dc05760405162461bcd60e51b81526020600482015260176024820152761b5a5b9d081a5cc81b9bdd08195b98589b1959081e595d604a1b6044820152606401610b71565b61145082610dcd60085490565b610dd79190614250565b1115610df55760405162461bcd60e51b8152600401610b7190614263565b610dff8183614285565b341015610e3f5760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b6044820152606401610b71565b6002600a5403610e615760405162461bcd60e51b8152600401610b71906142a4565b6002600a55601654421015610eaf5760405162461bcd60e51b81526020600482015260146024820152731b5a5b9d081a185cc81b9bdd081cdd185c9d195960621b6044820152606401610b71565b60185484610ebc33611932565b610ec69190614250565b1115610f0c5760405162461bcd60e51b8152602060048201526015602482015274115e18d95959081d1a19481b5a5b9d081b1a5b5a5d605a1b6044820152606401610b71565b600d546040516000916001600160a01b03169034908381818185875af1925050503d8060008114610f59576040519150601f19603f3d011682016040523d82523d6000602084013e610f5e565b606091505b5050905080610f7f5760405162461bcd60e51b8152600401610b71906142db565b60005b85811015610fb3576000610f94612bf0565b9050610fa03382612e01565b5080610fab8161420e565b915050610f82565b50506001600a5550505050565b6000610fcb83611932565b821061102d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b71565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61105e612b4a565b8360000361107e5760405162461bcd60e51b8152600401610b7190614304565b83831161109d5760405162461bcd60e51b8152600401610b7190614334565b601193909355601291909155601355601455565b6110b9612b4a565b6110c1612e1b565b565b610c1283838360405180602001604052806000815250611b50565b6110e6612b4a565b6001600160a01b0382166111325760405162461bcd60e51b815260206004820152601360248201527204163636f756e742063616e6e6f74206265203606c1b6044820152606401610b71565b600081116111825760405162461bcd60e51b815260206004820152601760248201527f4d696e7420616d6f756e742063616e6e6f7420626520300000000000000000006044820152606401610b71565b6114508161118f60085490565b6111999190614250565b11156111b75760405162461bcd60e51b8152600401610b7190614263565b60005b81811015610c125760006111cc612bf0565b90506111d88482612e01565b50806111e38161420e565b9150506111ba565b6111f3612baa565b6002600a54036112155760405162461bcd60e51b8152600401610b71906142a4565b6002600a55601a546000036112675760405162461bcd60e51b815260206004820152601860248201527718db185a5b481a5cc81b9bdd08195b98589b1959081e595d60421b6044820152606401610b71565b601a544210156112b15760405162461bcd60e51b815260206004820152601560248201527410db185a5b481a185cc81b9bdd081cdd185c9d1959605a1b6044820152606401610b71565b601b544211156112f55760405162461bcd60e51b815260206004820152600f60248201526e10db185a5b481a185cc8195b991959608a1b6044820152606401610b71565b6000601c54116113325760405162461bcd60e51b81526020600482015260086024820152674e6f207072697a6560c01b6044820152606401610b71565b6000601d54116113845760405162461bcd60e51b815260206004820152601f60248201527f4e6f207072697a6520686173206265656e20616c6c6f636174656420796574006044820152606401610b71565b601c54601e54106113d75760405162461bcd60e51b815260206004820152601c60248201527f546865207072697a6520686173206265656e2077697468647261776e000000006044820152606401610b71565b601f5460000361141e5760405162461bcd60e51b815260206004820152601260248201527110db185a5b4818dbd919481b9bdd081cd95d60721b6044820152606401610b71565b60205461145f5760405162461bcd60e51b815260206004820152600f60248201526e27379031b630b4b690373ab6b132b960891b6044820152606401610b71565b60205461146b33611932565b10156114b95760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e74206e756d626572206f6620746f6b656e730000006044820152606401610b71565b600080806114c633612e6d565b915091505b60205481036115e35760005b8251811015611589573360216000601f548152602001908152602001600020600085848151811061150a5761150a6141e2565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506022838281518110611558576115586141e2565b60209081029190910181015182546001810184556000938452919092200155806115818161420e565b9150506114d7565b50601d546115979084614250565b92507f2d08265af3ae2634f524584011369f676de29c0c73122fa33d7860eecc111c2f826040516115c89190614077565b60405180910390a16115d933612e6d565b90925090506114cb565b82156116fb57824710156116095760405162461bcd60e51b8152600401610b7190614384565b601c5483601e5461161a9190614250565b111561167a5760405162461bcd60e51b815260206004820152602960248201527f636c61696d207072697a652063616e6e6f74206578636565642074686520746f60448201526874616c207072697a6560b81b6064820152608401610b71565b82601e600082825461168c9190614250565b9091555050604051600090339085908381818185875af1925050503d80600081146116d3576040519150601f19603f3d011682016040523d82523d6000602084013e6116d8565b606091505b50509050806116f95760405162461bcd60e51b8152600401610b71906142db565b505b50506001600a5550565b600061171060085490565b82106117735760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b71565b60088281548110611786576117866141e2565b90600052602060002001549050919050565b6117a0612b4a565b6000601a819055601b819055601c819055601d819055601e819055601f8190556117cc90602090613b7f565b6110c160226000613b7f565b601a54601b54601c54601d54601e54601f5460208054604080518284028101840190915281815260609290918282018282801561183457602002820191906000526020600020905b815481526020019060010190808311611820575b5050505050905090919293949596565b6000818152600260205260408120546001600160a01b031680610a3e5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610b71565b600c80546118b19061415a565b80601f01602080910402602001604051908101604052809291908181526020018280546118dd9061415a565b801561192a5780601f106118ff5761010080835404028352916020019161192a565b820191906000526020600020905b81548152906001019060200180831161190d57829003601f168201915b505050505081565b60006001600160a01b03821661199c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610b71565b506001600160a01b031660009081526003602052604090205490565b6119c0612b4a565b6110c16000613149565b6119d2612b4a565b6110c16131a3565b60196020528260005260406000206020528160005260406000208181548110611a0257600080fd5b9060005260206000200160009250925050505481565b611a20612b4a565b82600003611a405760405162461bcd60e51b8152600401610b7190614304565b601692909255601755601855565b611a56612b4a565b60005b8151811015610cf95760006001600160a01b0316828281518110611a7f57611a7f6141e2565b60200260200101516001600160a01b031614611aed57600060156000848481518110611aad57611aad6141e2565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80611af78161420e565b915050611a59565b606060018054610a539061415a565b611b16612b4a565b6000601181905560128190556013819055601455565b610cf93383836131e0565b611b3f612b4a565b600060168190556017819055601855565b611b5a3383612924565b611b765760405162461bcd60e51b8152600401610b7190614194565b611b82848484846132ae565b50505050565b611b90612baa565b601154601354829033611bb55760405162461bcd60e51b8152600401610b7190614227565b60008211611c015760405162461bcd60e51b815260206004820152601960248201527804d696e74207175616e746974792063616e6e6f74206265203603c1b6044820152606401610b71565b82600003611c4b5760405162461bcd60e51b81526020600482015260176024820152761b5a5b9d081a5cc81b9bdd08195b98589b1959081e595d604a1b6044820152606401610b71565b61145082611c5860085490565b611c629190614250565b1115611c805760405162461bcd60e51b8152600401610b7190614263565b611c8a8183614285565b341015611cca5760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b6044820152606401610b71565b6002600a5403611cec5760405162461bcd60e51b8152600401610b71906142a4565b6002600a55601154421015611d3a5760405162461bcd60e51b81526020600482015260146024820152731b5a5b9d081a185cc81b9bdd081cdd185c9d195960621b6044820152606401610b71565b601254421115611d7d5760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d081a185cc8195b99195960921b6044820152606401610b71565b60145484611d8a33611932565b611d949190614250565b1115611dda5760405162461bcd60e51b8152602060048201526015602482015274115e18d95959081d1a19481b5a5b9d081b1a5b5a5d605a1b6044820152606401610b71565b3360009081526015602052604090205460ff161515600114611e355760405162461bcd60e51b8152602060048201526014602482015273139bdd081a5b881d1a1948185b1b1bdddb1a5cdd60621b6044820152606401610b71565b600d546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611e82576040519150601f19603f3d011682016040523d82523d6000602084013e611e87565b606091505b5050905080611ea85760405162461bcd60e51b8152600401610b71906142db565b60005b85811015610fb3576000611ebd612bf0565b9050611ec93382612e01565b5080611ed48161420e565b915050611eab565b6060611ee782612857565b6000600c8054611ef69061415a565b905011611f125760405180602001604052806000815250610a3e565b600c611f1d836132e1565b604051602001611f2e9291906143ce565b60405160208183030381529060405292915050565b60606000611f5083611932565b67ffffffffffffffff811115611f6857611f68613d26565b604051908082528060200260200182016040528015611f91578160200160208202803683370190505b509050600060015b600e5481116120605760005b6001600160a01b038616600090815260196020908152604080832085845290915290205481101561204d576001600160a01b03861660009081526019602090815260408083208584529091529020805482908110612005576120056141e2565b9060005260206000200154848481518110612022576120226141e2565b6020908102919091010152826120378161420e565b93505080806120459061420e565b915050611fa5565b50806120588161420e565b915050611f99565b50909392505050565b612071612b4a565b836000036120915760405162461bcd60e51b8152600401610b7190614304565b8383116120b05760405162461bcd60e51b8152600401610b7190614334565b814710156121005760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820636f6e747261637420616d6f756e740000000000006044820152606401610b71565b8082116121645760405162461bcd60e51b815260206004820152602c60248201527f746f74616c5072697a65206d7573742062652067726561746572207468616e2060448201526b746865207065725072697a6560a01b6064820152608401610b71565b601a93909355601b91909155601c55601d55565b612180612b4a565b816000036121d05760405162461bcd60e51b815260206004820152601d60248201527f436c61696d20636f64652063616e6e6f742062652073657420746f20300000006044820152606401610b71565b601f5482036122215760405162461bcd60e51b815260206004820152601d60248201527f436c61696d20636f64652063616e6e6f74206265207468652073616d650000006044820152606401610b71565b601f82905580516122389060209081840190613b9d565b50610cf960226000613b7f565b61224d612baa565b6002600a540361226f5760405162461bcd60e51b8152600401610b71906142a4565b6002600a55601a546000036122c15760405162461bcd60e51b815260206004820152601860248201527718db185a5b481a5cc81b9bdd08195b98589b1959081e595d60421b6044820152606401610b71565b601a5442101561230b5760405162461bcd60e51b815260206004820152601560248201527410db185a5b481a185cc81b9bdd081cdd185c9d1959605a1b6044820152606401610b71565b601b5442111561234f5760405162461bcd60e51b815260206004820152600f60248201526e10db185a5b481a185cc8195b991959608a1b6044820152606401610b71565b6000601c541161238c5760405162461bcd60e51b81526020600482015260086024820152674e6f207072697a6560c01b6044820152606401610b71565b6000601d54116123de5760405162461bcd60e51b815260206004820152601f60248201527f4e6f207072697a6520686173206265656e20616c6c6f636174656420796574006044820152606401610b71565b601c54601e54106124315760405162461bcd60e51b815260206004820152601c60248201527f546865207072697a6520686173206265656e2077697468647261776e000000006044820152606401610b71565b601f546000036124785760405162461bcd60e51b815260206004820152601260248201527110db185a5b4818dbd919481b9bdd081cd95d60721b6044820152606401610b71565b6020546124b95760405162461bcd60e51b815260206004820152600f60248201526e27379031b630b4b690373ab6b132b960891b6044820152606401610b71565b6020546124c533611932565b10156125135760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e74206e756d626572206f6620746f6b656e730000006044820152606401610b71565b6000808061252033612e6d565b602054919350915081036115e35760005b82518110156125e3573360216000601f5481526020019081526020016000206000858481518110612564576125646141e2565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060228382815181106125b2576125b26141e2565b60209081029190910181015182546001810184556000938452919092200155806125db8161420e565b915050612531565b50601d546125f19084614250565b92507f2d08265af3ae2634f524584011369f676de29c0c73122fa33d7860eecc111c2f826040516126229190614077565b60405180910390a182156116fb57824710156116095760405162461bcd60e51b8152600401610b7190614384565b612658612b4a565b6001600160a01b0381166126bd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b71565b6126c681613149565b50565b6126d1612b4a565b6001600160a01b0382166126f75760405162461bcd60e51b8152600401610b7190614227565b804710156127175760405162461bcd60e51b8152600401610b7190614384565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612764576040519150601f19603f3d011682016040523d82523d6000602084013e612769565b606091505b5050905080610c125760405162461bcd60e51b8152600401610b71906142db565b60225460609067ffffffffffffffff8111156127a8576127a8613d26565b6040519080825280602002602001820160405280156127d1578160200160208202803683370190505b50905060005b60225481101561282e57602281815481106127f4576127f46141e2565b9060005260206000200154828281518110612811576128116141e2565b6020908102919091010152806128268161420e565b9150506127d7565b5090565b60006001600160e01b0319821663780e9d6360e01b1480610a3e5750610a3e826133e2565b6000818152600260205260409020546001600160a01b03166126c65760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610b71565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906128eb82611844565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061293083611844565b9050806001600160a01b0316846001600160a01b0316148061297757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061299b5750836001600160a01b031661299084610ad6565b6001600160a01b0316145b949350505050565b826001600160a01b03166129b682611844565b6001600160a01b031614612a1a5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b71565b6001600160a01b038216612a7c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b71565b612a87838383613432565b612a926000826128b6565b6001600160a01b0383166000908152600360205260408120805460019290612abb908490614478565b90915550506001600160a01b0382166000908152600360205260408120805460019290612ae9908490614250565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b546001600160a01b036101009091041633146110c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b71565b600b5460ff16156110c15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b71565b6000612bfa612baa565b6000600e546002612c0a60085490565b612c144233614250565b612c1e9190614250565b604051602001612c3091815260200190565b60408051601f1981840301815290829052612c4a9161448b565b602060405180830381855afa158015612c67573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612c8a91906144a7565b612c9491906144d6565b612c9f906001614250565b90505b600f5460008281526010602052604090205410612cdc57600e548110612cca57506001612ca2565b80612cd48161420e565b915050612ca2565b6000600f546002612cec60085490565b612cf64233614250565b612d009190614250565b604051602001612d1291815260200190565b60408051601f1981840301815290829052612d2c9161448b565b602060405180830381855afa158015612d49573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612d6c91906144a7565b612d7691906144d6565b612d81906001614250565b9050612d8d82826134f2565b92505b6000838152600260205260409020546001600160a01b031615612ddd57600f548110612dbe57506001612dcc565b80612dc88161420e565b9150505b612dd682826134f2565b9250612d90565b6000828152601060205260408120805491612df78361420e565b9190505550505090565b610cf9828260405180602001604052806000815250613512565b612e23613545565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60205460609060009067ffffffffffffffff811115612e8e57612e8e613d26565b604051908082528060200260200182016040528015612eb7578160200160208202803683370190505b50915060005b6020548110156131435760005b60196000866001600160a01b03166001600160a01b03168152602001908152602001600020600060208481548110612f0457612f046141e2565b906000526020600020015481526020019081526020016000208054905081101561313057601f5460009081526021602090815260408083206001600160a01b03891684526019835290832082549192849283919088908110612f6857612f686141e2565b906000526020600020015481526020019081526020016000208481548110612f9257612f926141e2565b600091825260208083209091015483528201929092526040019020546001600160a01b03160361311e576000805b85518110156130725760196000886001600160a01b03166001600160a01b03168152602001908152602001600020600060208681548110613003576130036141e2565b90600052602060002001548152602001908152602001600020838154811061302d5761302d6141e2565b906000526020600020015486828151811061304a5761304a6141e2565b6020026020010151036130605760019150613072565b8061306a8161420e565b915050612fc0565b50801561307f575061311e565b60196000876001600160a01b03166001600160a01b031681526020019081526020016000206000602085815481106130b9576130b96141e2565b9060005260206000200154815260200190815260200160002082815481106130e3576130e36141e2565b9060005260206000200154858581518110613100576131006141e2565b6020908102919091010152836131158161420e565b94505050613130565b806131288161420e565b915050612eca565b508061313b8161420e565b915050612ebd565b50915091565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6131ab612baa565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e503390565b816001600160a01b0316836001600160a01b0316036132415760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b71565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6132b98484846129a3565b6132c58484848461358e565b611b825760405162461bcd60e51b8152600401610b71906144ea565b6060816000036133085750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613332578061331c8161420e565b915061332b9050600a8361453c565b915061330c565b60008167ffffffffffffffff81111561334d5761334d613d26565b6040519080825280601f01601f191660200182016040528015613377576020820181803683370190505b5090505b841561299b5761338c600183614478565b9150613399600a866144d6565b6133a4906030614250565b60f81b8183815181106133b9576133b96141e2565b60200101906001600160f81b031916908160001a9053506133db600a8661453c565b945061337b565b60006001600160e01b031982166380ac58cd60e01b148061341357506001600160e01b03198216635b5e139f60e01b145b80610a3e57506301ffc9a760e01b6001600160e01b0319831614610a3e565b61343d83838361368f565b600061344882613747565b90506001600160a01b038416613490576001600160a01b0383166000908152601960209081526040808320848452825282208054600181018255908352912001829055611b82565b6001600160a01b0383166134ae576134a9848284613755565b611b82565b6134b9848284613755565b6001600160a01b038316600090815260196020908152604080832084845282528220805460018101825590835291200182905550505050565b600081613501846103e8614285565b61350b9190614250565b9392505050565b61351c83836138bd565b613529600084848461358e565b610c125760405162461bcd60e51b8152600401610b71906144ea565b600b5460ff166110c15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b71565b60006001600160a01b0384163b1561368457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906135d2903390899088908890600401614550565b6020604051808303816000875af192505050801561360d575060408051601f3d908101601f1916820190925261360a9181019061458d565b60015b61366a573d80801561363b576040519150601f19603f3d011682016040523d82523d6000602084013e613640565b606091505b5080516000036136625760405162461bcd60e51b8152600401610b71906144ea565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061299b565b506001949350505050565b6001600160a01b0383166136ea576136e581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61370d565b816001600160a01b0316836001600160a01b03161461370d5761370d8382613a0b565b6001600160a01b03821661372457610c1281613aa8565b826001600160a01b0316826001600160a01b031614610c1257610c128282613b3b565b6000610a3e6103e88361453c565b6000805b6001600160a01b03851660009081526019602090815260408083208784529091529020548110156137e6576001600160a01b038516600090815260196020908152604080832087845290915290208054849190839081106137bc576137bc6141e2565b9060005260206000200154036137d4578091506137e6565b806137de8161420e565b915050613759565b506001600160a01b03841660009081526019602090815260408083208684529091529020805461381890600190614478565b81548110613828576138286141e2565b60009182526020808320909101546001600160a01b03871683526019825260408084208785529092529120805483908110613865576138656141e2565b60009182526020808320909101929092556001600160a01b0386168152601982526040808220868352909252208054806138a1576138a16145aa565b6001900381819060005260206000200160009055905550505050565b6001600160a01b0382166139135760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b71565b6000818152600260205260409020546001600160a01b0316156139785760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b71565b61398460008383613432565b6001600160a01b03821660009081526003602052604081208054600192906139ad908490614250565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001613a1884611932565b613a229190614478565b600083815260076020526040902054909150808214613a75576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613aba90600190614478565b60008381526009602052604081205460088054939450909284908110613ae257613ae26141e2565b906000526020600020015490508060088381548110613b0357613b036141e2565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806138a1576138a16145aa565b6000613b4683611932565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b50805460008255906000526020600020908101906126c69190613be0565b828054828255906000526020600020908101928215613bd8579160200282015b82811115613bd8578251825591602001919060010190613bbd565b5061282e9291505b5b8082111561282e5760008155600101613be1565b6001600160e01b0319811681146126c657600080fd5b600060208284031215613c1d57600080fd5b813561350b81613bf5565b60005b83811015613c43578181015183820152602001613c2b565b50506000910152565b60008151808452613c64816020860160208601613c28565b601f01601f19169290920160200192915050565b60208152600061350b6020830184613c4c565b600060208284031215613c9d57600080fd5b5035919050565b80356001600160a01b0381168114613cbb57600080fd5b919050565b60008060408385031215613cd357600080fd5b613cdc83613ca4565b946020939093013593505050565b600080600060608486031215613cff57600080fd5b613d0884613ca4565b9250613d1660208501613ca4565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613d6557613d65613d26565b604052919050565b600067ffffffffffffffff821115613d8757613d87613d26565b5060051b60200190565b60006020808385031215613da457600080fd5b823567ffffffffffffffff811115613dbb57600080fd5b8301601f81018513613dcc57600080fd5b8035613ddf613dda82613d6d565b613d3c565b81815260059190911b82018301908381019087831115613dfe57600080fd5b928401925b82841015613e2357613e1484613ca4565b82529284019290840190613e03565b979650505050505050565b60008060008060808587031215613e4457600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215613e7357600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015613eb257815187529582019590820190600101613e96565b509495945050505050565b8781528660208201528560408201528460608201528360808201528260a082015260e060c08201526000613ef460e0830184613e82565b9998505050505050505050565b600060208284031215613f1357600080fd5b61350b82613ca4565b600080600060608486031215613f3157600080fd5b613f3a84613ca4565b95602085013595506040909401359392505050565b600080600060608486031215613f6457600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613f8e57600080fd5b613f9783613ca4565b915060208301358015158114613fac57600080fd5b809150509250929050565b60008060008060808587031215613fcd57600080fd5b613fd685613ca4565b93506020613fe5818701613ca4565b935060408601359250606086013567ffffffffffffffff8082111561400957600080fd5b818801915088601f83011261401d57600080fd5b81358181111561402f5761402f613d26565b614041601f8201601f19168501613d3c565b9150808252898482850101111561405757600080fd5b808484018584013760008482840101525080935050505092959194509250565b60208152600061350b6020830184613e82565b6000806040838503121561409d57600080fd5b6140a683613ca4565b91506140b460208401613ca4565b90509250929050565b600080604083850312156140d057600080fd5b8235915060208084013567ffffffffffffffff8111156140ef57600080fd5b8401601f8101861361410057600080fd5b803561410e613dda82613d6d565b81815260059190911b8201830190838101908883111561412d57600080fd5b928401925b8284101561414b57833582529284019290840190614132565b80955050505050509250929050565b600181811c9082168061416e57607f821691505b60208210810361418e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614220576142206141f8565b5060010190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b80820180821115610a3e57610a3e6141f8565b60208082526008908201526714dbdb19081bdd5d60c21b604082015260600190565b600081600019048311821515161561429f5761429f6141f8565b500290565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b602080825260169082015275053746172742074696d652063616e6e6f7420626520360541b604082015260600190565b60208082526030908201527f54686520656e642074696d65206d75737420626520677265617465722074686160408201526f6e207468652073746172742074696d6560801b606082015260800190565b602080825260149082015273496e73756666696369656e742062616c616e636560601b604082015260600190565b600081516143c4818560208601613c28565b9290920192915050565b600080845481600182811c9150808316806143ea57607f831692505b6020808410820361440957634e487b7160e01b86526022600452602486fd5b81801561441d57600181146144325761445f565b60ff198616895284151585028901965061445f565b60008b81526020902060005b868110156144575781548b82015290850190830161443e565b505084890196505b50505050505061446f81856143b2565b95945050505050565b81810381811115610a3e57610a3e6141f8565b6000825161449d818460208701613c28565b9190910192915050565b6000602082840312156144b957600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826144e5576144e56144c0565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261454b5761454b6144c0565b500490565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061458390830184613c4c565b9695505050505050565b60006020828403121561459f57600080fd5b815161350b81613bf5565b634e487b7160e01b600052603160045260246000fdfea264697066735822122033520538901d95a9d8df1a7438f2bcebf5af833d448441b661ce8911a5347cc564736f6c63430008100033
Deployed Bytecode Sourcemap
51651:15872:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67280:171;;;;;;;;;;-1:-1:-1;67280:171:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;67280:171:0;;;;;;;;32158:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;52010:33::-;;;;;;;;;;;;;;;;;;;1516:25:1;;;1504:2;1489:18;52010:33:0;1370:177:1;33671:171:0;;;;;;;;;;-1:-1:-1;33671:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1901:32:1;;;1883:51;;1871:2;1856:18;33671:171:0;1737:203:1;33188:417:0;;;;;;;;;;-1:-1:-1;33188:417:0;;;;;:::i;:::-;;:::i;46064:113::-;;;;;;;;;;-1:-1:-1;46152:10:0;:17;46064:113;;34371:336;;;;;;;;;;-1:-1:-1;34371:336:0;;;;;:::i;:::-;;:::i;53963:249::-;;;;;;;;;;-1:-1:-1;53963:249:0;;;;;:::i;:::-;;:::i;58942:563::-;;;;;;:::i;:::-;;:::i;45732:256::-;;;;;;;;;;-1:-1:-1;45732:256:0;;;;;:::i;:::-;;:::i;52963:400::-;;;;;;;;;;-1:-1:-1;52963:400:0;;;;;:::i;:::-;;:::i;67207:65::-;;;;;;;;;;;;;:::i;34778:185::-;;;;;;;;;;-1:-1:-1;34778:185:0;;;;;:::i;:::-;;:::i;57807:402::-;;;;;;;;;;-1:-1:-1;57807:402:0;;;;;:::i;:::-;;:::i;59513:1571::-;;;;;;;;;;;;;:::i;46254:233::-;;;;;;;;;;-1:-1:-1;46254:233:0;;;;;:::i;:::-;;:::i;55063:271::-;;;;;;;;;;;;;:::i;52670:66::-;;;;;;;;;;-1:-1:-1;52670:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52670:66:0;;;10522:86;;;;;;;;;;-1:-1:-1;10593:7:0;;;;10522:86;;56753:411;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;31869:222::-;;;;;;;;;;-1:-1:-1;31869:222:0;;;;;:::i;:::-;;:::i;51776:65::-;;;;;;;;;;;;;:::i;57172:118::-;;;;;;;;;;-1:-1:-1;57172:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;57264:18:0;57231:11;57264:18;;;:9;:18;;;;;;;;;57172:118;31600:207;;;;;;;;;;-1:-1:-1;31600:207:0;;;;;:::i;:::-;;:::i;8032:103::-;;;;;;;;;;;;;:::i;67138:61::-;;;;;;;;;;;;;:::i;52384:69::-;;;;;;;;;;-1:-1:-1;52384:69:0;;;;;:::i;:::-;;:::i;53552:258::-;;;;;;;;;;-1:-1:-1;53552:258:0;;;;;:::i;:::-;;:::i;7384:87::-;;;;;;;;;;-1:-1:-1;7457:6:0;;;;;-1:-1:-1;;;;;7457:6:0;7384:87;;54220:253;;;;;;;;;;-1:-1:-1;54220:253:0;;;;;:::i;:::-;;:::i;32327:104::-;;;;;;;;;;;;;:::i;53371:173::-;;;;;;;;;;;;;:::i;33914:155::-;;;;;;;;;;-1:-1:-1;33914:155:0;;;;;:::i;:::-;;:::i;53818:137::-;;;;;;;;;;;;;:::i;52237:41::-;;;;;;;;;;-1:-1:-1;52237:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;55992:267;;;;;;;;;;-1:-1:-1;56132:16:0;;56168:14;;56202;;56239:12;;55992:267;;;7419:25:1;;;7475:2;7460:18;;7453:34;;;;7503:18;;;7496:34;7561:2;7546:18;;7539:34;7406:3;7391:19;55992:267:0;7188:391:1;35034:323:0;;;;;;;;;;-1:-1:-1;35034:323:0;;;;;:::i;:::-;;:::i;55774:210::-;;;;;;;;;;-1:-1:-1;55895:13:0;;55928:11;;55962:14;;55774:210;;;8771:25:1;;;8827:2;8812:18;;8805:34;;;;8855:18;;;8848:34;8759:2;8744:18;55774:210:0;8569:319:1;58217:717:0;;;;;;:::i;:::-;;:::i;66564:226::-;;;;;;;;;;-1:-1:-1;66564:226:0;;;;;:::i;:::-;;:::i;57298:135::-;;;;;;;;;;-1:-1:-1;57298:135:0;;;;;:::i;:::-;57392:9;;57356:4;57380:22;;;:11;:22;;;;;;;;:31;;;;;;;;-1:-1:-1;;;;;57380:31:0;:45;;;57298:135;56267:478;;;;;;;;;;-1:-1:-1;56267:478:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51927:40::-;;;;;;;;;;;;51963:4;51927:40;;51848:70;;;;;;;;;;-1:-1:-1;51848:70:0;;;;-1:-1:-1;;;;;51848:70:0;;;54481:574;;;;;;;;;;-1:-1:-1;54481:574:0;;;;;:::i;:::-;;:::i;51974:29::-;;;;;;;;;;;;;;;;34140:164;;;;;;;;;;-1:-1:-1;34140:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34261:25:0;;;34237:4;34261:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34140:164;55342:335;;;;;;;;;;-1:-1:-1;55342:335:0;;;;;:::i;:::-;;:::i;61092:1511::-;;;;;;;;;;;;;:::i;52050:46::-;;;;;;;;;;-1:-1:-1;52050:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;8290:201;;;;;;;;;;-1:-1:-1;8290:201:0;;;;;:::i;:::-;;:::i;66798:332::-;;;;;;;;;;-1:-1:-1;66798:332:0;;;;;:::i;:::-;;:::i;57441:271::-;;;;;;;;;;;;;:::i;67280:171::-;67383:4;67407:36;67431:11;67407:23;:36::i;:::-;67400:43;67280:171;-1:-1:-1;;67280:171:0:o;32158:100::-;32212:13;32245:5;32238:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32158:100;:::o;33671:171::-;33747:7;33767:23;33782:7;33767:14;:23::i;:::-;-1:-1:-1;33810:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33810:24:0;;33671:171::o;33188:417::-;33269:13;33285:23;33300:7;33285:14;:23::i;:::-;33269:39;;33333:5;-1:-1:-1;;;;;33327:11:0;:2;-1:-1:-1;;;;;33327:11:0;;33319:57;;;;-1:-1:-1;;;33319:57:0;;10975:2:1;33319:57:0;;;10957:21:1;11014:2;10994:18;;;10987:30;11053:34;11033:18;;;11026:62;-1:-1:-1;;;11104:18:1;;;11097:31;11145:19;;33319:57:0;;;;;;;;;6015:10;-1:-1:-1;;;;;33411:21:0;;;;:62;;-1:-1:-1;33436:37:0;33453:5;6015:10;34140:164;:::i;33436:37::-;33389:174;;;;-1:-1:-1;;;33389:174:0;;11377:2:1;33389:174:0;;;11359:21:1;11416:2;11396:18;;;11389:30;11455:34;11435:18;;;11428:62;11526:32;11506:18;;;11499:60;11576:19;;33389:174:0;11175:426:1;33389:174:0;33576:21;33585:2;33589:7;33576:8;:21::i;:::-;33258:347;33188:417;;:::o;34371:336::-;34566:41;6015:10;34599:7;34566:18;:41::i;:::-;34558:100;;;;-1:-1:-1;;;34558:100:0;;;;;;;:::i;:::-;34671:28;34681:4;34687:2;34691:7;34671:9;:28::i;53963:249::-;7270:13;:11;:13::i;:::-;54046:9:::1;54041:164;54065:7;:14;54061:1;:18;54041:164;;;54127:1;-1:-1:-1::0;;;;;54105:24:0::1;:7;54113:1;54105:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;54105:24:0::1;;54101:93;;54174:4;54150:9;:21;54160:7;54168:1;54160:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;54150:21:0::1;-1:-1:-1::0;;;;;54150:21:0::1;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;54101:93;54081:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54041:164;;;;53963:249:::0;:::o;58942:563::-;10127:19;:17;:19::i;:::-;59008:13:::1;::::0;59028:11:::1;::::0;59023:3;;65602:10:::1;65594:52;;;;-1:-1:-1::0;;;65594:52:0::1;;;;;;;:::i;:::-;65671:1;65665:3;:7;65657:45;;;::::0;-1:-1:-1;;;65657:45:0;;12971:2:1;65657:45:0::1;::::0;::::1;12953:21:1::0;13010:2;12990:18;;;12983:30;-1:-1:-1;;;13029:18:1;;;13022:55;13094:18;;65657:45:0::1;12769:349:1::0;65657:45:0::1;65721:7;65732:1;65721:12:::0;65713:48:::1;;;::::0;-1:-1:-1;;;65713:48:0;;13325:2:1;65713:48:0::1;::::0;::::1;13307:21:1::0;13364:2;13344:18;;;13337:30;-1:-1:-1;;;13383:18:1;;;13376:53;13446:18;;65713:48:0::1;13123:347:1::0;65713:48:0::1;51963:4;65796:3;65780:13;46152:10:::0;:17;;46064:113;65780:13:::1;:19;;;;:::i;:::-;:32;;65772:53;;;;-1:-1:-1::0;;;65772:53:0::1;;;;;;;:::i;:::-;65857:11;65863:5:::0;65857:3;:11:::1;:::i;:::-;65844:9;:24;;65836:51;;;::::0;-1:-1:-1;;;65836:51:0;;14316:2:1;65836:51:0::1;::::0;::::1;14298:21:1::0;14355:2;14335:18;;;14328:30;-1:-1:-1;;;14374:18:1;;;14367:44;14428:18;;65836:51:0::1;14114:338:1::0;65836:51:0::1;1812:1:::2;2410:7;;:19:::0;2402:63:::2;;;;-1:-1:-1::0;;;2402:63:0::2;;;;;;;:::i;:::-;1812:1;2543:7;:18:::0;59100:13:::3;::::0;59081:15:::3;:32;;59073:65;;;::::0;-1:-1:-1;;;59073:65:0;;15019:2:1;59073:65:0::3;::::0;::::3;15001:21:1::0;15058:2;15038:18;;;15031:30;-1:-1:-1;;;15077:18:1;;;15070:50;15137:18;;59073:65:0::3;14817:344:1::0;59073:65:0::3;59188:14;;59181:3;59157:21;59167:10;59157:9;:21::i;:::-;:27;;;;:::i;:::-;:45;;59149:79;;;::::0;-1:-1:-1;;;59149:79:0;;15368:2:1;59149:79:0::3;::::0;::::3;15350:21:1::0;15407:2;15387:18;;;15380:30;-1:-1:-1;;;15426:18:1;;;15419:51;15487:18;;59149:79:0::3;15166:345:1::0;59149:79:0::3;59265:10;::::0;59257:47:::3;::::0;59240:12:::3;::::0;-1:-1:-1;;;;;59265:10:0::3;::::0;59290:9:::3;::::0;59240:12;59257:47;59240:12;59257:47;59290:9;59265:10;59257:47:::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59239:65;;;59323:7;59315:35;;;;-1:-1:-1::0;;;59315:35:0::3;;;;;;;:::i;:::-;59366:9;59361:137;59385:3;59381:1;:7;59361:137;;;59410:15;59428:13;:11;:13::i;:::-;59410:31;;59456:30;59466:10;59478:7;59456:9;:30::i;:::-;-1:-1:-1::0;59390:3:0;::::3;::::0;::::3;:::i;:::-;;;;59361:137;;;-1:-1:-1::0;;1768:1:0::2;2722:7;:22:::0;-1:-1:-1;;;;58942:563:0:o;45732:256::-;45829:7;45865:23;45882:5;45865:16;:23::i;:::-;45857:5;:31;45849:87;;;;-1:-1:-1;;;45849:87:0;;16272:2:1;45849:87:0;;;16254:21:1;16311:2;16291:18;;;16284:30;16350:34;16330:18;;;16323:62;-1:-1:-1;;;16401:18:1;;;16394:41;16452:19;;45849:87:0;16070:407:1;45849:87:0;-1:-1:-1;;;;;;45954:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;45732:256::o;52963:400::-;7270:13;:11;:13::i;:::-;53092:7:::1;53103:1;53092:12:::0;53084:47:::1;;;;-1:-1:-1::0;;;53084:47:0::1;;;;;;;:::i;:::-;53158:7;53150:5;:15;53142:76;;;;-1:-1:-1::0;;;53142:76:0::1;;;;;;;:::i;:::-;53229:16;:26:::0;;;;53266:14:::1;:22:::0;;;;53299:14:::1;:22:::0;53332:12:::1;:23:::0;52963:400::o;67207:65::-;7270:13;:11;:13::i;:::-;67254:10:::1;:8;:10::i;:::-;67207:65::o:0;34778:185::-;34916:39;34933:4;34939:2;34943:7;34916:39;;;;;;;;;;;;:16;:39::i;57807:402::-;7270:13;:11;:13::i;:::-;-1:-1:-1;;;;;57894:21:0;::::1;57886:53;;;::::0;-1:-1:-1;;;57886:53:0;;17452:2:1;57886:53:0::1;::::0;::::1;17434:21:1::0;17491:2;17471:18;;;17464:30;-1:-1:-1;;;17510:18:1;;;17503:49;17569:18;;57886:53:0::1;17250:343:1::0;57886:53:0::1;57964:1;57958:3;:7;57950:43;;;::::0;-1:-1:-1;;;57950:43:0;;17800:2:1;57950:43:0::1;::::0;::::1;17782:21:1::0;17839:2;17819:18;;;17812:30;17878:25;17858:18;;;17851:53;17921:18;;57950:43:0::1;17598:347:1::0;57950:43:0::1;51963:4;58028:3;58012:13;46152:10:::0;:17;;46064:113;58012:13:::1;:19;;;;:::i;:::-;:32;;58004:53;;;;-1:-1:-1::0;;;58004:53:0::1;;;;;;;:::i;:::-;58073:9;58068:134;58092:3;58088:1;:7;58068:134;;;58117:15;58135:13;:11;:13::i;:::-;58117:31;;58163:27;58173:7;58182;58163:9;:27::i;:::-;-1:-1:-1::0;58097:3:0;::::1;::::0;::::1;:::i;:::-;;;;58068:134;;59513:1571:::0;10127:19;:17;:19::i;:::-;1812:1:::1;2410:7;;:19:::0;2402:63:::1;;;;-1:-1:-1::0;;;2402:63:0::1;;;;;;;:::i;:::-;1812:1;2543:7;:18:::0;59585:12:::2;::::0;59601:1:::2;59585:17:::0;59577:54:::2;;;::::0;-1:-1:-1;;;59577:54:0;;18152:2:1;59577:54:0::2;::::0;::::2;18134:21:1::0;18191:2;18171:18;;;18164:30;-1:-1:-1;;;18210:18:1;;;18203:54;18274:18;;59577:54:0::2;17950:348:1::0;59577:54:0::2;59669:12;;59650:15;:31;;59642:65;;;::::0;-1:-1:-1;;;59642:65:0;;18505:2:1;59642:65:0::2;::::0;::::2;18487:21:1::0;18544:2;18524:18;;;18517:30;-1:-1:-1;;;18563:18:1;;;18556:51;18624:18;;59642:65:0::2;18303:345:1::0;59642:65:0::2;59745:10;;59726:15;:29;;59718:57;;;::::0;-1:-1:-1;;;59718:57:0;;18855:2:1;59718:57:0::2;::::0;::::2;18837:21:1::0;18894:2;18874:18;;;18867:30;-1:-1:-1;;;18913:18:1;;;18906:45;18968:18;;59718:57:0::2;18653:339:1::0;59718:57:0::2;59812:1;59794:15;;:19;59786:40;;;::::0;-1:-1:-1;;;59786:40:0;;19199:2:1;59786:40:0::2;::::0;::::2;19181:21:1::0;19238:1;19218:18;;;19211:29;-1:-1:-1;;;19256:18:1;;;19249:38;19304:18;;59786:40:0::2;18997:331:1::0;59786:40:0::2;59861:1;59845:13;;:17;59837:61;;;::::0;-1:-1:-1;;;59837:61:0;;19535:2:1;59837:61:0::2;::::0;::::2;19517:21:1::0;19574:2;19554:18;;;19547:30;19613:33;19593:18;;;19586:61;19664:18;;59837:61:0::2;19333:355:1::0;59837:61:0::2;59933:15;;59917:13;;:31;59909:72;;;::::0;-1:-1:-1;;;59909:72:0;;19895:2:1;59909:72:0::2;::::0;::::2;19877:21:1::0;19934:2;19914:18;;;19907:30;19973;19953:18;;;19946:58;20021:18;;59909:72:0::2;19693:352:1::0;59909:72:0::2;60000:9;;60013:1;60000:14:::0;59992:45:::2;;;::::0;-1:-1:-1;;;59992:45:0;;20252:2:1;59992:45:0::2;::::0;::::2;20234:21:1::0;20291:2;20271:18;;;20264:30;-1:-1:-1;;;20310:18:1;;;20303:48;20368:18;;59992:45:0::2;20050:342:1::0;59992:45:0::2;60056:7;:14:::0;60048:46:::2;;;::::0;-1:-1:-1;;;60048:46:0;;20599:2:1;60048:46:0::2;::::0;::::2;20581:21:1::0;20638:2;20618:18;;;20611:30;-1:-1:-1;;;20657:18:1;;;20650:45;20712:18;;60048:46:0::2;20397:339:1::0;60048:46:0::2;60138:7;:14:::0;60113:21:::2;60123:10;60113:9;:21::i;:::-;:39;;60105:81;;;::::0;-1:-1:-1;;;60105:81:0;;20943:2:1;60105:81:0::2;::::0;::::2;20925:21:1::0;20982:2;20962:18;;;20955:30;21021:31;21001:18;;;20994:59;21070:18;;60105:81:0::2;20741:353:1::0;60105:81:0::2;60199:13;60228:23:::0;60253:16;60273:27:::2;60289:10;60273:15;:27::i;:::-;60227:73;;;;60313:377;60332:7;:14:::0;60320:26;;60313:377:::2;;60368:9;60363:177;60387:6;:13;60383:1;:17;60363:177;;;60462:10;60426:11;:22;60438:9;;60426:22;;;;;;;;;;;:33;60449:6;60456:1;60449:9;;;;;;;;:::i;:::-;;;;;;;60426:33;;;;;;;;;;;;:46;;;;;-1:-1:-1::0;;;;;60426:46:0::2;;;;;-1:-1:-1::0;;;;;60426:46:0::2;;;;;;60491:17;60514:6;60521:1;60514:9;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;60491:33;;::::2;::::0;::::2;::::0;;-1:-1:-1;60491:33:0;;;;;;;::::2;::::0;60402:3;::::2;::::0;::::2;:::i;:::-;;;;60363:177;;;-1:-1:-1::0;60563:13:0::2;::::0;60554:22:::2;::::0;;::::2;:::i;:::-;;;60596:19;60608:6;60596:19;;;;;;:::i;:::-;;;;;;;;60651:27;60667:10;60651:15;:27::i;:::-;60630:48:::0;;-1:-1:-1;60630:48:0;-1:-1:-1;60313:377:0::2;;;60704:9:::0;;60700:377:::2;;60763:5;60738:21;:30;;60730:63;;;;-1:-1:-1::0;;;60730:63:0::2;;;;;;;:::i;:::-;60841:15;;60832:5;60816:13;;:21;;;;:::i;:::-;:40;;60808:94;;;::::0;-1:-1:-1;;;60808:94:0;;21650:2:1;60808:94:0::2;::::0;::::2;21632:21:1::0;21689:2;21669:18;;;21662:30;21728:34;21708:18;;;21701:62;-1:-1:-1;;;21779:18:1;;;21772:39;21828:19;;60808:94:0::2;21448:405:1::0;60808:94:0::2;60934:5;60917:13;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;60972:43:0::2;::::0;60955:12:::2;::::0;60980:10:::2;::::0;61005:5;;60955:12;60972:43;60955:12;60972:43;61005:5;60980:10;60972:43:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60954:61;;;61038:7;61030:35;;;;-1:-1:-1::0;;;61030:35:0::2;;;;;;;:::i;:::-;60715:362;60700:377;-1:-1:-1::0;;1768:1:0::1;2722:7;:22:::0;-1:-1:-1;59513:1571:0:o;46254:233::-;46329:7;46365:30;46152:10;:17;;46064:113;46365:30;46357:5;:38;46349:95;;;;-1:-1:-1;;;46349:95:0;;22060:2:1;46349:95:0;;;22042:21:1;22099:2;22079:18;;;22072:30;22138:34;22118:18;;;22111:62;-1:-1:-1;;;22189:18:1;;;22182:42;22241:19;;46349:95:0;21858:408:1;46349:95:0;46462:10;46473:5;46462:17;;;;;;;;:::i;:::-;;;;;;;;;46455:24;;46254:233;;;:::o;55063:271::-;7270:13;:11;:13::i;:::-;55130:1:::1;55115:12;:16:::0;;;55142:10:::1;:14:::0;;;55167:15:::1;:19:::0;;;55197:13:::1;:17:::0;;;55225:13:::1;:17:::0;;;55253:9:::1;:13:::0;;;55277:14:::1;::::0;55284:7:::1;::::0;55277:14:::1;:::i;:::-;55302:24;55309:17;;55302:24;:::i;56753:411::-:0;56950:12;;56982:10;;57017:15;;57055:13;;57091;;57123:9;;57149:7;57143:13;;;;;;;;;;;;;;;;;;56906:20;;57143:13;;;;;57149:7;57143:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56753:411;;;;;;;:::o;31869:222::-;31941:7;31977:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31977:16:0;;32004:56;;;;-1:-1:-1;;;32004:56:0;;22473:2:1;32004:56:0;;;22455:21:1;22512:2;22492:18;;;22485:30;-1:-1:-1;;;22531:18:1;;;22524:54;22595:18;;32004:56:0;22271:348:1;51776:65:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31600:207::-;31672:7;-1:-1:-1;;;;;31700:19:0;;31692:73;;;;-1:-1:-1;;;31692:73:0;;22826:2:1;31692:73:0;;;22808:21:1;22865:2;22845:18;;;22838:30;22904:34;22884:18;;;22877:62;-1:-1:-1;;;22955:18:1;;;22948:39;23004:19;;31692:73:0;22624:405:1;31692:73:0;-1:-1:-1;;;;;;31783:16:0;;;;;:9;:16;;;;;;;31600:207::o;8032:103::-;7270:13;:11;:13::i;:::-;8097:30:::1;8124:1;8097:18;:30::i;67138:61::-:0;7270:13;:11;:13::i;:::-;67183:8:::1;:6;:8::i;52384:69::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53552:258::-;7270:13;:11;:13::i;:::-;53663:7:::1;53674:1;53663:12:::0;53655:47:::1;;;;-1:-1:-1::0;;;53655:47:0::1;;;;;;;:::i;:::-;53713:13;:23:::0;;;;53747:11:::1;:19:::0;53777:14:::1;:25:::0;53552:258::o;54220:253::-;7270:13;:11;:13::i;:::-;54306:9:::1;54301:165;54325:7;:14;54321:1;:18;54301:165;;;54387:1;-1:-1:-1::0;;;;;54365:24:0::1;:7;54373:1;54365:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;54365:24:0::1;;54361:94;;54434:5;54410:9;:21;54420:7;54428:1;54420:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;54410:21:0::1;-1:-1:-1::0;;;;;54410:21:0::1;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54361:94;54341:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54301:165;;32327:104:::0;32383:13;32416:7;32409:14;;;;;:::i;53371:173::-;7270:13;:11;:13::i;:::-;53450:1:::1;53431:16;:20:::0;;;53462:14:::1;:18:::0;;;53491:14:::1;:18:::0;;;53520:12:::1;:16:::0;53371:173::o;33914:155::-;34009:52;6015:10;34042:8;34052;34009:18;:52::i;53818:137::-;7270:13;:11;:13::i;:::-;53891:1:::1;53875:13;:17:::0;;;53903:11:::1;:15:::0;;;53929:14:::1;:18:::0;53818:137::o;35034:323::-;35208:41;6015:10;35241:7;35208:18;:41::i;:::-;35200:100;;;;-1:-1:-1;;;35200:100:0;;;;;;;:::i;:::-;35311:38;35325:4;35331:2;35335:7;35344:4;35311:13;:38::i;:::-;35034:323;;;;:::o;58217:717::-;10127:19;:17;:19::i;:::-;58286:16:::1;::::0;58309:14:::1;::::0;58304:3;;65602:10:::1;65594:52;;;;-1:-1:-1::0;;;65594:52:0::1;;;;;;;:::i;:::-;65671:1;65665:3;:7;65657:45;;;::::0;-1:-1:-1;;;65657:45:0;;12971:2:1;65657:45:0::1;::::0;::::1;12953:21:1::0;13010:2;12990:18;;;12983:30;-1:-1:-1;;;13029:18:1;;;13022:55;13094:18;;65657:45:0::1;12769:349:1::0;65657:45:0::1;65721:7;65732:1;65721:12:::0;65713:48:::1;;;::::0;-1:-1:-1;;;65713:48:0;;13325:2:1;65713:48:0::1;::::0;::::1;13307:21:1::0;13364:2;13344:18;;;13337:30;-1:-1:-1;;;13383:18:1;;;13376:53;13446:18;;65713:48:0::1;13123:347:1::0;65713:48:0::1;51963:4;65796:3;65780:13;46152:10:::0;:17;;46064:113;65780:13:::1;:19;;;;:::i;:::-;:32;;65772:53;;;;-1:-1:-1::0;;;65772:53:0::1;;;;;;;:::i;:::-;65857:11;65863:5:::0;65857:3;:11:::1;:::i;:::-;65844:9;:24;;65836:51;;;::::0;-1:-1:-1;;;65836:51:0;;14316:2:1;65836:51:0::1;::::0;::::1;14298:21:1::0;14355:2;14335:18;;;14328:30;-1:-1:-1;;;14374:18:1;;;14367:44;14428:18;;65836:51:0::1;14114:338:1::0;65836:51:0::1;1812:1:::2;2410:7;;:19:::0;2402:63:::2;;;;-1:-1:-1::0;;;2402:63:0::2;;;;;;;:::i;:::-;1812:1;2543:7;:18:::0;58384:16:::3;::::0;58365:15:::3;:35;;58357:68;;;::::0;-1:-1:-1;;;58357:68:0;;15019:2:1;58357:68:0::3;::::0;::::3;15001:21:1::0;15058:2;15038:18;;;15031:30;-1:-1:-1;;;15077:18:1;;;15070:50;15137:18;;58357:68:0::3;14817:344:1::0;58357:68:0::3;58463:14;;58444:15;:33;;58436:60;;;::::0;-1:-1:-1;;;58436:60:0;;23236:2:1;58436:60:0::3;::::0;::::3;23218:21:1::0;23275:2;23255:18;;;23248:30;-1:-1:-1;;;23294:18:1;;;23287:44;23348:18;;58436:60:0::3;23034:338:1::0;58436:60:0::3;58546:12;;58539:3;58515:21;58525:10;58515:9;:21::i;:::-;:27;;;;:::i;:::-;:43;;58507:77;;;::::0;-1:-1:-1;;;58507:77:0;;15368:2:1;58507:77:0::3;::::0;::::3;15350:21:1::0;15407:2;15387:18;;;15380:30;-1:-1:-1;;;15426:18:1;;;15419:51;15487:18;;58507:77:0::3;15166:345:1::0;58507:77:0::3;58613:10;58603:21;::::0;;;:9:::3;:21;::::0;;;;;::::3;;:29;;:21:::0;:29:::3;58595:62;;;::::0;-1:-1:-1;;;58595:62:0;;23579:2:1;58595:62:0::3;::::0;::::3;23561:21:1::0;23618:2;23598:18;;;23591:30;-1:-1:-1;;;23637:18:1;;;23630:50;23697:18;;58595:62:0::3;23377:344:1::0;58595:62:0::3;58694:10;::::0;58686:47:::3;::::0;58669:12:::3;::::0;-1:-1:-1;;;;;58694:10:0::3;::::0;58719:9:::3;::::0;58669:12;58686:47;58669:12;58686:47;58719:9;58694:10;58686:47:::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58668:65;;;58752:7;58744:35;;;;-1:-1:-1::0;;;58744:35:0::3;;;;;;;:::i;:::-;58795:9;58790:137;58814:3;58810:1;:7;58790:137;;;58839:15;58857:13;:11;:13::i;:::-;58839:31;;58885:30;58895:10;58907:7;58885:9;:30::i;:::-;-1:-1:-1::0;58819:3:0;::::3;::::0;::::3;:::i;:::-;;;;58790:137;;66564:226:::0;66629:13;66655:23;66670:7;66655:14;:23::i;:::-;66720:1;66702:7;66696:21;;;;;:::i;:::-;;;:25;:86;;;;;;;;;;;;;;;;;66748:7;66757:18;:7;:16;:18::i;:::-;66731:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66689:93;66564:226;-1:-1:-1;;66564:226:0:o;56267:478::-;56326:16;56355:25;56397:18;56407:7;56397:9;:18::i;:::-;56383:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56383:33:0;-1:-1:-1;56355:61:0;-1:-1:-1;56427:10:0;56474:1;56452:260;56487:9;;56477:6;:19;56452:260;;56528:9;56523:178;-1:-1:-1;;;;;56547:21:0;;;;;;:12;:21;;;;;;;;:29;;;;;;;;:36;56543:40;;56523:178;;;-1:-1:-1;;;;;56627:21:0;;;;;;:12;:21;;;;;;;;:29;;;;;;;;:32;;56657:1;;56627:32;;;;;;:::i;:::-;;;;;;;;;56609:8;56618:5;56609:15;;;;;;;;:::i;:::-;;;;;;;;;;:50;56678:7;;;;:::i;:::-;;;;56585:3;;;;;:::i;:::-;;;;56523:178;;;-1:-1:-1;56498:8:0;;;;:::i;:::-;;;;56452:260;;;-1:-1:-1;56729:8:0;;56267:478;-1:-1:-1;;;56267:478:0:o;54481:574::-;7270:13;:11;:13::i;:::-;54611:7:::1;54622:1;54611:12:::0;54603:47:::1;;;;-1:-1:-1::0;;;54603:47:0::1;;;;;;;:::i;:::-;54677:7;54669:5;:15;54661:76;;;;-1:-1:-1::0;;;54661:76:0::1;;;;;;;:::i;:::-;54781:10;54756:21;:35;;54748:74;;;::::0;-1:-1:-1;;;54748:74:0;;25465:2:1;54748:74:0::1;::::0;::::1;25447:21:1::0;25504:2;25484:18;;;25477:30;25543:28;25523:18;;;25516:56;25589:18;;54748:74:0::1;25263:350:1::0;54748:74:0::1;54854:8;54841:10;:21;54833:78;;;::::0;-1:-1:-1;;;54833:78:0;;25820:2:1;54833:78:0::1;::::0;::::1;25802:21:1::0;25859:2;25839:18;;;25832:30;25898:34;25878:18;;;25871:62;-1:-1:-1;;;25949:18:1;;;25942:42;26001:19;;54833:78:0::1;25618:408:1::0;54833:78:0::1;54922:12;:22:::0;;;;54955:10:::1;:18:::0;;;;54984:15:::1;:28:::0;55023:13:::1;:24:::0;54481:574::o;55342:335::-;7270:13;:11;:13::i;:::-;55447:10:::1;55461:1;55447:15:::0;55439:57:::1;;;::::0;-1:-1:-1;;;55439:57:0;;26233:2:1;55439:57:0::1;::::0;::::1;26215:21:1::0;26272:2;26252:18;;;26245:30;26311:31;26291:18;;;26284:59;26360:18;;55439:57:0::1;26031:353:1::0;55439:57:0::1;55529:9;;55515:10;:23:::0;55507:65:::1;;;::::0;-1:-1:-1;;;55507:65:0;;26591:2:1;55507:65:0::1;::::0;::::1;26573:21:1::0;26630:2;26610:18;;;26603:30;26669:31;26649:18;;;26642:59;26718:18;;55507:65:0::1;26389:353:1::0;55507:65:0::1;55583:9;:22:::0;;;55616:18;;::::1;::::0;:7:::1;::::0;:18;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;55645:24:0::1;55652:17;;55645:24;:::i;61092:1511::-:0;10127:19;:17;:19::i;:::-;1812:1:::1;2410:7;;:19:::0;2402:63:::1;;;;-1:-1:-1::0;;;2402:63:0::1;;;;;;;:::i;:::-;1812:1;2543:7;:18:::0;61170:12:::2;::::0;61186:1:::2;61170:17:::0;61162:54:::2;;;::::0;-1:-1:-1;;;61162:54:0;;18152:2:1;61162:54:0::2;::::0;::::2;18134:21:1::0;18191:2;18171:18;;;18164:30;-1:-1:-1;;;18210:18:1;;;18203:54;18274:18;;61162:54:0::2;17950:348:1::0;61162:54:0::2;61254:12;;61235:15;:31;;61227:65;;;::::0;-1:-1:-1;;;61227:65:0;;18505:2:1;61227:65:0::2;::::0;::::2;18487:21:1::0;18544:2;18524:18;;;18517:30;-1:-1:-1;;;18563:18:1;;;18556:51;18624:18;;61227:65:0::2;18303:345:1::0;61227:65:0::2;61330:10;;61311:15;:29;;61303:57;;;::::0;-1:-1:-1;;;61303:57:0;;18855:2:1;61303:57:0::2;::::0;::::2;18837:21:1::0;18894:2;18874:18;;;18867:30;-1:-1:-1;;;18913:18:1;;;18906:45;18968:18;;61303:57:0::2;18653:339:1::0;61303:57:0::2;61397:1;61379:15;;:19;61371:40;;;::::0;-1:-1:-1;;;61371:40:0;;19199:2:1;61371:40:0::2;::::0;::::2;19181:21:1::0;19238:1;19218:18;;;19211:29;-1:-1:-1;;;19256:18:1;;;19249:38;19304:18;;61371:40:0::2;18997:331:1::0;61371:40:0::2;61446:1;61430:13;;:17;61422:61;;;::::0;-1:-1:-1;;;61422:61:0;;19535:2:1;61422:61:0::2;::::0;::::2;19517:21:1::0;19574:2;19554:18;;;19547:30;19613:33;19593:18;;;19586:61;19664:18;;61422:61:0::2;19333:355:1::0;61422:61:0::2;61518:15;;61502:13;;:31;61494:72;;;::::0;-1:-1:-1;;;61494:72:0;;19895:2:1;61494:72:0::2;::::0;::::2;19877:21:1::0;19934:2;19914:18;;;19907:30;19973;19953:18;;;19946:58;20021:18;;61494:72:0::2;19693:352:1::0;61494:72:0::2;61585:9;;61598:1;61585:14:::0;61577:45:::2;;;::::0;-1:-1:-1;;;61577:45:0;;20252:2:1;61577:45:0::2;::::0;::::2;20234:21:1::0;20291:2;20271:18;;;20264:30;-1:-1:-1;;;20310:18:1;;;20303:48;20368:18;;61577:45:0::2;20050:342:1::0;61577:45:0::2;61641:7;:14:::0;61633:46:::2;;;::::0;-1:-1:-1;;;61633:46:0;;20599:2:1;61633:46:0::2;::::0;::::2;20581:21:1::0;20638:2;20618:18;;;20611:30;-1:-1:-1;;;20657:18:1;;;20650:45;20712:18;;61633:46:0::2;20397:339:1::0;61633:46:0::2;61723:7;:14:::0;61698:21:::2;61708:10;61698:9;:21::i;:::-;:39;;61690:81;;;::::0;-1:-1:-1;;;61690:81:0;;20943:2:1;61690:81:0::2;::::0;::::2;20925:21:1::0;20982:2;20962:18;;;20955:30;21021:31;21001:18;;;20994:59;21070:18;;61690:81:0::2;20741:353:1::0;61690:81:0::2;61784:13;61813:23:::0;61838:16;61858:27:::2;61874:10;61858:15;:27::i;:::-;61914:7;:14:::0;61812:73;;-1:-1:-1;61812:73:0;-1:-1:-1;61902:26:0;;61898:311:::2;;61950:9;61945:177;61969:6;:13;61965:1;:17;61945:177;;;62044:10;62008:11;:22;62020:9;;62008:22;;;;;;;;;;;:33;62031:6;62038:1;62031:9;;;;;;;;:::i;:::-;;;;;;;62008:33;;;;;;;;;;;;:46;;;;;-1:-1:-1::0;;;;;62008:46:0::2;;;;;-1:-1:-1::0;;;;;62008:46:0::2;;;;;;62073:17;62096:6;62103:1;62096:9;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;62073:33;;::::2;::::0;::::2;::::0;;-1:-1:-1;62073:33:0;;;;;;;::::2;::::0;61984:3;::::2;::::0;::::2;:::i;:::-;;;;61945:177;;;-1:-1:-1::0;62145:13:0::2;::::0;62136:22:::2;::::0;;::::2;:::i;:::-;;;62178:19;62190:6;62178:19;;;;;;:::i;:::-;;;;;;;;62223:9:::0;;62219:377:::2;;62282:5;62257:21;:30;;62249:63;;;;-1:-1:-1::0;;;62249:63:0::2;;;;;;;:::i;8290:201::-:0;7270:13;:11;:13::i;:::-;-1:-1:-1;;;;;8379:22:0;::::1;8371:73;;;::::0;-1:-1:-1;;;8371:73:0;;26949:2:1;8371:73:0::1;::::0;::::1;26931:21:1::0;26988:2;26968:18;;;26961:30;27027:34;27007:18;;;27000:62;-1:-1:-1;;;27078:18:1;;;27071:36;27124:19;;8371:73:0::1;26747:402:1::0;8371:73:0::1;8455:28;8474:8;8455:18;:28::i;:::-;8290:201:::0;:::o;66798:332::-;7270:13;:11;:13::i;:::-;-1:-1:-1;;;;;66888:22:0;::::1;66880:50;;;;-1:-1:-1::0;;;66880:50:0::1;;;;;;;:::i;:::-;66974:6;66949:21;:31;;66941:64;;;;-1:-1:-1::0;;;66941:64:0::1;;;;;;;:::i;:::-;67017:12;67042:8;-1:-1:-1::0;;;;;67034:22:0::1;67065:6;67034:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67016:60;;;67095:7;67087:35;;;;-1:-1:-1::0;;;67087:35:0::1;;;;;;;:::i;57441:271::-:0;57553:17;:24;57490:25;;57539:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57539:39:0;;57528:50;;57594:9;57589:116;57613:17;:24;57609:28;;57589:116;;;57673:17;57691:1;57673:20;;;;;;;;:::i;:::-;;;;;;;;;57659:8;57668:1;57659:11;;;;;;;;:::i;:::-;;;;;;;;;;:34;57639:3;;;;:::i;:::-;;;;57589:116;;;;57441:271;:::o;45424:224::-;45526:4;-1:-1:-1;;;;;;45550:50:0;;-1:-1:-1;;;45550:50:0;;:90;;;45604:36;45628:11;45604:23;:36::i;41646:135::-;36929:4;36953:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36953:16:0;41720:53;;;;-1:-1:-1;;;41720:53:0;;22473:2:1;41720:53:0;;;22455:21:1;22512:2;22492:18;;;22485:30;-1:-1:-1;;;22531:18:1;;;22524:54;22595:18;;41720:53:0;22271:348:1;40925:174:0;41000:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;41000:29:0;-1:-1:-1;;;;;41000:29:0;;;;;;;;:24;;41054:23;41000:24;41054:14;:23::i;:::-;-1:-1:-1;;;;;41045:46:0;;;;;;;;;;;40925:174;;:::o;37158:264::-;37251:4;37268:13;37284:23;37299:7;37284:14;:23::i;:::-;37268:39;;37337:5;-1:-1:-1;;;;;37326:16:0;:7;-1:-1:-1;;;;;37326:16:0;;:52;;;-1:-1:-1;;;;;;34261:25:0;;;34237:4;34261:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37346:32;37326:87;;;;37406:7;-1:-1:-1;;;;;37382:31:0;:20;37394:7;37382:11;:20::i;:::-;-1:-1:-1;;;;;37382:31:0;;37326:87;37318:96;37158:264;-1:-1:-1;;;;37158:264:0:o;40181:625::-;40340:4;-1:-1:-1;;;;;40313:31:0;:23;40328:7;40313:14;:23::i;:::-;-1:-1:-1;;;;;40313:31:0;;40305:81;;;;-1:-1:-1;;;40305:81:0;;27356:2:1;40305:81:0;;;27338:21:1;27395:2;27375:18;;;27368:30;27434:34;27414:18;;;27407:62;-1:-1:-1;;;27485:18:1;;;27478:35;27530:19;;40305:81:0;27154:401:1;40305:81:0;-1:-1:-1;;;;;40405:16:0;;40397:65;;;;-1:-1:-1;;;40397:65:0;;27762:2:1;40397:65:0;;;27744:21:1;27801:2;27781:18;;;27774:30;27840:34;27820:18;;;27813:62;-1:-1:-1;;;27891:18:1;;;27884:34;27935:19;;40397:65:0;27560:400:1;40397:65:0;40475:39;40496:4;40502:2;40506:7;40475:20;:39::i;:::-;40579:29;40596:1;40600:7;40579:8;:29::i;:::-;-1:-1:-1;;;;;40621:15:0;;;;;;:9;:15;;;;;:20;;40640:1;;40621:15;:20;;40640:1;;40621:20;:::i;:::-;;;;-1:-1:-1;;;;;;;40652:13:0;;;;;;:9;:13;;;;;:18;;40669:1;;40652:13;:18;;40669:1;;40652:18;:::i;:::-;;;;-1:-1:-1;;40681:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;40681:21:0;-1:-1:-1;;;;;40681:21:0;;;;;;;;;40720:27;;40681:16;;40720:27;;;;;;;33258:347;33188:417;;:::o;7549:132::-;7457:6;;-1:-1:-1;;;;;7457:6:0;;;;;6015:10;7613:23;7605:68;;;;-1:-1:-1;;;7605:68:0;;28300:2:1;7605:68:0;;;28282:21:1;;;28319:18;;;28312:30;28378:34;28358:18;;;28351:62;28430:18;;7605:68:0;28098:356:1;10681:108:0;10593:7;;;;10751:9;10743:38;;;;-1:-1:-1;;;10743:38:0;;28661:2:1;10743:38:0;;;28643:21:1;28700:2;28680:18;;;28673:30;-1:-1:-1;;;28719:18:1;;;28712:46;28775:18;;10743:38:0;28459:340:1;62700:900:0;62754:15;10127:19;:17;:19::i;:::-;62782:14:::1;62891:9;;62808:79;62872:13;46152:10:::0;:17;;46064:113;62872:13:::1;62832:37;62854:15;62840:10;62832:37;:::i;:::-;:53;;;;:::i;:::-;62815:71;;;;;;28933:19:1::0;;28977:2;28968:12;;28804:182;62815:71:0::1;;::::0;;-1:-1:-1;;62815:71:0;;::::1;::::0;;;;;;;62808:79:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62800:100;::::0;;::::1;:::i;:::-;62799:106;::::0;62904:1:::1;62799:106;:::i;:::-;62782:123;;62916:189;62946:12;::::0;62923:19:::1;::::0;;;:11:::1;:19;::::0;;;;;:35:::1;62916:189;;62989:9;;62979:6;:19;62975:119;;-1:-1:-1::0;63028:1:0::1;62916:189;;62975:119;63070:8:::0;::::1;::::0;::::1;:::i;:::-;;;;62916:189;;;63115:19;63229:12;;63146:79;63210:13;46152:10:::0;:17;;46064:113;63210:13:::1;63170:37;63192:15;63178:10;63170:37;:::i;:::-;:53;;;;:::i;:::-;63153:71;;;;;;28933:19:1::0;;28977:2;28968:12;;28804:182;63153:71:0::1;;::::0;;-1:-1:-1;;63153:71:0;;::::1;::::0;;;;;;;63146:79:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63138:103;::::0;;::::1;:::i;:::-;63137:109;::::0;63245:1:::1;63137:109;:::i;:::-;63115:131;;63269:34;63283:6;63291:11;63269:13;:34::i;:::-;63259:44;;63314:247;36929:4:::0;36953:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36953:16:0;:30;63314:247:::1;;63373:12;;63358:11;:27;63354:137;;-1:-1:-1::0;63420:1:0::1;63354:137;;;63462:13:::0;::::1;::::0;::::1;:::i;:::-;;;;63354:137;63515:34;63529:6;63537:11;63515:13;:34::i;:::-;63505:44;;63314:247;;;63571:19;::::0;;;:11:::1;:19;::::0;;;;:21;;;::::1;::::0;::::1;:::i;:::-;;;;;;62771:829;;62700:900:::0;:::o;37764:110::-;37840:26;37850:2;37854:7;37840:26;;;;;;;;;;;;:9;:26::i;11377:120::-;10386:16;:14;:16::i;:::-;11436:7:::1;:15:::0;;-1:-1:-1;;11436:15:0::1;::::0;;11467:22:::1;6015:10:::0;11476:12:::1;11467:22;::::0;-1:-1:-1;;;;;1901:32:1;;;1883:51;;1871:2;1856:18;11467:22:0::1;;;;;;;11377:120::o:0;63761:1023::-;63902:7;:14;63825:23;;63850:16;;63888:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63888:29:0;;63879:38;;63935:9;63930:811;63954:7;:14;63950:18;;63930:811;;;63995:9;63990:740;64014:12;:21;64027:7;-1:-1:-1;;;;;64014:21:0;-1:-1:-1;;;;;64014:21:0;;;;;;;;;;;;:33;64036:7;64044:1;64036:10;;;;;;;;:::i;:::-;;;;;;;;;64014:33;;;;;;;;;;;:40;;;;64010:1;:44;63990:740;;;64096:9;;64156:1;64084:22;;;:11;:22;;;;;;;;-1:-1:-1;;;;;64107:21:0;;;;:12;:21;;;;;64129:10;;64084:22;;64156:1;;;;64084:22;64137:1;;64129:10;;;;;;:::i;:::-;;;;;;;;;64107:33;;;;;;;;;;;64141:1;64107:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;64084:60;;;;;;;;;;;;;-1:-1:-1;;;;;64084:60:0;:74;64183:8;64080:131;64229:12;64273:9;64268:238;64292:6;:13;64288:1;:17;64268:238;;;64352:12;:21;64365:7;-1:-1:-1;;;;;64352:21:0;-1:-1:-1;;;;;64352:21:0;;;;;;;;;;;;:33;64374:7;64382:1;64374:10;;;;;;;;:::i;:::-;;;;;;;;;64352:33;;;;;;;;;;;64386:1;64352:36;;;;;;;;:::i;:::-;;;;;;;;;64339:6;64346:1;64339:9;;;;;;;;:::i;:::-;;;;;;;:49;64335:152;;64427:4;64417:14;;64458:5;;64335:152;64307:3;;;;:::i;:::-;;;;64268:238;;;;64528:7;64524:64;;;64560:8;;;64524:64;64625:12;:21;64638:7;-1:-1:-1;;;;;64625:21:0;-1:-1:-1;;;;;64625:21:0;;;;;;;;;;;;:33;64647:7;64655:1;64647:10;;;;;;;;:::i;:::-;;;;;;;;;64625:33;;;;;;;;;;;64659:1;64625:36;;;;;;;;:::i;:::-;;;;;;;;;64606:6;64613:8;64606:16;;;;;;;;:::i;:::-;;;;;;;;;;:55;64680:10;;;;:::i;:::-;;;;64709:5;;;63990:740;64056:3;;;;:::i;:::-;;;;63990:740;;;-1:-1:-1;63970:3:0;;;;:::i;:::-;;;;63930:811;;;;63761:1023;;;:::o;8651:191::-;8744:6;;;-1:-1:-1;;;;;8761:17:0;;;8744:6;8761:17;;;-1:-1:-1;;;;;;8761:17:0;;;;;;8794:40;;8744:6;;;;;;;;8794:40;;8725:16;;8794:40;8714:128;8651:191;:::o;11118:118::-;10127:19;:17;:19::i;:::-;11178:7:::1;:14:::0;;-1:-1:-1;;11178:14:0::1;11188:4;11178:14;::::0;;11208:20:::1;11215:12;6015:10:::0;;5935:98;41242:315;41397:8;-1:-1:-1;;;;;41388:17:0;:5;-1:-1:-1;;;;;41388:17:0;;41380:55;;;;-1:-1:-1;;;41380:55:0;;29923:2:1;41380:55:0;;;29905:21:1;29962:2;29942:18;;;29935:30;30001:27;29981:18;;;29974:55;30046:18;;41380:55:0;29721:349:1;41380:55:0;-1:-1:-1;;;;;41446:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;41446:46:0;;;;;;;;;;41508:41;;540::1;;;41508::0;;513:18:1;41508:41:0;;;;;;;41242:315;;;:::o;36238:313::-;36394:28;36404:4;36410:2;36414:7;36394:9;:28::i;:::-;36441:47;36464:4;36470:2;36474:7;36483:4;36441:22;:47::i;:::-;36433:110;;;;-1:-1:-1;;;36433:110:0;;;;;;;:::i;3189:723::-;3245:13;3466:5;3475:1;3466:10;3462:53;;-1:-1:-1;;3493:10:0;;;;;;;;;;;;-1:-1:-1;;;3493:10:0;;;;;3189:723::o;3462:53::-;3540:5;3525:12;3581:78;3588:9;;3581:78;;3614:8;;;;:::i;:::-;;-1:-1:-1;3637:10:0;;-1:-1:-1;3645:2:0;3637:10;;:::i;:::-;;;3581:78;;;3669:19;3701:6;3691:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3691:17:0;;3669:39;;3719:154;3726:10;;3719:154;;3753:11;3763:1;3753:11;;:::i;:::-;;-1:-1:-1;3822:10:0;3830:2;3822:5;:10;:::i;:::-;3809:24;;:2;:24;:::i;:::-;3796:39;;3779:6;3786;3779:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3779:56:0;;;;;;;;-1:-1:-1;3850:11:0;3859:2;3850:11;;:::i;:::-;;;3719:154;;31231:305;31333:4;-1:-1:-1;;;;;;31370:40:0;;-1:-1:-1;;;31370:40:0;;:105;;-1:-1:-1;;;;;;;31427:48:0;;-1:-1:-1;;;31427:48:0;31370:105;:158;;;-1:-1:-1;;;;;;;;;;23002:40:0;;;31492:36;22893:157;66004:552;66132:45;66159:4;66165:2;66169:7;66132:26;:45::i;:::-;66188:14;66205:19;66216:7;66205:10;:19::i;:::-;66188:36;-1:-1:-1;;;;;;66241:18:0;;66237:312;;-1:-1:-1;;;;;66276:16:0;;;;;;:12;:16;;;;;;;;:24;;;;;;;:38;;;;;;;;;;;;;;;;66237:312;;;-1:-1:-1;;;;;66336:16:0;;66332:217;;66369:41;66388:4;66394:6;66402:7;66369:18;:41::i;:::-;66332:217;;;66443:41;66462:4;66468:6;66476:7;66443:18;:41::i;:::-;-1:-1:-1;;;;;66499:16:0;;;;;;:12;:16;;;;;;;;:24;;;;;;;:38;;;;;;;;;;;;;;;;66121:435;66004:552;;;:::o;63608:145::-;63690:7;63734:11;63718:12;:6;63727:3;63718:12;:::i;:::-;63717:28;;;;:::i;:::-;63710:35;63608:145;-1:-1:-1;;;63608:145:0:o;38101:319::-;38230:18;38236:2;38240:7;38230:5;:18::i;:::-;38281:53;38312:1;38316:2;38320:7;38329:4;38281:22;:53::i;:::-;38259:153;;;;-1:-1:-1;;;38259:153:0;;;;;;;:::i;10866:108::-;10593:7;;;;10925:41;;;;-1:-1:-1;;;10925:41:0;;30821:2:1;10925:41:0;;;30803:21:1;30860:2;30840:18;;;30833:30;-1:-1:-1;;;30879:18:1;;;30872:50;30939:18;;10925:41:0;30619:344:1;42345:853:0;42499:4;-1:-1:-1;;;;;42520:13:0;;13032:19;:23;42516:675;;42556:71;;-1:-1:-1;;;42556:71:0;;-1:-1:-1;;;;;42556:36:0;;;;;:71;;6015:10;;42607:4;;42613:7;;42622:4;;42556:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42556:71:0;;;;;;;;-1:-1:-1;;42556:71:0;;;;;;;;;;;;:::i;:::-;;;42552:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42797:6;:13;42814:1;42797:18;42793:328;;42840:60;;-1:-1:-1;;;42840:60:0;;;;;;;:::i;42793:328::-;43071:6;43065:13;43056:6;43052:2;43048:15;43041:38;42552:584;-1:-1:-1;;;;;;42678:51:0;-1:-1:-1;;;42678:51:0;;-1:-1:-1;42671:58:0;;42516:675;-1:-1:-1;43175:4:0;42345:853;;;;;;:::o;47100:589::-;-1:-1:-1;;;;;47306:18:0;;47302:187;;47341:40;47373:7;48516:10;:17;;48489:24;;;;:15;:24;;;;;:44;;;48544:24;;;;;;;;;;;;48412:164;47341:40;47302:187;;;47411:2;-1:-1:-1;;;;;47403:10:0;:4;-1:-1:-1;;;;;47403:10:0;;47399:90;;47430:47;47463:4;47469:7;47430:32;:47::i;:::-;-1:-1:-1;;;;;47503:16:0;;47499:183;;47536:45;47573:7;47536:36;:45::i;47499:183::-;47609:4;-1:-1:-1;;;;;47603:10:0;:2;-1:-1:-1;;;;;47603:10:0;;47599:83;;47630:40;47658:2;47662:7;47630:27;:40::i;64792:116::-;64851:14;64887:13;64897:3;64887:7;:13;:::i;64916:506::-;65013:10;65043:9;65038:210;-1:-1:-1;;;;;65062:21:0;;;;;;:12;:21;;;;;;;;:29;;;;;;;;:36;65058:40;;65038:210;;;-1:-1:-1;;;;;65124:21:0;;;;;;:12;:21;;;;;;;;:29;;;;;;;;:32;;65160:7;;65124:29;65154:1;;65124:32;;;;;;:::i;:::-;;;;;;;;;:43;65120:117;;65196:1;65188:9;;65216:5;;65120:117;65100:3;;;;:::i;:::-;;;;65038:210;;;-1:-1:-1;;;;;;65297:21:0;;;;;;:12;:21;;;;;;;;:29;;;;;;;;65327:36;;:40;;65366:1;;65327:40;:::i;:::-;65297:71;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;65258:21:0;;;;:12;:21;;;;;;:29;;;;;;;;:36;;65288:5;;65258:36;;;;;;:::i;:::-;;;;;;;;;;;;:110;;;;-1:-1:-1;;;;;65379:21:0;;;;:12;:21;;;;;;:29;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;65002:420;64916:506;;;:::o;38756:439::-;-1:-1:-1;;;;;38836:16:0;;38828:61;;;;-1:-1:-1;;;38828:61:0;;32061:2:1;38828:61:0;;;32043:21:1;;;32080:18;;;32073:30;32139:34;32119:18;;;32112:62;32191:18;;38828:61:0;31859:356:1;38828:61:0;36929:4;36953:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36953:16:0;:30;38900:58;;;;-1:-1:-1;;;38900:58:0;;32422:2:1;38900:58:0;;;32404:21:1;32461:2;32441:18;;;32434:30;32500;32480:18;;;32473:58;32548:18;;38900:58:0;32220:352:1;38900:58:0;38971:45;39000:1;39004:2;39008:7;38971:20;:45::i;:::-;-1:-1:-1;;;;;39029:13:0;;;;;;:9;:13;;;;;:18;;39046:1;;39029:13;:18;;39046:1;;39029:18;:::i;:::-;;;;-1:-1:-1;;39058:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39058:21:0;-1:-1:-1;;;;;39058:21:0;;;;;;;;39097:33;;39058:16;;;39097:33;;39058:16;;39097:33;54041:164:::1;53963:249:::0;:::o;49203:988::-;49469:22;49519:1;49494:22;49511:4;49494:16;:22::i;:::-;:26;;;;:::i;:::-;49531:18;49552:26;;;:17;:26;;;;;;49469:51;;-1:-1:-1;49685:28:0;;;49681:328;;-1:-1:-1;;;;;49752:18:0;;49730:19;49752:18;;;:12;:18;;;;;;;;:34;;;;;;;;;49803:30;;;;;;:44;;;49920:30;;:17;:30;;;;;:43;;;49681:328;-1:-1:-1;50105:26:0;;;;:17;:26;;;;;;;;50098:33;;;-1:-1:-1;;;;;50149:18:0;;;;;:12;:18;;;;;:34;;;;;;;50142:41;49203:988::o;50486:1079::-;50764:10;:17;50739:22;;50764:21;;50784:1;;50764:21;:::i;:::-;50796:18;50817:24;;;:15;:24;;;;;;51190:10;:26;;50739:46;;-1:-1:-1;50817:24:0;;50739:46;;51190:26;;;;;;:::i;:::-;;;;;;;;;51168:48;;51254:11;51229:10;51240;51229:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;51334:28;;;:15;:28;;;;;;;:41;;;51506:24;;;;;51499:31;51541:10;:16;;;;;;;:::i;47990:221::-;48075:14;48092:20;48109:2;48092:16;:20::i;:::-;-1:-1:-1;;;;;48123:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;48168:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;47990:221:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:282::-;900:3;938:5;932:12;965:6;960:3;953:19;981:76;1050:6;1043:4;1038:3;1034:14;1027:4;1020:5;1016:16;981:76;:::i;:::-;1111:2;1090:15;-1:-1:-1;;1086:29:1;1077:39;;;;1118:4;1073:50;;847:282;-1:-1:-1;;847:282:1:o;1134:231::-;1283:2;1272:9;1265:21;1246:4;1303:56;1355:2;1344:9;1340:18;1332:6;1303:56;:::i;1552:180::-;1611:6;1664:2;1652:9;1643:7;1639:23;1635:32;1632:52;;;1680:1;1677;1670:12;1632:52;-1:-1:-1;1703:23:1;;1552:180;-1:-1:-1;1552:180:1:o;1945:173::-;2013:20;;-1:-1:-1;;;;;2062:31:1;;2052:42;;2042:70;;2108:1;2105;2098:12;2042:70;1945:173;;;:::o;2123:254::-;2191:6;2199;2252:2;2240:9;2231:7;2227:23;2223:32;2220:52;;;2268:1;2265;2258:12;2220:52;2291:29;2310:9;2291:29;:::i;:::-;2281:39;2367:2;2352:18;;;;2339:32;;-1:-1:-1;;;2123:254:1:o;2382:328::-;2459:6;2467;2475;2528:2;2516:9;2507:7;2503:23;2499:32;2496:52;;;2544:1;2541;2534:12;2496:52;2567:29;2586:9;2567:29;:::i;:::-;2557:39;;2615:38;2649:2;2638:9;2634:18;2615:38;:::i;:::-;2605:48;;2700:2;2689:9;2685:18;2672:32;2662:42;;2382:328;;;;;:::o;2715:127::-;2776:10;2771:3;2767:20;2764:1;2757:31;2807:4;2804:1;2797:15;2831:4;2828:1;2821:15;2847:275;2918:2;2912:9;2983:2;2964:13;;-1:-1:-1;;2960:27:1;2948:40;;3018:18;3003:34;;3039:22;;;3000:62;2997:88;;;3065:18;;:::i;:::-;3101:2;3094:22;2847:275;;-1:-1:-1;2847:275:1:o;3127:183::-;3187:4;3220:18;3212:6;3209:30;3206:56;;;3242:18;;:::i;:::-;-1:-1:-1;3287:1:1;3283:14;3299:4;3279:25;;3127:183::o;3315:897::-;3399:6;3430:2;3473;3461:9;3452:7;3448:23;3444:32;3441:52;;;3489:1;3486;3479:12;3441:52;3529:9;3516:23;3562:18;3554:6;3551:30;3548:50;;;3594:1;3591;3584:12;3548:50;3617:22;;3670:4;3662:13;;3658:27;-1:-1:-1;3648:55:1;;3699:1;3696;3689:12;3648:55;3735:2;3722:16;3758:60;3774:43;3814:2;3774:43;:::i;:::-;3758:60;:::i;:::-;3852:15;;;3934:1;3930:10;;;;3922:19;;3918:28;;;3883:12;;;;3958:19;;;3955:39;;;3990:1;3987;3980:12;3955:39;4014:11;;;;4034:148;4050:6;4045:3;4042:15;4034:148;;;4116:23;4135:3;4116:23;:::i;:::-;4104:36;;4067:12;;;;4160;;;;4034:148;;;4201:5;3315:897;-1:-1:-1;;;;;;;3315:897:1:o;4217:385::-;4303:6;4311;4319;4327;4380:3;4368:9;4359:7;4355:23;4351:33;4348:53;;;4397:1;4394;4387:12;4348:53;-1:-1:-1;;4420:23:1;;;4490:2;4475:18;;4462:32;;-1:-1:-1;4541:2:1;4526:18;;4513:32;;4592:2;4577:18;4564:32;;-1:-1:-1;4217:385:1;-1:-1:-1;4217:385:1:o;4607:248::-;4675:6;4683;4736:2;4724:9;4715:7;4711:23;4707:32;4704:52;;;4752:1;4749;4742:12;4704:52;-1:-1:-1;;4775:23:1;;;4845:2;4830:18;;;4817:32;;-1:-1:-1;4607:248:1:o;4860:435::-;4913:3;4951:5;4945:12;4978:6;4973:3;4966:19;5004:4;5033:2;5028:3;5024:12;5017:19;;5070:2;5063:5;5059:14;5091:1;5101:169;5115:6;5112:1;5109:13;5101:169;;;5176:13;;5164:26;;5210:12;;;;5245:15;;;;5137:1;5130:9;5101:169;;;-1:-1:-1;5286:3:1;;4860:435;-1:-1:-1;;;;;4860:435:1:o;5300:692::-;5647:6;5636:9;5629:25;5690:6;5685:2;5674:9;5670:18;5663:34;5733:6;5728:2;5717:9;5713:18;5706:34;5776:6;5771:2;5760:9;5756:18;5749:34;5820:6;5814:3;5803:9;5799:19;5792:35;5864:6;5858:3;5847:9;5843:19;5836:35;5908:3;5902;5891:9;5887:19;5880:32;5610:4;5929:57;5981:3;5970:9;5966:19;5958:6;5929:57;:::i;:::-;5921:65;5300:692;-1:-1:-1;;;;;;;;;5300:692:1:o;5997:186::-;6056:6;6109:2;6097:9;6088:7;6084:23;6080:32;6077:52;;;6125:1;6122;6115:12;6077:52;6148:29;6167:9;6148:29;:::i;6188:322::-;6265:6;6273;6281;6334:2;6322:9;6313:7;6309:23;6305:32;6302:52;;;6350:1;6347;6340:12;6302:52;6373:29;6392:9;6373:29;:::i;:::-;6363:39;6449:2;6434:18;;6421:32;;-1:-1:-1;6500:2:1;6485:18;;;6472:32;;6188:322;-1:-1:-1;;;6188:322:1:o;6515:316::-;6592:6;6600;6608;6661:2;6649:9;6640:7;6636:23;6632:32;6629:52;;;6677:1;6674;6667:12;6629:52;-1:-1:-1;;6700:23:1;;;6770:2;6755:18;;6742:32;;-1:-1:-1;6821:2:1;6806:18;;;6793:32;;6515:316;-1:-1:-1;6515:316:1:o;6836:347::-;6901:6;6909;6962:2;6950:9;6941:7;6937:23;6933:32;6930:52;;;6978:1;6975;6968:12;6930:52;7001:29;7020:9;7001:29;:::i;:::-;6991:39;;7080:2;7069:9;7065:18;7052:32;7127:5;7120:13;7113:21;7106:5;7103:32;7093:60;;7149:1;7146;7139:12;7093:60;7172:5;7162:15;;;6836:347;;;;;:::o;7584:980::-;7679:6;7687;7695;7703;7756:3;7744:9;7735:7;7731:23;7727:33;7724:53;;;7773:1;7770;7763:12;7724:53;7796:29;7815:9;7796:29;:::i;:::-;7786:39;;7844:2;7865:38;7899:2;7888:9;7884:18;7865:38;:::i;:::-;7855:48;;7950:2;7939:9;7935:18;7922:32;7912:42;;8005:2;7994:9;7990:18;7977:32;8028:18;8069:2;8061:6;8058:14;8055:34;;;8085:1;8082;8075:12;8055:34;8123:6;8112:9;8108:22;8098:32;;8168:7;8161:4;8157:2;8153:13;8149:27;8139:55;;8190:1;8187;8180:12;8139:55;8226:2;8213:16;8248:2;8244;8241:10;8238:36;;;8254:18;;:::i;:::-;8296:53;8339:2;8320:13;;-1:-1:-1;;8316:27:1;8312:36;;8296:53;:::i;:::-;8283:66;;8372:2;8365:5;8358:17;8412:7;8407:2;8402;8398;8394:11;8390:20;8387:33;8384:53;;;8433:1;8430;8423:12;8384:53;8488:2;8483;8479;8475:11;8470:2;8463:5;8459:14;8446:45;8532:1;8527:2;8522;8515:5;8511:14;8507:23;8500:34;;8553:5;8543:15;;;;;7584:980;;;;;;;:::o;8893:261::-;9072:2;9061:9;9054:21;9035:4;9092:56;9144:2;9133:9;9129:18;9121:6;9092:56;:::i;9159:260::-;9227:6;9235;9288:2;9276:9;9267:7;9263:23;9259:32;9256:52;;;9304:1;9301;9294:12;9256:52;9327:29;9346:9;9327:29;:::i;:::-;9317:39;;9375:38;9409:2;9398:9;9394:18;9375:38;:::i;:::-;9365:48;;9159:260;;;;;:::o;9424:959::-;9517:6;9525;9578:2;9566:9;9557:7;9553:23;9549:32;9546:52;;;9594:1;9591;9584:12;9546:52;9630:9;9617:23;9607:33;;9659:2;9712;9701:9;9697:18;9684:32;9739:18;9731:6;9728:30;9725:50;;;9771:1;9768;9761:12;9725:50;9794:22;;9847:4;9839:13;;9835:27;-1:-1:-1;9825:55:1;;9876:1;9873;9866:12;9825:55;9912:2;9899:16;9935:60;9951:43;9991:2;9951:43;:::i;9935:60::-;10029:15;;;10111:1;10107:10;;;;10099:19;;10095:28;;;10060:12;;;;10135:19;;;10132:39;;;10167:1;10164;10157:12;10132:39;10191:11;;;;10211:142;10227:6;10222:3;10219:15;10211:142;;;10293:17;;10281:30;;10244:12;;;;10331;;;;10211:142;;;10372:5;10362:15;;;;;;;9424:959;;;;;:::o;10388:380::-;10467:1;10463:12;;;;10510;;;10531:61;;10585:4;10577:6;10573:17;10563:27;;10531:61;10638:2;10630:6;10627:14;10607:18;10604:38;10601:161;;10684:10;10679:3;10675:20;10672:1;10665:31;10719:4;10716:1;10709:15;10747:4;10744:1;10737:15;10601:161;;10388:380;;;:::o;11606:410::-;11808:2;11790:21;;;11847:2;11827:18;;;11820:30;11886:34;11881:2;11866:18;;11859:62;-1:-1:-1;;;11952:2:1;11937:18;;11930:44;12006:3;11991:19;;11606:410::o;12021:127::-;12082:10;12077:3;12073:20;12070:1;12063:31;12113:4;12110:1;12103:15;12137:4;12134:1;12127:15;12153:127;12214:10;12209:3;12205:20;12202:1;12195:31;12245:4;12242:1;12235:15;12269:4;12266:1;12259:15;12285:135;12324:3;12345:17;;;12342:43;;12365:18;;:::i;:::-;-1:-1:-1;12412:1:1;12401:13;;12285:135::o;12425:339::-;12627:2;12609:21;;;12666:2;12646:18;;;12639:30;-1:-1:-1;;;12700:2:1;12685:18;;12678:45;12755:2;12740:18;;12425:339::o;13475:125::-;13540:9;;;13561:10;;;13558:36;;;13574:18;;:::i;13605:331::-;13807:2;13789:21;;;13846:1;13826:18;;;13819:29;-1:-1:-1;;;13879:2:1;13864:18;;13857:38;13927:2;13912:18;;13605:331::o;13941:168::-;13981:7;14047:1;14043;14039:6;14035:14;14032:1;14029:21;14024:1;14017:9;14010:17;14006:45;14003:71;;;14054:18;;:::i;:::-;-1:-1:-1;14094:9:1;;13941:168::o;14457:355::-;14659:2;14641:21;;;14698:2;14678:18;;;14671:30;14737:33;14732:2;14717:18;;14710:61;14803:2;14788:18;;14457:355::o;15726:339::-;15928:2;15910:21;;;15967:2;15947:18;;;15940:30;-1:-1:-1;;;16001:2:1;15986:18;;15979:45;16056:2;16041:18;;15726:339::o;16482:346::-;16684:2;16666:21;;;16723:2;16703:18;;;16696:30;-1:-1:-1;;;16757:2:1;16742:18;;16735:52;16819:2;16804:18;;16482:346::o;16833:412::-;17035:2;17017:21;;;17074:2;17054:18;;;17047:30;17113:34;17108:2;17093:18;;17086:62;-1:-1:-1;;;17179:2:1;17164:18;;17157:46;17235:3;17220:19;;16833:412::o;21099:344::-;21301:2;21283:21;;;21340:2;21320:18;;;21313:30;-1:-1:-1;;;21374:2:1;21359:18;;21352:50;21434:2;21419:18;;21099:344::o;23852:198::-;23894:3;23932:5;23926:12;23947:65;24005:6;24000:3;23993:4;23986:5;23982:16;23947:65;:::i;:::-;24028:16;;;;;23852:198;-1:-1:-1;;23852:198:1:o;24055:1203::-;24231:3;24260:1;24293:6;24287:13;24323:3;24345:1;24373:9;24369:2;24365:18;24355:28;;24433:2;24422:9;24418:18;24455;24445:61;;24499:4;24491:6;24487:17;24477:27;;24445:61;24525:2;24573;24565:6;24562:14;24542:18;24539:38;24536:165;;-1:-1:-1;;;24600:33:1;;24656:4;24653:1;24646:15;24686:4;24607:3;24674:17;24536:165;24717:18;24744:133;;;;24891:1;24886:320;;;;24710:496;;24744:133;-1:-1:-1;;24777:24:1;;24765:37;;24850:14;;24843:22;24831:35;;24822:45;;;-1:-1:-1;24744:133:1;;24886:320;23799:1;23792:14;;;23836:4;23823:18;;24981:1;24995:165;25009:6;25006:1;25003:13;24995:165;;;25087:14;;25074:11;;;25067:35;25130:16;;;;25024:10;;24995:165;;;24999:3;;25189:6;25184:3;25180:16;25173:23;;24710:496;;;;;;;25222:30;25248:3;25240:6;25222:30;:::i;:::-;25215:37;24055:1203;-1:-1:-1;;;;;24055:1203:1:o;27965:128::-;28032:9;;;28053:11;;;28050:37;;;28067:18;;:::i;28991:287::-;29120:3;29158:6;29152:13;29174:66;29233:6;29228:3;29221:4;29213:6;29209:17;29174:66;:::i;:::-;29256:16;;;;;28991:287;-1:-1:-1;;28991:287:1:o;29283:184::-;29353:6;29406:2;29394:9;29385:7;29381:23;29377:32;29374:52;;;29422:1;29419;29412:12;29374:52;-1:-1:-1;29445:16:1;;29283:184;-1:-1:-1;29283:184:1:o;29472:127::-;29533:10;29528:3;29524:20;29521:1;29514:31;29564:4;29561:1;29554:15;29588:4;29585:1;29578:15;29604:112;29636:1;29662;29652:35;;29667:18;;:::i;:::-;-1:-1:-1;29701:9:1;;29604:112::o;30075:414::-;30277:2;30259:21;;;30316:2;30296:18;;;30289:30;30355:34;30350:2;30335:18;;30328:62;-1:-1:-1;;;30421:2:1;30406:18;;30399:48;30479:3;30464:19;;30075:414::o;30494:120::-;30534:1;30560;30550:35;;30565:18;;:::i;:::-;-1:-1:-1;30599:9:1;;30494:120::o;30968:500::-;-1:-1:-1;;;;;31237:15:1;;;31219:34;;31289:15;;31284:2;31269:18;;31262:43;31336:2;31321:18;;31314:34;;;31384:3;31379:2;31364:18;;31357:31;;;31162:4;;31405:57;;31442:19;;31434:6;31405:57;:::i;:::-;31397:65;30968:500;-1:-1:-1;;;;;;30968:500:1:o;31473:249::-;31542:6;31595:2;31583:9;31574:7;31570:23;31566:32;31563:52;;;31611:1;31608;31601:12;31563:52;31643:9;31637:16;31662:30;31686:5;31662:30;:::i;31727:127::-;31788:10;31783:3;31779:20;31776:1;31769:31;31819:4;31816:1;31809:15;31843:4;31840:1;31833:15
Swarm Source
ipfs://33520538901d95a9d8df1a7438f2bcebf5af833d448441b661ce8911a5347cc5
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.