Feature Tip: Add private address tag to any address under My Name Tag !
NFT
Overview
TokenID
5003
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Voyagers
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-22 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/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 v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/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 v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @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: erc721a/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**128 - 1 (max value of uint128). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; } // Compiler will pack the following // _currentIndex and _burnCounter into a single 256bit word. // The tokenId of the next token to be minted. uint128 internal _currentIndex; // The number of tokens burned. uint128 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex times unchecked { return _currentIndex - _burnCounter; } } /** * @dev See {IERC721Enumerable-tokenByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenByIndex(uint256 index) public view override returns (uint256) { uint256 numMintedSoFar = _currentIndex; uint256 tokenIdsIdx; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (!ownership.burned) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert TokenIndexOutOfBounds(); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds(); uint256 numMintedSoFar = _currentIndex; uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } // Execution should never reach this point. revert(); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _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 { _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) { revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _currentIndex = uint128(updatedIndex); } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/Voyagers.sol /* _ _ | | | | | | | | ___ _ _ __ _ __ _ ___ _ __ ___ | | | |/ _ \| | | |/ _` |/ _` |/ _ \ '__/ __| \ \_/ / (_) | |_| | (_| | (_| | __/ | \__ \ \___/ \___/ \__, |\__,_|\__, |\___|_| |___/ | | __/ | __/ | | |__ _ _ |___/ |___/ | '_ \| | | | | |_) | |_| | |_.__/ \__, | _____ __/ |____ _ | _ ||___/ __ \ | | | |/' |_ _| / \/_ __ ___ __ _| |_ ___ | /| \ \/ / | | '__/ _ \/ _` | __/ _ \ \ |_/ /> <| \__/\ | | __/ (_| | || __/ \___//_/\_\\____/_| \___|\__,_|\__\___ Voyagers by 0xCreate */ pragma solidity ^0.8.7; contract Voyagers is ERC721A, Ownable { event VoyagerCreated(uint256 id, uint256 space, uint256 planet, uint256 ship, uint256 lightWeapon, uint256 heavyWeapon, uint256 role); event TraitEquipped(uint256 tokenId, uint256 traitType, uint256 traitNumber); event TraitAcquired(uint256 tokenId, uint256 traitType, uint256 traitNumber); struct Voyager { uint256 startBlock; uint256 saveBlock; uint256 points; mapping(uint256 => uint256) equippedTraits; mapping(uint256 => mapping(uint256 => bool)) hangarTraits; } mapping(uint256 => Voyager) public voyagers; mapping(uint256 => uint256) public traitCount; mapping(address => bool) public missionControl; uint256 public constant MAX_SUPPLY = 10000; bool public MINT_ACTIVE = false; string public metadataURI; constructor() ERC721A("Voyagers", "VOYAGERS") { traitCount[1] = 9; // spaces traitCount[2] = 50; // planets traitCount[3] = 83; // ships traitCount[4] = 30; // light weapons traitCount[5] = 5; // heavy weapons traitCount[6] = 10; // roles } // MINT --------------------------------------------- function mint(uint256 space, uint256 planet, uint256 ship, uint256 lightWeapon, uint256 heavyWeapon, uint256 role) public { uint256 tokenId = totalSupply(); require(MINT_ACTIVE, "Mint not active."); require(totalSupply() + 1 <= MAX_SUPPLY, "Sold out."); require(balanceOf(msg.sender) < 4, "Max of 4 per wallet."); require(space > 0 && space <= traitCount[1], "Invalid space trait."); require(planet > 0 && planet <= traitCount[2], "Invalid planet trait."); require(ship > 0 && ship <= traitCount[3], "Invalid ship trait."); require(lightWeapon > 0 && lightWeapon <= traitCount[4], "Invalid light weapon trait."); require(heavyWeapon > 0 && heavyWeapon <= traitCount[5], "Invalid heavy weapon trait."); require(role > 0 && role <= traitCount[6], "Invalid role trait."); voyagers[tokenId].equippedTraits[1] = space; voyagers[tokenId].equippedTraits[2] = planet; voyagers[tokenId].equippedTraits[3] = ship; voyagers[tokenId].equippedTraits[4] = lightWeapon; voyagers[tokenId].equippedTraits[5] = heavyWeapon; voyagers[tokenId].equippedTraits[6] = role; _safeMint(msg.sender, 1); emit VoyagerCreated(tokenId, space, planet, ship, lightWeapon, heavyWeapon, role); } // TRAITS --------------------------------------------- function getEquippedTraits(uint256 tokenId) public view returns (uint256[6] memory) { uint256 space = voyagers[tokenId].equippedTraits[1]; uint256 planet = voyagers[tokenId].equippedTraits[2]; uint256 ship = voyagers[tokenId].equippedTraits[3]; uint256 lightWeapon = voyagers[tokenId].equippedTraits[4]; uint256 heavyWeapon = voyagers[tokenId].equippedTraits[5]; uint256 role = voyagers[tokenId].equippedTraits[6]; return [space, planet, ship, lightWeapon, heavyWeapon, role]; } function equipTrait(uint256 tokenId, uint256 traitType, uint256 traitNumber) public { uint256 oldEquippedTrait = voyagers[tokenId].equippedTraits[traitType]; require(msg.sender == ownerOf(tokenId), "You do not own that token."); require(oldEquippedTrait != traitNumber, "That trait is already equipped."); require(voyagers[tokenId].hangarTraits[traitType][traitNumber], "You do not own that trait."); voyagers[tokenId].equippedTraits[traitType] = traitNumber; voyagers[tokenId].hangarTraits[traitType][traitNumber] = false; voyagers[tokenId].hangarTraits[traitType][oldEquippedTrait] = true; emit TraitEquipped(tokenId, traitType, traitNumber); } function awardTrait(uint256 tokenId, uint256 traitType, uint256 traitNumber) public onlyMissionControl { require(voyagers[tokenId].equippedTraits[traitType] != traitNumber, "That trait is already equipped."); require(!voyagers[tokenId].hangarTraits[traitType][traitNumber], "That trait is already owned."); voyagers[tokenId].hangarTraits[traitType][traitNumber] = true; emit TraitAcquired(tokenId, traitType, traitNumber); } function addTraits(uint256 traitType, uint256 quantity) public onlyOwner { traitCount[traitType] = traitCount[traitType] + quantity; } // XP --------------------------------------------- function getXP(uint256 tokenId) public view returns (uint256) { return block.number - voyagers[tokenId].startBlock; } // POINTS --------------------------------------------- function getPoints(uint256 tokenId) public view returns (uint256) { return block.number - voyagers[tokenId].saveBlock + voyagers[tokenId].points; } function spendPoints(uint256 tokenId, uint256 quantity) public onlyMissionControl { uint256 currentPoints = getPoints(tokenId); require(quantity <= currentPoints, "Not enough points."); voyagers[tokenId].points = currentPoints - quantity; voyagers[tokenId].saveBlock = block.number; } // MISSION CONTROL --------------------------------------------- function addMissionControl(address _missionControl) public onlyOwner { missionControl[_missionControl] = true; } function removeMissionControl(address _missionControl) public onlyOwner { missionControl[_missionControl] = false; } modifier onlyMissionControl() { require(missionControl[msg.sender], "Not mission control."); _; } // CONTRACT MANAGEMENT --------------------------------------------- function setMetadataURI(string memory _metadataURI) public onlyOwner { metadataURI = _metadataURI; } function startMint() public onlyOwner { MINT_ACTIVE = true; } // OVERRIDES --------------------------------------------- function _baseURI() internal view override returns (string memory) { return metadataURI; } function _beforeTokenTransfers(address from, address to, uint256 startTokenId, uint256 quantity) internal override { super._beforeTokenTransfers(from, to, startTokenId, quantity); for(uint256 i = startTokenId; i < startTokenId + quantity; i++) { voyagers[i].startBlock = block.number; voyagers[i].saveBlock = block.number; voyagers[i].points = 0; } } // WITHDRAW --------------------------------------------- function withdraw() public onlyOwner { (bool success,) = msg.sender.call{value: address(this).balance}(""); require(success, "Failed to withdraw ETH."); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"traitType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"traitNumber","type":"uint256"}],"name":"TraitAcquired","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"traitType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"traitNumber","type":"uint256"}],"name":"TraitEquipped","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":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"space","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"planet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ship","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lightWeapon","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"heavyWeapon","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"role","type":"uint256"}],"name":"VoyagerCreated","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_missionControl","type":"address"}],"name":"addMissionControl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"traitType","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"addTraits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"traitType","type":"uint256"},{"internalType":"uint256","name":"traitNumber","type":"uint256"}],"name":"awardTrait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"traitType","type":"uint256"},{"internalType":"uint256","name":"traitNumber","type":"uint256"}],"name":"equipTrait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEquippedTraits","outputs":[{"internalType":"uint256[6]","name":"","type":"uint256[6]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getXP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"space","type":"uint256"},{"internalType":"uint256","name":"planet","type":"uint256"},{"internalType":"uint256","name":"ship","type":"uint256"},{"internalType":"uint256","name":"lightWeapon","type":"uint256"},{"internalType":"uint256","name":"heavyWeapon","type":"uint256"},{"internalType":"uint256","name":"role","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"missionControl","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_missionControl","type":"address"}],"name":"removeMissionControl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadataURI","type":"string"}],"name":"setMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"spendPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMint","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":"uint256","name":"","type":"uint256"}],"name":"traitCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voyagers","outputs":[{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"saveBlock","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600b60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600881526020017f566f7961676572730000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f564f5941474552530000000000000000000000000000000000000000000000008152508160019080519060200190620000b19291906200025c565b508060029080519060200190620000ca9291906200025c565b505050620000ed620000e16200018e60201b60201c565b6200019660201b60201c565b6009806000600181526020019081526020016000208190555060326009600060028152602001908152602001600020819055506053600960006003815260200190815260200160002081905550601e6009600060048152602001908152602001600020819055506005600960006005815260200190815260200160002081905550600a60096000600681526020019081526020016000208190555062000371565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200026a906200030c565b90600052602060002090601f0160209004810192826200028e5760008555620002da565b82601f10620002a957805160ff1916838001178555620002da565b82800160010185558215620002da579182015b82811115620002d9578251825591602001919060010190620002bc565b5b509050620002e99190620002ed565b5090565b5b8082111562000308576000816000905550600101620002ee565b5090565b600060028204905060018216806200032557607f821691505b602082108114156200033c576200033b62000342565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614ebb80620003816000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c80635cdaf50c11610130578063a22cb465116100b8578063da662fff1161007c578063da662fff14610689578063e985e9c5146106a5578063f2fde38b146106d5578063f3b35c39146106f1578063fd3367ca1461072157610232565b8063a22cb465146105c1578063a967eee4146105dd578063b88d4fde1461060d578063c87b56dd14610629578063d4cae9451461065957610232565b8063750521f5116100ff578063750521f51461051b5780638da5cb5b146105375780638ef10c28146105555780638f15903c1461058757806395d89b41146105a357610232565b80635cdaf50c146104955780636352211e146104b157806370a08231146104e1578063715018a61461051157610232565b806323b872dd116101be5780633ccfd60b116101825780633ccfd60b146104075780633eb67d951461041157806342842e0e1461042d5780634e1497ed146104495780634f6ccce71461046557610232565b806323b872dd146103775780632422fe29146103935780632be09561146103af5780632f745c59146103b957806332cb6b0c146103e957610232565b806308eb8fcf1161020557806308eb8fcf146102d3578063095ea7b31461030357806315ea7bb41461031f57806318160ddd1461033b5780631a5aba5e1461035957610232565b806301ffc9a71461023757806303ee438c1461026757806306fdde0314610285578063081812fc146102a3575b600080fd5b610251600480360381019061024c9190613cee565b610751565b60405161025e9190614380565b60405180910390f35b61026f61089b565b60405161027c919061439b565b60405180910390f35b61028d610929565b60405161029a919061439b565b60405180910390f35b6102bd60048036038101906102b89190613d91565b6109bb565b6040516102ca91906142fe565b60405180910390f35b6102ed60048036038101906102e89190613b2b565b610a37565b6040516102fa9190614380565b60405180910390f35b61031d60048036038101906103189190613cae565b610a57565b005b61033960048036038101906103349190613dbe565b610b62565b005b610343610c84565b60405161035091906145fd565b60405180910390f35b610361610cd9565b60405161036e9190614380565b60405180910390f35b610391600480360381019061038c9190613b98565b610cec565b005b6103ad60048036038101906103a89190613dfe565b610cfc565b005b6103b7610f75565b005b6103d360048036038101906103ce9190613cae565b61100e565b6040516103e091906145fd565b60405180910390f35b6103f1611215565b6040516103fe91906145fd565b60405180910390f35b61040f61121b565b005b61042b60048036038101906104269190613dfe565b611346565b005b61044760048036038101906104429190613b98565b611553565b005b610463600480360381019061045e9190613dbe565b611573565b005b61047f600480360381019061047a9190613d91565b611629565b60405161048c91906145fd565b60405180910390f35b6104af60048036038101906104aa9190613b2b565b61179a565b005b6104cb60048036038101906104c69190613d91565b611871565b6040516104d891906142fe565b60405180910390f35b6104fb60048036038101906104f69190613b2b565b611887565b60405161050891906145fd565b60405180910390f35b610519611957565b005b61053560048036038101906105309190613d48565b6119df565b005b61053f611a75565b60405161054c91906142fe565b60405180910390f35b61056f600480360381019061056a9190613d91565b611a9f565b60405161057e93929190614618565b60405180910390f35b6105a1600480360381019061059c9190613b2b565b611ac9565b005b6105ab611ba0565b6040516105b8919061439b565b60405180910390f35b6105db60048036038101906105d69190613c6e565b611c32565b005b6105f760048036038101906105f29190613d91565b611daa565b60405161060491906145fd565b60405180910390f35b61062760048036038101906106229190613beb565b611df6565b005b610643600480360381019061063e9190613d91565b611e49565b604051610650919061439b565b60405180910390f35b610673600480360381019061066e9190613d91565b611ee8565b60405161068091906145fd565b60405180910390f35b6106a3600480360381019061069e9190613e51565b611f13565b005b6106bf60048036038101906106ba9190613b58565b6123c8565b6040516106cc9190614380565b60405180910390f35b6106ef60048036038101906106ea9190613b2b565b61245c565b005b61070b60048036038101906107069190613d91565b612554565b6040516107189190614365565b60405180910390f35b61073b60048036038101906107369190613d91565b6126a4565b60405161074891906145fd565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061088457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108945750610893826126bc565b5b9050919050565b600c80546108a890614931565b80601f01602080910402602001604051908101604052809291908181526020018280546108d490614931565b80156109215780601f106108f657610100808354040283529160200191610921565b820191906000526020600020905b81548152906001019060200180831161090457829003601f168201915b505050505081565b60606001805461093890614931565b80601f016020809104026020016040519081016040528092919081815260200182805461096490614931565b80156109b15780601f10610986576101008083540402835291602001916109b1565b820191906000526020600020905b81548152906001019060200180831161099457829003601f168201915b5050505050905090565b60006109c682612726565b6109fc576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6000610a6282611871565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aca576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ae961278e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b1b5750610b1981610b1461278e565b6123c8565b155b15610b52576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b5d838383612796565b505050565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be5906144bd565b60405180910390fd5b6000610bf983611daa565b905080821115610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c35906145bd565b60405180910390fd5b8181610c4a9190614847565b6008600085815260200190815260200160002060020181905550436008600085815260200190815260200160002060010181905550505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900460ff1681565b610cf7838383612848565b505050565b6000600860008581526020019081526020016000206003016000848152602001908152602001600020549050610d3184611871565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d959061441d565b60405180910390fd5b81811415610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd89061455d565b60405180910390fd5b600860008581526020019081526020016000206004016000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16610e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5d906143fd565b60405180910390fd5b81600860008681526020019081526020016000206003016000858152602001908152602001600020819055506000600860008681526020019081526020016000206004016000858152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860008681526020019081526020016000206004016000858152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f86b36ee070bec3c90c15b80ecbb122597f23aa5b3c8e71f9070628f518b8c8e8848484604051610f6793929190614618565b60405180910390a150505050565b610f7d61278e565b73ffffffffffffffffffffffffffffffffffffffff16610f9b611a75565b73ffffffffffffffffffffffffffffffffffffffff1614610ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe89061451d565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b600061101983611887565b8210611051576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015611209576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511561116857506111fc565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146111a857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111fa57868414156111f157819550505050505061120f565b83806001019450505b505b808060010191505061108b565b50600080fd5b92915050565b61271081565b61122361278e565b73ffffffffffffffffffffffffffffffffffffffff16611241611a75565b73ffffffffffffffffffffffffffffffffffffffff1614611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e9061451d565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516112bd906142e9565b60006040518083038185875af1925050503d80600081146112fa576040519150601f19603f3d011682016040523d82523d6000602084013e6112ff565b606091505b5050905080611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a906144fd565b60405180910390fd5b50565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c9906144bd565b60405180910390fd5b8060086000858152602001908152602001600020600301600084815260200190815260200160002054141561143c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114339061455d565b60405180910390fd5b600860008481526020019081526020016000206004016000838152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff16156114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b99061447d565b60405180910390fd5b6001600860008581526020019081526020016000206004016000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f3ef127e1d34dda0c033b493a1411c1184b3747d54bff45cb25b5fd96031dc1c583838360405161154693929190614618565b60405180910390a1505050565b61156e83838360405180602001604052806000815250611df6565b505050565b61157b61278e565b73ffffffffffffffffffffffffffffffffffffffff16611599611a75565b73ffffffffffffffffffffffffffffffffffffffff16146115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e69061451d565b60405180910390fd5b80600960008481526020019081526020016000205461160e91906147c0565b60096000848152602001908152602001600020819055505050565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015611762576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611754578583141561174b5781945050505050611795565b82806001019350505b508080600101915050611661565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6117a261278e565b73ffffffffffffffffffffffffffffffffffffffff166117c0611a75565b73ffffffffffffffffffffffffffffffffffffffff1614611816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180d9061451d565b60405180910390fd5b6001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600061187c82612d65565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ef576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61195f61278e565b73ffffffffffffffffffffffffffffffffffffffff1661197d611a75565b73ffffffffffffffffffffffffffffffffffffffff16146119d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ca9061451d565b60405180910390fd5b6119dd600061300d565b565b6119e761278e565b73ffffffffffffffffffffffffffffffffffffffff16611a05611a75565b73ffffffffffffffffffffffffffffffffffffffff1614611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a529061451d565b60405180910390fd5b80600c9080519060200190611a719291906138da565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60086020528060005260406000206000915090508060000154908060010154908060020154905083565b611ad161278e565b73ffffffffffffffffffffffffffffffffffffffff16611aef611a75565b73ffffffffffffffffffffffffffffffffffffffff1614611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c9061451d565b60405180910390fd5b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606060028054611baf90614931565b80601f0160208091040260200160405190810160405280929190818152602001828054611bdb90614931565b8015611c285780601f10611bfd57610100808354040283529160200191611c28565b820191906000526020600020905b815481529060010190602001808311611c0b57829003601f168201915b5050505050905090565b611c3a61278e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c9f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060066000611cac61278e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d5961278e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d9e9190614380565b60405180910390a35050565b60006008600083815260200190815260200160002060020154600860008481526020019081526020016000206001015443611de59190614847565b611def91906147c0565b9050919050565b611e01848484612848565b611e0d848484846130d3565b611e43576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611e5482612726565b611e8a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e94613261565b9050600081511415611eb55760405180602001604052806000815250611ee0565b80611ebf846132f3565b604051602001611ed09291906142c5565b6040516020818303038152906040525b915050919050565b6000600860008381526020019081526020016000206000015443611f0c9190614847565b9050919050565b6000611f1d610c84565b9050600b60009054906101000a900460ff16611f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f65906144dd565b60405180910390fd5b6127106001611f7b610c84565b611f8591906147c0565b1115611fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbd9061459d565b60405180910390fd5b6004611fd133611887565b10612011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120089061449d565b60405180910390fd5b60008711801561203557506009600060018152602001908152602001600020548711155b612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b9061443d565b60405180910390fd5b60008611801561209857506009600060028152602001908152602001600020548611155b6120d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ce906145dd565b60405180910390fd5b6000851180156120fb57506009600060038152602001908152602001600020548511155b61213a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121319061445d565b60405180910390fd5b60008411801561215e57506009600060048152602001908152602001600020548411155b61219d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612194906143bd565b60405180910390fd5b6000831180156121c157506009600060058152602001908152602001600020548311155b612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f79061457d565b60405180910390fd5b60008211801561222457506009600060068152602001908152602001600020548211155b612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225a9061453d565b60405180910390fd5b86600860008381526020019081526020016000206003016000600181526020019081526020016000208190555085600860008381526020019081526020016000206003016000600281526020019081526020016000208190555084600860008381526020019081526020016000206003016000600381526020019081526020016000208190555083600860008381526020019081526020016000206003016000600481526020019081526020016000208190555082600860008381526020019081526020016000206003016000600581526020019081526020016000208190555081600860008381526020019081526020016000206003016000600681526020019081526020016000208190555061237c336001613454565b7f41e288299f20f0cf9e795b3556dc364703fdb9951e759f01ac552ab2b74d987a818888888888886040516123b7979695949392919061464f565b60405180910390a150505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61246461278e565b73ffffffffffffffffffffffffffffffffffffffff16612482611a75565b73ffffffffffffffffffffffffffffffffffffffff16146124d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cf9061451d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253f906143dd565b60405180910390fd5b6125518161300d565b50565b61255c613960565b6000600860008481526020019081526020016000206003016000600181526020019081526020016000205490506000600860008581526020019081526020016000206003016000600281526020019081526020016000205490506000600860008681526020019081526020016000206003016000600381526020019081526020016000205490506000600860008781526020019081526020016000206003016000600481526020019081526020016000205490506000600860008881526020019081526020016000206003016000600581526020019081526020016000205490506000600860008981526020019081526020016000206003016000600681526020019081526020016000205490506040518060c00160405280878152602001868152602001858152602001848152602001838152602001828152509650505050505050919050565b60096020528060005260406000206000915090505481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612787575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061285382612d65565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661287a61278e565b73ffffffffffffffffffffffffffffffffffffffff1614806128ad57506128ac82600001516128a761278e565b6123c8565b5b806128f257506128bb61278e565b73ffffffffffffffffffffffffffffffffffffffff166128da846109bb565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061292b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612994576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129fb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a088585856001613472565b612a186000848460000151612796565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612cf55760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612cf45782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d5e8585856001613503565b5050505050565b612d6d613982565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612fd6576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612fd457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612eb8578092505050613008565b5b600115612fd357818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fce578092505050613008565b612eb9565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006130f48473ffffffffffffffffffffffffffffffffffffffff16613509565b15613254578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261311d61278e565b8786866040518563ffffffff1660e01b815260040161313f9493929190614319565b602060405180830381600087803b15801561315957600080fd5b505af192505050801561318a57506040513d601f19601f820116820180604052508101906131879190613d1b565b60015b613204573d80600081146131ba576040519150601f19603f3d011682016040523d82523d6000602084013e6131bf565b606091505b506000815114156131fc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613259565b600190505b949350505050565b6060600c805461327090614931565b80601f016020809104026020016040519081016040528092919081815260200182805461329c90614931565b80156132e95780601f106132be576101008083540402835291602001916132e9565b820191906000526020600020905b8154815290600101906020018083116132cc57829003601f168201915b5050505050905090565b6060600082141561333b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061344f565b600082905060005b6000821461336d57808061335690614994565b915050600a826133669190614816565b9150613343565b60008167ffffffffffffffff81111561338957613388614aca565b5b6040519080825280601f01601f1916602001820160405280156133bb5781602001600182028036833780820191505090505b5090505b60008514613448576001826133d49190614847565b9150600a856133e391906149dd565b60306133ef91906147c0565b60f81b81838151811061340557613404614a9b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134419190614816565b94506133bf565b8093505050505b919050565b61346e82826040518060200160405280600081525061352c565b5050565b61347e8484848461353e565b60008290505b818361349091906147c0565b8110156134fc574360086000838152602001908152602001600020600001819055504360086000838152602001908152602001600020600101819055506000600860008381526020019081526020016000206002018190555080806134f490614994565b915050613484565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6135398383836001613544565b505050565b50505050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156135df576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561361a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6136276000868387613472565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561388c57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015613840575061383e60008884886130d3565b155b15613877576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506137c5565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506138d36000868387613503565b5050505050565b8280546138e690614931565b90600052602060002090601f016020900481019282613908576000855561394f565b82601f1061392157805160ff191683800117855561394f565b8280016001018555821561394f579182015b8281111561394e578251825591602001919060010190613933565b5b50905061395c91906139c5565b5090565b6040518060c00160405280600690602082028036833780820191505090505090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139de5760008160009055506001016139c6565b5090565b60006139f56139f0846146e3565b6146be565b905082815260208101848484011115613a1157613a10614afe565b5b613a1c8482856148ef565b509392505050565b6000613a37613a3284614714565b6146be565b905082815260208101848484011115613a5357613a52614afe565b5b613a5e8482856148ef565b509392505050565b600081359050613a7581614e29565b92915050565b600081359050613a8a81614e40565b92915050565b600081359050613a9f81614e57565b92915050565b600081519050613ab481614e57565b92915050565b600082601f830112613acf57613ace614af9565b5b8135613adf8482602086016139e2565b91505092915050565b600082601f830112613afd57613afc614af9565b5b8135613b0d848260208601613a24565b91505092915050565b600081359050613b2581614e6e565b92915050565b600060208284031215613b4157613b40614b08565b5b6000613b4f84828501613a66565b91505092915050565b60008060408385031215613b6f57613b6e614b08565b5b6000613b7d85828601613a66565b9250506020613b8e85828601613a66565b9150509250929050565b600080600060608486031215613bb157613bb0614b08565b5b6000613bbf86828701613a66565b9350506020613bd086828701613a66565b9250506040613be186828701613b16565b9150509250925092565b60008060008060808587031215613c0557613c04614b08565b5b6000613c1387828801613a66565b9450506020613c2487828801613a66565b9350506040613c3587828801613b16565b925050606085013567ffffffffffffffff811115613c5657613c55614b03565b5b613c6287828801613aba565b91505092959194509250565b60008060408385031215613c8557613c84614b08565b5b6000613c9385828601613a66565b9250506020613ca485828601613a7b565b9150509250929050565b60008060408385031215613cc557613cc4614b08565b5b6000613cd385828601613a66565b9250506020613ce485828601613b16565b9150509250929050565b600060208284031215613d0457613d03614b08565b5b6000613d1284828501613a90565b91505092915050565b600060208284031215613d3157613d30614b08565b5b6000613d3f84828501613aa5565b91505092915050565b600060208284031215613d5e57613d5d614b08565b5b600082013567ffffffffffffffff811115613d7c57613d7b614b03565b5b613d8884828501613ae8565b91505092915050565b600060208284031215613da757613da6614b08565b5b6000613db584828501613b16565b91505092915050565b60008060408385031215613dd557613dd4614b08565b5b6000613de385828601613b16565b9250506020613df485828601613b16565b9150509250929050565b600080600060608486031215613e1757613e16614b08565b5b6000613e2586828701613b16565b9350506020613e3686828701613b16565b9250506040613e4786828701613b16565b9150509250925092565b60008060008060008060c08789031215613e6e57613e6d614b08565b5b6000613e7c89828a01613b16565b9650506020613e8d89828a01613b16565b9550506040613e9e89828a01613b16565b9450506060613eaf89828a01613b16565b9350506080613ec089828a01613b16565b92505060a0613ed189828a01613b16565b9150509295509295509295565b6000613eea83836142a7565b60208301905092915050565b613eff8161487b565b82525050565b613f0e8161474f565b613f18818461477d565b9250613f2382614745565b8060005b83811015613f54578151613f3b8782613ede565b9650613f4683614770565b925050600181019050613f27565b505050505050565b613f658161488d565b82525050565b6000613f768261475a565b613f808185614788565b9350613f908185602086016148fe565b613f9981614b0d565b840191505092915050565b6000613faf82614765565b613fb981856147a4565b9350613fc98185602086016148fe565b613fd281614b0d565b840191505092915050565b6000613fe882614765565b613ff281856147b5565b93506140028185602086016148fe565b80840191505092915050565b600061401b601b836147a4565b915061402682614b1e565b602082019050919050565b600061403e6026836147a4565b915061404982614b47565b604082019050919050565b6000614061601a836147a4565b915061406c82614b96565b602082019050919050565b6000614084601a836147a4565b915061408f82614bbf565b602082019050919050565b60006140a76014836147a4565b91506140b282614be8565b602082019050919050565b60006140ca6013836147a4565b91506140d582614c11565b602082019050919050565b60006140ed601c836147a4565b91506140f882614c3a565b602082019050919050565b60006141106014836147a4565b915061411b82614c63565b602082019050919050565b60006141336014836147a4565b915061413e82614c8c565b602082019050919050565b60006141566010836147a4565b915061416182614cb5565b602082019050919050565b60006141796017836147a4565b915061418482614cde565b602082019050919050565b600061419c6020836147a4565b91506141a782614d07565b602082019050919050565b60006141bf6013836147a4565b91506141ca82614d30565b602082019050919050565b60006141e2601f836147a4565b91506141ed82614d59565b602082019050919050565b6000614205601b836147a4565b915061421082614d82565b602082019050919050565b6000614228600083614799565b915061423382614dab565b600082019050919050565b600061424b6009836147a4565b915061425682614dae565b602082019050919050565b600061426e6012836147a4565b915061427982614dd7565b602082019050919050565b60006142916015836147a4565b915061429c82614e00565b602082019050919050565b6142b0816148e5565b82525050565b6142bf816148e5565b82525050565b60006142d18285613fdd565b91506142dd8284613fdd565b91508190509392505050565b60006142f48261421b565b9150819050919050565b60006020820190506143136000830184613ef6565b92915050565b600060808201905061432e6000830187613ef6565b61433b6020830186613ef6565b61434860408301856142b6565b818103606083015261435a8184613f6b565b905095945050505050565b600060c08201905061437a6000830184613f05565b92915050565b60006020820190506143956000830184613f5c565b92915050565b600060208201905081810360008301526143b58184613fa4565b905092915050565b600060208201905081810360008301526143d68161400e565b9050919050565b600060208201905081810360008301526143f681614031565b9050919050565b6000602082019050818103600083015261441681614054565b9050919050565b6000602082019050818103600083015261443681614077565b9050919050565b600060208201905081810360008301526144568161409a565b9050919050565b60006020820190508181036000830152614476816140bd565b9050919050565b60006020820190508181036000830152614496816140e0565b9050919050565b600060208201905081810360008301526144b681614103565b9050919050565b600060208201905081810360008301526144d681614126565b9050919050565b600060208201905081810360008301526144f681614149565b9050919050565b600060208201905081810360008301526145168161416c565b9050919050565b600060208201905081810360008301526145368161418f565b9050919050565b60006020820190508181036000830152614556816141b2565b9050919050565b60006020820190508181036000830152614576816141d5565b9050919050565b60006020820190508181036000830152614596816141f8565b9050919050565b600060208201905081810360008301526145b68161423e565b9050919050565b600060208201905081810360008301526145d681614261565b9050919050565b600060208201905081810360008301526145f681614284565b9050919050565b600060208201905061461260008301846142b6565b92915050565b600060608201905061462d60008301866142b6565b61463a60208301856142b6565b61464760408301846142b6565b949350505050565b600060e082019050614664600083018a6142b6565b61467160208301896142b6565b61467e60408301886142b6565b61468b60608301876142b6565b61469860808301866142b6565b6146a560a08301856142b6565b6146b260c08301846142b6565b98975050505050505050565b60006146c86146d9565b90506146d48282614963565b919050565b6000604051905090565b600067ffffffffffffffff8211156146fe576146fd614aca565b5b61470782614b0d565b9050602081019050919050565b600067ffffffffffffffff82111561472f5761472e614aca565b5b61473882614b0d565b9050602081019050919050565b6000819050919050565b600060069050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006147cb826148e5565b91506147d6836148e5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561480b5761480a614a0e565b5b828201905092915050565b6000614821826148e5565b915061482c836148e5565b92508261483c5761483b614a3d565b5b828204905092915050565b6000614852826148e5565b915061485d836148e5565b9250828210156148705761486f614a0e565b5b828203905092915050565b6000614886826148c5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561491c578082015181840152602081019050614901565b8381111561492b576000848401525b50505050565b6000600282049050600182168061494957607f821691505b6020821081141561495d5761495c614a6c565b5b50919050565b61496c82614b0d565b810181811067ffffffffffffffff8211171561498b5761498a614aca565b5b80604052505050565b600061499f826148e5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149d2576149d1614a0e565b5b600182019050919050565b60006149e8826148e5565b91506149f3836148e5565b925082614a0357614a02614a3d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f496e76616c6964206c6967687420776561706f6e2074726169742e0000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f596f7520646f206e6f74206f776e20746861742074726169742e000000000000600082015250565b7f596f7520646f206e6f74206f776e207468617420746f6b656e2e000000000000600082015250565b7f496e76616c69642073706163652074726169742e000000000000000000000000600082015250565b7f496e76616c696420736869702074726169742e00000000000000000000000000600082015250565b7f5468617420747261697420697320616c7265616479206f776e65642e00000000600082015250565b7f4d6178206f662034207065722077616c6c65742e000000000000000000000000600082015250565b7f4e6f74206d697373696f6e20636f6e74726f6c2e000000000000000000000000600082015250565b7f4d696e74206e6f74206163746976652e00000000000000000000000000000000600082015250565b7f4661696c656420746f207769746864726177204554482e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c696420726f6c652074726169742e00000000000000000000000000600082015250565b7f5468617420747261697420697320616c72656164792065717569707065642e00600082015250565b7f496e76616c696420686561767920776561706f6e2074726169742e0000000000600082015250565b50565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820706f696e74732e0000000000000000000000000000600082015250565b7f496e76616c696420706c616e65742074726169742e0000000000000000000000600082015250565b614e328161487b565b8114614e3d57600080fd5b50565b614e498161488d565b8114614e5457600080fd5b50565b614e6081614899565b8114614e6b57600080fd5b50565b614e77816148e5565b8114614e8257600080fd5b5056fea2646970667358221220d9045b49d6a9157835a31290d9792835c58d56b1c3d0d5ba0b209c8711b1b8c064736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102325760003560e01c80635cdaf50c11610130578063a22cb465116100b8578063da662fff1161007c578063da662fff14610689578063e985e9c5146106a5578063f2fde38b146106d5578063f3b35c39146106f1578063fd3367ca1461072157610232565b8063a22cb465146105c1578063a967eee4146105dd578063b88d4fde1461060d578063c87b56dd14610629578063d4cae9451461065957610232565b8063750521f5116100ff578063750521f51461051b5780638da5cb5b146105375780638ef10c28146105555780638f15903c1461058757806395d89b41146105a357610232565b80635cdaf50c146104955780636352211e146104b157806370a08231146104e1578063715018a61461051157610232565b806323b872dd116101be5780633ccfd60b116101825780633ccfd60b146104075780633eb67d951461041157806342842e0e1461042d5780634e1497ed146104495780634f6ccce71461046557610232565b806323b872dd146103775780632422fe29146103935780632be09561146103af5780632f745c59146103b957806332cb6b0c146103e957610232565b806308eb8fcf1161020557806308eb8fcf146102d3578063095ea7b31461030357806315ea7bb41461031f57806318160ddd1461033b5780631a5aba5e1461035957610232565b806301ffc9a71461023757806303ee438c1461026757806306fdde0314610285578063081812fc146102a3575b600080fd5b610251600480360381019061024c9190613cee565b610751565b60405161025e9190614380565b60405180910390f35b61026f61089b565b60405161027c919061439b565b60405180910390f35b61028d610929565b60405161029a919061439b565b60405180910390f35b6102bd60048036038101906102b89190613d91565b6109bb565b6040516102ca91906142fe565b60405180910390f35b6102ed60048036038101906102e89190613b2b565b610a37565b6040516102fa9190614380565b60405180910390f35b61031d60048036038101906103189190613cae565b610a57565b005b61033960048036038101906103349190613dbe565b610b62565b005b610343610c84565b60405161035091906145fd565b60405180910390f35b610361610cd9565b60405161036e9190614380565b60405180910390f35b610391600480360381019061038c9190613b98565b610cec565b005b6103ad60048036038101906103a89190613dfe565b610cfc565b005b6103b7610f75565b005b6103d360048036038101906103ce9190613cae565b61100e565b6040516103e091906145fd565b60405180910390f35b6103f1611215565b6040516103fe91906145fd565b60405180910390f35b61040f61121b565b005b61042b60048036038101906104269190613dfe565b611346565b005b61044760048036038101906104429190613b98565b611553565b005b610463600480360381019061045e9190613dbe565b611573565b005b61047f600480360381019061047a9190613d91565b611629565b60405161048c91906145fd565b60405180910390f35b6104af60048036038101906104aa9190613b2b565b61179a565b005b6104cb60048036038101906104c69190613d91565b611871565b6040516104d891906142fe565b60405180910390f35b6104fb60048036038101906104f69190613b2b565b611887565b60405161050891906145fd565b60405180910390f35b610519611957565b005b61053560048036038101906105309190613d48565b6119df565b005b61053f611a75565b60405161054c91906142fe565b60405180910390f35b61056f600480360381019061056a9190613d91565b611a9f565b60405161057e93929190614618565b60405180910390f35b6105a1600480360381019061059c9190613b2b565b611ac9565b005b6105ab611ba0565b6040516105b8919061439b565b60405180910390f35b6105db60048036038101906105d69190613c6e565b611c32565b005b6105f760048036038101906105f29190613d91565b611daa565b60405161060491906145fd565b60405180910390f35b61062760048036038101906106229190613beb565b611df6565b005b610643600480360381019061063e9190613d91565b611e49565b604051610650919061439b565b60405180910390f35b610673600480360381019061066e9190613d91565b611ee8565b60405161068091906145fd565b60405180910390f35b6106a3600480360381019061069e9190613e51565b611f13565b005b6106bf60048036038101906106ba9190613b58565b6123c8565b6040516106cc9190614380565b60405180910390f35b6106ef60048036038101906106ea9190613b2b565b61245c565b005b61070b60048036038101906107069190613d91565b612554565b6040516107189190614365565b60405180910390f35b61073b60048036038101906107369190613d91565b6126a4565b60405161074891906145fd565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061088457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108945750610893826126bc565b5b9050919050565b600c80546108a890614931565b80601f01602080910402602001604051908101604052809291908181526020018280546108d490614931565b80156109215780601f106108f657610100808354040283529160200191610921565b820191906000526020600020905b81548152906001019060200180831161090457829003601f168201915b505050505081565b60606001805461093890614931565b80601f016020809104026020016040519081016040528092919081815260200182805461096490614931565b80156109b15780601f10610986576101008083540402835291602001916109b1565b820191906000526020600020905b81548152906001019060200180831161099457829003601f168201915b5050505050905090565b60006109c682612726565b6109fc576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6000610a6282611871565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aca576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ae961278e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b1b5750610b1981610b1461278e565b6123c8565b155b15610b52576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b5d838383612796565b505050565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be5906144bd565b60405180910390fd5b6000610bf983611daa565b905080821115610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c35906145bd565b60405180910390fd5b8181610c4a9190614847565b6008600085815260200190815260200160002060020181905550436008600085815260200190815260200160002060010181905550505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900460ff1681565b610cf7838383612848565b505050565b6000600860008581526020019081526020016000206003016000848152602001908152602001600020549050610d3184611871565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d959061441d565b60405180910390fd5b81811415610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd89061455d565b60405180910390fd5b600860008581526020019081526020016000206004016000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16610e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5d906143fd565b60405180910390fd5b81600860008681526020019081526020016000206003016000858152602001908152602001600020819055506000600860008681526020019081526020016000206004016000858152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860008681526020019081526020016000206004016000858152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f86b36ee070bec3c90c15b80ecbb122597f23aa5b3c8e71f9070628f518b8c8e8848484604051610f6793929190614618565b60405180910390a150505050565b610f7d61278e565b73ffffffffffffffffffffffffffffffffffffffff16610f9b611a75565b73ffffffffffffffffffffffffffffffffffffffff1614610ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe89061451d565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b600061101983611887565b8210611051576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015611209576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511561116857506111fc565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146111a857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111fa57868414156111f157819550505050505061120f565b83806001019450505b505b808060010191505061108b565b50600080fd5b92915050565b61271081565b61122361278e565b73ffffffffffffffffffffffffffffffffffffffff16611241611a75565b73ffffffffffffffffffffffffffffffffffffffff1614611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e9061451d565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516112bd906142e9565b60006040518083038185875af1925050503d80600081146112fa576040519150601f19603f3d011682016040523d82523d6000602084013e6112ff565b606091505b5050905080611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a906144fd565b60405180910390fd5b50565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c9906144bd565b60405180910390fd5b8060086000858152602001908152602001600020600301600084815260200190815260200160002054141561143c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114339061455d565b60405180910390fd5b600860008481526020019081526020016000206004016000838152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff16156114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b99061447d565b60405180910390fd5b6001600860008581526020019081526020016000206004016000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f3ef127e1d34dda0c033b493a1411c1184b3747d54bff45cb25b5fd96031dc1c583838360405161154693929190614618565b60405180910390a1505050565b61156e83838360405180602001604052806000815250611df6565b505050565b61157b61278e565b73ffffffffffffffffffffffffffffffffffffffff16611599611a75565b73ffffffffffffffffffffffffffffffffffffffff16146115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e69061451d565b60405180910390fd5b80600960008481526020019081526020016000205461160e91906147c0565b60096000848152602001908152602001600020819055505050565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015611762576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611754578583141561174b5781945050505050611795565b82806001019350505b508080600101915050611661565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6117a261278e565b73ffffffffffffffffffffffffffffffffffffffff166117c0611a75565b73ffffffffffffffffffffffffffffffffffffffff1614611816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180d9061451d565b60405180910390fd5b6001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600061187c82612d65565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ef576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61195f61278e565b73ffffffffffffffffffffffffffffffffffffffff1661197d611a75565b73ffffffffffffffffffffffffffffffffffffffff16146119d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ca9061451d565b60405180910390fd5b6119dd600061300d565b565b6119e761278e565b73ffffffffffffffffffffffffffffffffffffffff16611a05611a75565b73ffffffffffffffffffffffffffffffffffffffff1614611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a529061451d565b60405180910390fd5b80600c9080519060200190611a719291906138da565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60086020528060005260406000206000915090508060000154908060010154908060020154905083565b611ad161278e565b73ffffffffffffffffffffffffffffffffffffffff16611aef611a75565b73ffffffffffffffffffffffffffffffffffffffff1614611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c9061451d565b60405180910390fd5b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606060028054611baf90614931565b80601f0160208091040260200160405190810160405280929190818152602001828054611bdb90614931565b8015611c285780601f10611bfd57610100808354040283529160200191611c28565b820191906000526020600020905b815481529060010190602001808311611c0b57829003601f168201915b5050505050905090565b611c3a61278e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c9f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060066000611cac61278e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d5961278e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d9e9190614380565b60405180910390a35050565b60006008600083815260200190815260200160002060020154600860008481526020019081526020016000206001015443611de59190614847565b611def91906147c0565b9050919050565b611e01848484612848565b611e0d848484846130d3565b611e43576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611e5482612726565b611e8a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e94613261565b9050600081511415611eb55760405180602001604052806000815250611ee0565b80611ebf846132f3565b604051602001611ed09291906142c5565b6040516020818303038152906040525b915050919050565b6000600860008381526020019081526020016000206000015443611f0c9190614847565b9050919050565b6000611f1d610c84565b9050600b60009054906101000a900460ff16611f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f65906144dd565b60405180910390fd5b6127106001611f7b610c84565b611f8591906147c0565b1115611fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbd9061459d565b60405180910390fd5b6004611fd133611887565b10612011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120089061449d565b60405180910390fd5b60008711801561203557506009600060018152602001908152602001600020548711155b612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b9061443d565b60405180910390fd5b60008611801561209857506009600060028152602001908152602001600020548611155b6120d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ce906145dd565b60405180910390fd5b6000851180156120fb57506009600060038152602001908152602001600020548511155b61213a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121319061445d565b60405180910390fd5b60008411801561215e57506009600060048152602001908152602001600020548411155b61219d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612194906143bd565b60405180910390fd5b6000831180156121c157506009600060058152602001908152602001600020548311155b612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f79061457d565b60405180910390fd5b60008211801561222457506009600060068152602001908152602001600020548211155b612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225a9061453d565b60405180910390fd5b86600860008381526020019081526020016000206003016000600181526020019081526020016000208190555085600860008381526020019081526020016000206003016000600281526020019081526020016000208190555084600860008381526020019081526020016000206003016000600381526020019081526020016000208190555083600860008381526020019081526020016000206003016000600481526020019081526020016000208190555082600860008381526020019081526020016000206003016000600581526020019081526020016000208190555081600860008381526020019081526020016000206003016000600681526020019081526020016000208190555061237c336001613454565b7f41e288299f20f0cf9e795b3556dc364703fdb9951e759f01ac552ab2b74d987a818888888888886040516123b7979695949392919061464f565b60405180910390a150505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61246461278e565b73ffffffffffffffffffffffffffffffffffffffff16612482611a75565b73ffffffffffffffffffffffffffffffffffffffff16146124d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cf9061451d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253f906143dd565b60405180910390fd5b6125518161300d565b50565b61255c613960565b6000600860008481526020019081526020016000206003016000600181526020019081526020016000205490506000600860008581526020019081526020016000206003016000600281526020019081526020016000205490506000600860008681526020019081526020016000206003016000600381526020019081526020016000205490506000600860008781526020019081526020016000206003016000600481526020019081526020016000205490506000600860008881526020019081526020016000206003016000600581526020019081526020016000205490506000600860008981526020019081526020016000206003016000600681526020019081526020016000205490506040518060c00160405280878152602001868152602001858152602001848152602001838152602001828152509650505050505050919050565b60096020528060005260406000206000915090505481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612787575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061285382612d65565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661287a61278e565b73ffffffffffffffffffffffffffffffffffffffff1614806128ad57506128ac82600001516128a761278e565b6123c8565b5b806128f257506128bb61278e565b73ffffffffffffffffffffffffffffffffffffffff166128da846109bb565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061292b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612994576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129fb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a088585856001613472565b612a186000848460000151612796565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612cf55760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612cf45782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d5e8585856001613503565b5050505050565b612d6d613982565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612fd6576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612fd457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612eb8578092505050613008565b5b600115612fd357818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fce578092505050613008565b612eb9565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006130f48473ffffffffffffffffffffffffffffffffffffffff16613509565b15613254578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261311d61278e565b8786866040518563ffffffff1660e01b815260040161313f9493929190614319565b602060405180830381600087803b15801561315957600080fd5b505af192505050801561318a57506040513d601f19601f820116820180604052508101906131879190613d1b565b60015b613204573d80600081146131ba576040519150601f19603f3d011682016040523d82523d6000602084013e6131bf565b606091505b506000815114156131fc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613259565b600190505b949350505050565b6060600c805461327090614931565b80601f016020809104026020016040519081016040528092919081815260200182805461329c90614931565b80156132e95780601f106132be576101008083540402835291602001916132e9565b820191906000526020600020905b8154815290600101906020018083116132cc57829003601f168201915b5050505050905090565b6060600082141561333b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061344f565b600082905060005b6000821461336d57808061335690614994565b915050600a826133669190614816565b9150613343565b60008167ffffffffffffffff81111561338957613388614aca565b5b6040519080825280601f01601f1916602001820160405280156133bb5781602001600182028036833780820191505090505b5090505b60008514613448576001826133d49190614847565b9150600a856133e391906149dd565b60306133ef91906147c0565b60f81b81838151811061340557613404614a9b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134419190614816565b94506133bf565b8093505050505b919050565b61346e82826040518060200160405280600081525061352c565b5050565b61347e8484848461353e565b60008290505b818361349091906147c0565b8110156134fc574360086000838152602001908152602001600020600001819055504360086000838152602001908152602001600020600101819055506000600860008381526020019081526020016000206002018190555080806134f490614994565b915050613484565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6135398383836001613544565b505050565b50505050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156135df576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561361a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6136276000868387613472565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561388c57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015613840575061383e60008884886130d3565b155b15613877576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506137c5565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506138d36000868387613503565b5050505050565b8280546138e690614931565b90600052602060002090601f016020900481019282613908576000855561394f565b82601f1061392157805160ff191683800117855561394f565b8280016001018555821561394f579182015b8281111561394e578251825591602001919060010190613933565b5b50905061395c91906139c5565b5090565b6040518060c00160405280600690602082028036833780820191505090505090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139de5760008160009055506001016139c6565b5090565b60006139f56139f0846146e3565b6146be565b905082815260208101848484011115613a1157613a10614afe565b5b613a1c8482856148ef565b509392505050565b6000613a37613a3284614714565b6146be565b905082815260208101848484011115613a5357613a52614afe565b5b613a5e8482856148ef565b509392505050565b600081359050613a7581614e29565b92915050565b600081359050613a8a81614e40565b92915050565b600081359050613a9f81614e57565b92915050565b600081519050613ab481614e57565b92915050565b600082601f830112613acf57613ace614af9565b5b8135613adf8482602086016139e2565b91505092915050565b600082601f830112613afd57613afc614af9565b5b8135613b0d848260208601613a24565b91505092915050565b600081359050613b2581614e6e565b92915050565b600060208284031215613b4157613b40614b08565b5b6000613b4f84828501613a66565b91505092915050565b60008060408385031215613b6f57613b6e614b08565b5b6000613b7d85828601613a66565b9250506020613b8e85828601613a66565b9150509250929050565b600080600060608486031215613bb157613bb0614b08565b5b6000613bbf86828701613a66565b9350506020613bd086828701613a66565b9250506040613be186828701613b16565b9150509250925092565b60008060008060808587031215613c0557613c04614b08565b5b6000613c1387828801613a66565b9450506020613c2487828801613a66565b9350506040613c3587828801613b16565b925050606085013567ffffffffffffffff811115613c5657613c55614b03565b5b613c6287828801613aba565b91505092959194509250565b60008060408385031215613c8557613c84614b08565b5b6000613c9385828601613a66565b9250506020613ca485828601613a7b565b9150509250929050565b60008060408385031215613cc557613cc4614b08565b5b6000613cd385828601613a66565b9250506020613ce485828601613b16565b9150509250929050565b600060208284031215613d0457613d03614b08565b5b6000613d1284828501613a90565b91505092915050565b600060208284031215613d3157613d30614b08565b5b6000613d3f84828501613aa5565b91505092915050565b600060208284031215613d5e57613d5d614b08565b5b600082013567ffffffffffffffff811115613d7c57613d7b614b03565b5b613d8884828501613ae8565b91505092915050565b600060208284031215613da757613da6614b08565b5b6000613db584828501613b16565b91505092915050565b60008060408385031215613dd557613dd4614b08565b5b6000613de385828601613b16565b9250506020613df485828601613b16565b9150509250929050565b600080600060608486031215613e1757613e16614b08565b5b6000613e2586828701613b16565b9350506020613e3686828701613b16565b9250506040613e4786828701613b16565b9150509250925092565b60008060008060008060c08789031215613e6e57613e6d614b08565b5b6000613e7c89828a01613b16565b9650506020613e8d89828a01613b16565b9550506040613e9e89828a01613b16565b9450506060613eaf89828a01613b16565b9350506080613ec089828a01613b16565b92505060a0613ed189828a01613b16565b9150509295509295509295565b6000613eea83836142a7565b60208301905092915050565b613eff8161487b565b82525050565b613f0e8161474f565b613f18818461477d565b9250613f2382614745565b8060005b83811015613f54578151613f3b8782613ede565b9650613f4683614770565b925050600181019050613f27565b505050505050565b613f658161488d565b82525050565b6000613f768261475a565b613f808185614788565b9350613f908185602086016148fe565b613f9981614b0d565b840191505092915050565b6000613faf82614765565b613fb981856147a4565b9350613fc98185602086016148fe565b613fd281614b0d565b840191505092915050565b6000613fe882614765565b613ff281856147b5565b93506140028185602086016148fe565b80840191505092915050565b600061401b601b836147a4565b915061402682614b1e565b602082019050919050565b600061403e6026836147a4565b915061404982614b47565b604082019050919050565b6000614061601a836147a4565b915061406c82614b96565b602082019050919050565b6000614084601a836147a4565b915061408f82614bbf565b602082019050919050565b60006140a76014836147a4565b91506140b282614be8565b602082019050919050565b60006140ca6013836147a4565b91506140d582614c11565b602082019050919050565b60006140ed601c836147a4565b91506140f882614c3a565b602082019050919050565b60006141106014836147a4565b915061411b82614c63565b602082019050919050565b60006141336014836147a4565b915061413e82614c8c565b602082019050919050565b60006141566010836147a4565b915061416182614cb5565b602082019050919050565b60006141796017836147a4565b915061418482614cde565b602082019050919050565b600061419c6020836147a4565b91506141a782614d07565b602082019050919050565b60006141bf6013836147a4565b91506141ca82614d30565b602082019050919050565b60006141e2601f836147a4565b91506141ed82614d59565b602082019050919050565b6000614205601b836147a4565b915061421082614d82565b602082019050919050565b6000614228600083614799565b915061423382614dab565b600082019050919050565b600061424b6009836147a4565b915061425682614dae565b602082019050919050565b600061426e6012836147a4565b915061427982614dd7565b602082019050919050565b60006142916015836147a4565b915061429c82614e00565b602082019050919050565b6142b0816148e5565b82525050565b6142bf816148e5565b82525050565b60006142d18285613fdd565b91506142dd8284613fdd565b91508190509392505050565b60006142f48261421b565b9150819050919050565b60006020820190506143136000830184613ef6565b92915050565b600060808201905061432e6000830187613ef6565b61433b6020830186613ef6565b61434860408301856142b6565b818103606083015261435a8184613f6b565b905095945050505050565b600060c08201905061437a6000830184613f05565b92915050565b60006020820190506143956000830184613f5c565b92915050565b600060208201905081810360008301526143b58184613fa4565b905092915050565b600060208201905081810360008301526143d68161400e565b9050919050565b600060208201905081810360008301526143f681614031565b9050919050565b6000602082019050818103600083015261441681614054565b9050919050565b6000602082019050818103600083015261443681614077565b9050919050565b600060208201905081810360008301526144568161409a565b9050919050565b60006020820190508181036000830152614476816140bd565b9050919050565b60006020820190508181036000830152614496816140e0565b9050919050565b600060208201905081810360008301526144b681614103565b9050919050565b600060208201905081810360008301526144d681614126565b9050919050565b600060208201905081810360008301526144f681614149565b9050919050565b600060208201905081810360008301526145168161416c565b9050919050565b600060208201905081810360008301526145368161418f565b9050919050565b60006020820190508181036000830152614556816141b2565b9050919050565b60006020820190508181036000830152614576816141d5565b9050919050565b60006020820190508181036000830152614596816141f8565b9050919050565b600060208201905081810360008301526145b68161423e565b9050919050565b600060208201905081810360008301526145d681614261565b9050919050565b600060208201905081810360008301526145f681614284565b9050919050565b600060208201905061461260008301846142b6565b92915050565b600060608201905061462d60008301866142b6565b61463a60208301856142b6565b61464760408301846142b6565b949350505050565b600060e082019050614664600083018a6142b6565b61467160208301896142b6565b61467e60408301886142b6565b61468b60608301876142b6565b61469860808301866142b6565b6146a560a08301856142b6565b6146b260c08301846142b6565b98975050505050505050565b60006146c86146d9565b90506146d48282614963565b919050565b6000604051905090565b600067ffffffffffffffff8211156146fe576146fd614aca565b5b61470782614b0d565b9050602081019050919050565b600067ffffffffffffffff82111561472f5761472e614aca565b5b61473882614b0d565b9050602081019050919050565b6000819050919050565b600060069050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006147cb826148e5565b91506147d6836148e5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561480b5761480a614a0e565b5b828201905092915050565b6000614821826148e5565b915061482c836148e5565b92508261483c5761483b614a3d565b5b828204905092915050565b6000614852826148e5565b915061485d836148e5565b9250828210156148705761486f614a0e565b5b828203905092915050565b6000614886826148c5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561491c578082015181840152602081019050614901565b8381111561492b576000848401525b50505050565b6000600282049050600182168061494957607f821691505b6020821081141561495d5761495c614a6c565b5b50919050565b61496c82614b0d565b810181811067ffffffffffffffff8211171561498b5761498a614aca565b5b80604052505050565b600061499f826148e5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149d2576149d1614a0e565b5b600182019050919050565b60006149e8826148e5565b91506149f3836148e5565b925082614a0357614a02614a3d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f496e76616c6964206c6967687420776561706f6e2074726169742e0000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f596f7520646f206e6f74206f776e20746861742074726169742e000000000000600082015250565b7f596f7520646f206e6f74206f776e207468617420746f6b656e2e000000000000600082015250565b7f496e76616c69642073706163652074726169742e000000000000000000000000600082015250565b7f496e76616c696420736869702074726169742e00000000000000000000000000600082015250565b7f5468617420747261697420697320616c7265616479206f776e65642e00000000600082015250565b7f4d6178206f662034207065722077616c6c65742e000000000000000000000000600082015250565b7f4e6f74206d697373696f6e20636f6e74726f6c2e000000000000000000000000600082015250565b7f4d696e74206e6f74206163746976652e00000000000000000000000000000000600082015250565b7f4661696c656420746f207769746864726177204554482e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c696420726f6c652074726169742e00000000000000000000000000600082015250565b7f5468617420747261697420697320616c72656164792065717569707065642e00600082015250565b7f496e76616c696420686561767920776561706f6e2074726169742e0000000000600082015250565b50565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820706f696e74732e0000000000000000000000000000600082015250565b7f496e76616c696420706c616e65742074726169742e0000000000000000000000600082015250565b614e328161487b565b8114614e3d57600080fd5b50565b614e498161488d565b8114614e5457600080fd5b50565b614e6081614899565b8114614e6b57600080fd5b50565b614e77816148e5565b8114614e8257600080fd5b5056fea2646970667358221220d9045b49d6a9157835a31290d9792835c58d56b1c3d0d5ba0b209c8711b1b8c064736f6c63430008070033
Deployed Bytecode Sourcemap
47254:6567:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29809:372;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48049:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32419:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33922:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47909:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33485:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51995:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27046:280;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48011:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34779:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50273:701;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52944:69;;;:::i;:::-;;28632:1105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47964:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53647:171;;;:::i;:::-;;50980:451;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35020:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51437:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27619:713;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52382:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32228:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30245:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;:::i;:::-;;52830:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4079:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47811:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;52508:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32588:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34198:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51834:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35276:342;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32763:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51642:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48419:1263;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34548:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4988:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49749:518;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47859:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29809:372;29911:4;29963:25;29948:40;;;:11;:40;;;;:105;;;;30020:33;30005:48;;;:11;:48;;;;29948:105;:172;;;;30085:35;30070:50;;;:11;:50;;;;29948:172;:225;;;;30137:36;30161:11;30137:23;:36::i;:::-;29948:225;29928:245;;29809:372;;;:::o;48049:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32419:100::-;32473:13;32506:5;32499:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32419:100;:::o;33922:204::-;33990:7;34015:16;34023:7;34015;:16::i;:::-;34010:64;;34040:34;;;;;;;;;;;;;;34010:64;34094:15;:24;34110:7;34094:24;;;;;;;;;;;;;;;;;;;;;34087:31;;33922:204;;;:::o;47909:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;33485:371::-;33558:13;33574:24;33590:7;33574:15;:24::i;:::-;33558:40;;33619:5;33613:11;;:2;:11;;;33609:48;;;33633:24;;;;;;;;;;;;;;33609:48;33690:5;33674:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33700:37;33717:5;33724:12;:10;:12::i;:::-;33700:16;:37::i;:::-;33699:38;33674:63;33670:138;;;33761:35;;;;;;;;;;;;;;33670:138;33820:28;33829:2;33833:7;33842:5;33820:8;:28::i;:::-;33547:309;33485:371;;:::o;51995:311::-;52683:14;:26;52698:10;52683:26;;;;;;;;;;;;;;;;;;;;;;;;;52675:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;52084:21:::1;52108:18;52118:7;52108:9;:18::i;:::-;52084:42;;52155:13;52143:8;:25;;52135:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;52243:8;52227:13;:24;;;;:::i;:::-;52200:8;:17;52209:7;52200:17;;;;;;;;;;;:24;;:51;;;;52288:12;52258:8;:17;52267:7;52258:17;;;;;;;;;;;:27;;:42;;;;52077:229;51995:311:::0;;:::o;27046:280::-;27099:7;27291:12;;;;;;;;;;;27275:13;;;;;;;;;;:28;27268:35;;;;27046:280;:::o;48011:31::-;;;;;;;;;;;;;:::o;34779:170::-;34913:28;34923:4;34929:2;34933:7;34913:9;:28::i;:::-;34779:170;;;:::o;50273:701::-;50364:24;50391:8;:17;50400:7;50391:17;;;;;;;;;;;:32;;:43;50424:9;50391:43;;;;;;;;;;;;50364:70;;50465:16;50473:7;50465;:16::i;:::-;50451:30;;:10;:30;;;50443:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;50547:11;50527:16;:31;;50519:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;50609:8;:17;50618:7;50609:17;;;;;;;;;;;:30;;:41;50640:9;50609:41;;;;;;;;;;;:54;50651:11;50609:54;;;;;;;;;;;;;;;;;;;;;50601:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;50753:11;50707:8;:17;50716:7;50707:17;;;;;;;;;;;:32;;:43;50740:9;50707:43;;;;;;;;;;;:57;;;;50830:5;50773:8;:17;50782:7;50773:17;;;;;;;;;;;:30;;:41;50804:9;50773:41;;;;;;;;;;;:54;50815:11;50773:54;;;;;;;;;;;;:62;;;;;;;;;;;;;;;;;;50904:4;50842:8;:17;50851:7;50842:17;;;;;;;;;;;:30;;:41;50873:9;50842:41;;;;;;;;;;;:59;50884:16;50842:59;;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;50922:46;50936:7;50945:9;50956:11;50922:46;;;;;;;;:::i;:::-;;;;;;;;50357:617;50273:701;;;:::o;52944:69::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53003:4:::1;52989:11;;:18;;;;;;;;;;;;;;;;;;52944:69::o:0;28632:1105::-;28721:7;28754:16;28764:5;28754:9;:16::i;:::-;28745:5;:25;28741:61;;28779:23;;;;;;;;;;;;;;28741:61;28813:22;28838:13;;;;;;;;;;;28813:38;;;;28862:19;28892:25;29093:9;29088:557;29108:14;29104:1;:18;29088:557;;;29148:31;29182:11;:14;29194:1;29182:14;;;;;;;;;;;29148:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29219:9;:16;;;29215:73;;;29260:8;;;29215:73;29336:1;29310:28;;:9;:14;;;:28;;;29306:111;;29383:9;:14;;;29363:34;;29306:111;29460:5;29439:26;;:17;:26;;;29435:195;;;29509:5;29494:11;:20;29490:85;;;29550:1;29543:8;;;;;;;;;29490:85;29597:13;;;;;;;29435:195;29129:516;29088:557;29124:3;;;;;;;29088:557;;;;29721:8;;;28632:1105;;;;;:::o;47964:42::-;48001:5;47964:42;:::o;53647:171::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53694:12:::1;53711:10;:15;;53734:21;53711:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53693:67;;;53777:7;53769:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;53684:134;53647:171::o:0;50980:451::-;52683:14;:26;52698:10;52683:26;;;;;;;;;;;;;;;;;;;;;;;;;52675:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;51145:11:::1;51098:8;:17;51107:7;51098:17;;;;;;;;;;;:32;;:43;51131:9;51098:43;;;;;;;;;;;;:58;;51090:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;51208:8;:17;51217:7;51208:17;;;;;;;;;;;:30;;:41;51239:9;51208:41;;;;;;;;;;;:54;51250:11;51208:54;;;;;;;;;;;;;;;;;;;;;51207:55;51199:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;51361:4;51304:8;:17;51313:7;51304:17;;;;;;;;;;;:30;;:41;51335:9;51304:41;;;;;;;;;;;:54;51346:11;51304:54;;;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;51379:46;51393:7;51402:9;51413:11;51379:46;;;;;;;;:::i;:::-;;;;;;;;50980:451:::0;;;:::o;35020:185::-;35158:39;35175:4;35181:2;35185:7;35158:39;;;;;;;;;;;;:16;:39::i;:::-;35020:185;;;:::o;51437:142::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51565:8:::1;51541:10;:21;51552:9;51541:21;;;;;;;;;;;;:32;;;;:::i;:::-;51517:10;:21;51528:9;51517:21;;;;;;;;;;;:56;;;;51437:142:::0;;:::o;27619:713::-;27686:7;27706:22;27731:13;;;;;;;;;;27706:38;;;;27755:19;27950:9;27945:328;27965:14;27961:1;:18;27945:328;;;28005:31;28039:11;:14;28051:1;28039:14;;;;;;;;;;;28005:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28077:9;:16;;;28072:186;;28137:5;28122:11;:20;28118:85;;;28178:1;28171:8;;;;;;;;28118:85;28225:13;;;;;;;28072:186;27986:287;27981:3;;;;;;;27945:328;;;;28301:23;;;;;;;;;;;;;;27619:713;;;;:::o;52382:120::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52492:4:::1;52458:14;:31;52473:15;52458:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;52382:120:::0;:::o;32228:124::-;32292:7;32319:20;32331:7;32319:11;:20::i;:::-;:25;;;32312:32;;32228:124;;;:::o;30245:206::-;30309:7;30350:1;30333:19;;:5;:19;;;30329:60;;;30361:28;;;;;;;;;;;;;;30329:60;30415:12;:19;30428:5;30415:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30407:36;;30400:43;;30245:206;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;52830:108::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52920:12:::1;52906:11;:26;;;;;;;;;;;;:::i;:::-;;52830:108:::0;:::o;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;47811:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52508:124::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52621:5:::1;52587:14;:31;52602:15;52587:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;52508:124:::0;:::o;32588:104::-;32644:13;32677:7;32670:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32588:104;:::o;34198:279::-;34301:12;:10;:12::i;:::-;34289:24;;:8;:24;;;34285:54;;;34322:17;;;;;;;;;;;;;;34285:54;34397:8;34352:18;:32;34371:12;:10;:12::i;:::-;34352:32;;;;;;;;;;;;;;;:42;34385:8;34352:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34450:8;34421:48;;34436:12;:10;:12::i;:::-;34421:48;;;34460:8;34421:48;;;;;;:::i;:::-;;;;;;;;34198:279;;:::o;51834:155::-;51891:7;51959:8;:17;51968:7;51959:17;;;;;;;;;;;:24;;;51929:8;:17;51938:7;51929:17;;;;;;;;;;;:27;;;51914:12;:42;;;;:::i;:::-;:69;;;;:::i;:::-;51907:76;;51834:155;;;:::o;35276:342::-;35443:28;35453:4;35459:2;35463:7;35443:9;:28::i;:::-;35487:48;35510:4;35516:2;35520:7;35529:5;35487:22;:48::i;:::-;35482:129;;35559:40;;;;;;;;;;;;;;35482:129;35276:342;;;;:::o;32763:318::-;32836:13;32867:16;32875:7;32867;:16::i;:::-;32862:59;;32892:29;;;;;;;;;;;;;;32862:59;32934:21;32958:10;:8;:10::i;:::-;32934:34;;33011:1;32992:7;32986:21;:26;;:87;;;;;;;;;;;;;;;;;33039:7;33048:18;:7;:16;:18::i;:::-;33022:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32986:87;32979:94;;;32763:318;;;:::o;51642:125::-;51695:7;51733:8;:17;51742:7;51733:17;;;;;;;;;;;:28;;;51718:12;:43;;;;:::i;:::-;51711:50;;51642:125;;;:::o;48419:1263::-;48548:15;48566:13;:11;:13::i;:::-;48548:31;;48596:11;;;;;;;;;;;48588:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;48001:5;48659:1;48643:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:31;;48635:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48727:1;48703:21;48713:10;48703:9;:21::i;:::-;:25;48695:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48778:1;48770:5;:9;:35;;;;;48792:10;:13;48803:1;48792:13;;;;;;;;;;;;48783:5;:22;;48770:35;48762:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48854:1;48845:6;:10;:37;;;;;48869:10;:13;48880:1;48869:13;;;;;;;;;;;;48859:6;:23;;48845:37;48837:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48930:1;48923:4;:8;:33;;;;;48943:10;:13;48954:1;48943:13;;;;;;;;;;;;48935:4;:21;;48923:33;48915:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49009:1;48995:11;:15;:47;;;;;49029:10;:13;49040:1;49029:13;;;;;;;;;;;;49014:11;:28;;48995:47;48987:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;49103:1;49089:11;:15;:47;;;;;49123:10;:13;49134:1;49123:13;;;;;;;;;;;;49108:11;:28;;49089:47;49081:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;49190:1;49183:4;:8;:33;;;;;49203:10;:13;49214:1;49203:13;;;;;;;;;;;;49195:4;:21;;49183:33;49175:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49287:5;49249:8;:17;49258:7;49249:17;;;;;;;;;;;:32;;:35;49282:1;49249:35;;;;;;;;;;;:43;;;;49337:6;49299:8;:17;49308:7;49299:17;;;;;;;;;;;:32;;:35;49332:1;49299:35;;;;;;;;;;;:44;;;;49388:4;49350:8;:17;49359:7;49350:17;;;;;;;;;;;:32;;:35;49383:1;49350:35;;;;;;;;;;;:42;;;;49437:11;49399:8;:17;49408:7;49399:17;;;;;;;;;;;:32;;:35;49432:1;49399:35;;;;;;;;;;;:49;;;;49493:11;49455:8;:17;49464:7;49455:17;;;;;;;;;;;:32;;:35;49488:1;49455:35;;;;;;;;;;;:49;;;;49549:4;49511:8;:17;49520:7;49511:17;;;;;;;;;;;:32;;:35;49544:1;49511:35;;;;;;;;;;;:42;;;;49562:24;49572:10;49584:1;49562:9;:24::i;:::-;49600:76;49615:7;49624:5;49631:6;49639:4;49645:11;49658;49671:4;49600:76;;;;;;;;;;;;:::i;:::-;;;;;;;;48541:1141;48419:1263;;;;;;:::o;34548:164::-;34645:4;34669:18;:25;34688:5;34669:25;;;;;;;;;;;;;;;:35;34695:8;34669:35;;;;;;;;;;;;;;;;;;;;;;;;;34662:42;;34548:164;;;;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;;;5069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;49749:518::-;49814:17;;:::i;:::-;49840:13;49856:8;:17;49865:7;49856:17;;;;;;;;;;;:32;;:35;49889:1;49856:35;;;;;;;;;;;;49840:51;;49898:14;49915:8;:17;49924:7;49915:17;;;;;;;;;;;:32;;:35;49948:1;49915:35;;;;;;;;;;;;49898:52;;49957:12;49972:8;:17;49981:7;49972:17;;;;;;;;;;;:32;;:35;50005:1;49972:35;;;;;;;;;;;;49957:50;;50014:19;50036:8;:17;50045:7;50036:17;;;;;;;;;;;:32;;:35;50069:1;50036:35;;;;;;;;;;;;50014:57;;50078:19;50100:8;:17;50109:7;50100:17;;;;;;;;;;;:32;;:35;50133:1;50100:35;;;;;;;;;;;;50078:57;;50142:12;50157:8;:17;50166:7;50157:17;;;;;;;;;;;:32;;:35;50190:1;50157:35;;;;;;;;;;;;50142:50;;50201:60;;;;;;;;50209:5;50201:60;;;;50216:6;50201:60;;;;50224:4;50201:60;;;;50230:11;50201:60;;;;50243:11;50201:60;;;;50256:4;50201:60;;;;;;;;;;;49749:518;;;:::o;47859:45::-;;;;;;;;;;;;;;;;;:::o;16863:157::-;16948:4;16987:25;16972:40;;;:11;:40;;;;16965:47;;16863:157;;;:::o;35873:144::-;35930:4;35964:13;;;;;;;;;;;35954:23;;:7;:23;:55;;;;;35982:11;:20;35994:7;35982:20;;;;;;;;;;;:27;;;;;;;;;;;;35981:28;35954:55;35947:62;;35873:144;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;43089:196::-;43231:2;43204:15;:24;43220:7;43204:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43269:7;43265:2;43249:28;;43258:5;43249:28;;;;;;;;;;;;43089:196;;;:::o;38590:2112::-;38705:35;38743:20;38755:7;38743:11;:20::i;:::-;38705:58;;38776:22;38818:13;:18;;;38802:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;38853:50;38870:13;:18;;;38890:12;:10;:12::i;:::-;38853:16;:50::i;:::-;38802:101;:154;;;;38944:12;:10;:12::i;:::-;38920:36;;:20;38932:7;38920:11;:20::i;:::-;:36;;;38802:154;38776:181;;38975:17;38970:66;;39001:35;;;;;;;;;;;;;;38970:66;39073:4;39051:26;;:13;:18;;;:26;;;39047:67;;39086:28;;;;;;;;;;;;;;39047:67;39143:1;39129:16;;:2;:16;;;39125:52;;;39154:23;;;;;;;;;;;;;;39125:52;39190:43;39212:4;39218:2;39222:7;39231:1;39190:21;:43::i;:::-;39298:49;39315:1;39319:7;39328:13;:18;;;39298:8;:49::i;:::-;39673:1;39643:12;:18;39656:4;39643:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39717:1;39689:12;:16;39702:2;39689:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39763:2;39735:11;:20;39747:7;39735:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;39825:15;39780:11;:20;39792:7;39780:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;40093:19;40125:1;40115:7;:11;40093:33;;40186:1;40145:43;;:11;:24;40157:11;40145:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;40141:445;;;40370:13;;;;;;;;;;40356:27;;:11;:27;40352:219;;;40440:13;:18;;;40408:11;:24;40420:11;40408:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;40523:13;:28;;;40481:11;:24;40493:11;40481:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;40352:219;40141:445;39618:979;40633:7;40629:2;40614:27;;40623:4;40614:27;;;;;;;;;;;;40652:42;40673:4;40679:2;40683:7;40692:1;40652:20;:42::i;:::-;38694:2008;;38590:2112;;;:::o;31083:1083::-;31144:21;;:::i;:::-;31178:12;31193:7;31178:22;;31249:13;;;;;;;;;;31242:20;;:4;:20;31238:861;;;31283:31;31317:11;:17;31329:4;31317:17;;;;;;;;;;;31283:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31358:9;:16;;;31353:731;;31429:1;31403:28;;:9;:14;;;:28;;;31399:101;;31467:9;31460:16;;;;;;31399:101;31804:261;31811:4;31804:261;;;31844:6;;;;;;;;31889:11;:17;31901:4;31889:17;;;;;;;;;;;31877:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31963:1;31937:28;;:9;:14;;;:28;;;31933:109;;32005:9;31998:16;;;;;;31933:109;31804:261;;;31353:731;31264:835;31238:861;32127:31;;;;;;;;;;;;;;31083:1083;;;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;43850:790::-;44005:4;44026:15;:2;:13;;;:15::i;:::-;44022:611;;;44078:2;44062:36;;;44099:12;:10;:12::i;:::-;44113:4;44119:7;44128:5;44062:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44058:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44325:1;44308:6;:13;:18;44304:259;;;44358:40;;;;;;;;;;;;;;44304:259;44513:6;44507:13;44498:6;44494:2;44490:15;44483:38;44058:520;44195:45;;;44185:55;;;:6;:55;;;;44178:62;;;;;44022:611;44617:4;44610:11;;43850:790;;;;;;;:::o;53083:98::-;53135:13;53164:11;53157:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53083:98;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;36025:104::-;36094:27;36104:2;36108:8;36094:27;;;;;;;;;;;;:9;:27::i;:::-;36025:104;;:::o;53187:391::-;53309:61;53337:4;53343:2;53347:12;53361:8;53309:27;:61::i;:::-;53383:9;53395:12;53383:24;;53379:194;53428:8;53413:12;:23;;;;:::i;:::-;53409:1;:27;53379:194;;;53477:12;53452:8;:11;53461:1;53452:11;;;;;;;;;;;:22;;:37;;;;53522:12;53498:8;:11;53507:1;53498:11;;;;;;;;;;;:21;;:36;;;;53564:1;53543:8;:11;53552:1;53543:11;;;;;;;;;;;:18;;:22;;;;53438:3;;;;;:::i;:::-;;;;53379:194;;;;53187:391;;;;:::o;46106:158::-;;;;;:::o;6780:326::-;6840:4;7097:1;7075:7;:19;;;:23;7068:30;;6780:326;;;:::o;36492:163::-;36615:32;36621:2;36625:8;36635:5;36642:4;36615:5;:32::i;:::-;36492:163;;;:::o;45288:159::-;;;;;:::o;36914:1422::-;37053:20;37076:13;;;;;;;;;;;37053:36;;;;37118:1;37104:16;;:2;:16;;;37100:48;;;37129:19;;;;;;;;;;;;;;37100:48;37175:1;37163:8;:13;37159:44;;;37185:18;;;;;;;;;;;;;;37159:44;37216:61;37246:1;37250:2;37254:12;37268:8;37216:21;:61::i;:::-;37590:8;37555:12;:16;37568:2;37555:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37654:8;37614:12;:16;37627:2;37614:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37713:2;37680:11;:25;37692:12;37680:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37780:15;37730:11;:25;37742:12;37730:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37813:20;37836:12;37813:35;;37870:9;37865:328;37885:8;37881:1;:12;37865:328;;;37949:12;37945:2;37924:38;;37941:1;37924:38;;;;;;;;;;;;37985:4;:68;;;;;37994:59;38025:1;38029:2;38033:12;38047:5;37994:22;:59::i;:::-;37993:60;37985:68;37981:164;;;38085:40;;;;;;;;;;;;;;37981:164;38163:14;;;;;;;37895:3;;;;;;;37865:328;;;;38233:12;38209:13;;:37;;;;;;;;;;;;;;;;;;37530:728;38268:60;38297:1;38301:2;38305:12;38319:8;38268:20;:60::i;:::-;37042:1294;36914:1422;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:474::-;7226:6;7234;7283:2;7271:9;7262:7;7258:23;7254:32;7251:119;;;7289:79;;:::i;:::-;7251:119;7409:1;7434:53;7479:7;7470:6;7459:9;7455:22;7434:53;:::i;:::-;7424:63;;7380:117;7536:2;7562:53;7607:7;7598:6;7587:9;7583:22;7562:53;:::i;:::-;7552:63;;7507:118;7158:474;;;;;:::o;7638:619::-;7715:6;7723;7731;7780:2;7768:9;7759:7;7755:23;7751:32;7748:119;;;7786:79;;:::i;:::-;7748:119;7906:1;7931:53;7976:7;7967:6;7956:9;7952:22;7931:53;:::i;:::-;7921:63;;7877:117;8033:2;8059:53;8104:7;8095:6;8084:9;8080:22;8059:53;:::i;:::-;8049:63;;8004:118;8161:2;8187:53;8232:7;8223:6;8212:9;8208:22;8187:53;:::i;:::-;8177:63;;8132:118;7638:619;;;;;:::o;8263:1057::-;8367:6;8375;8383;8391;8399;8407;8456:3;8444:9;8435:7;8431:23;8427:33;8424:120;;;8463:79;;:::i;:::-;8424:120;8583:1;8608:53;8653:7;8644:6;8633:9;8629:22;8608:53;:::i;:::-;8598:63;;8554:117;8710:2;8736:53;8781:7;8772:6;8761:9;8757:22;8736:53;:::i;:::-;8726:63;;8681:118;8838:2;8864:53;8909:7;8900:6;8889:9;8885:22;8864:53;:::i;:::-;8854:63;;8809:118;8966:2;8992:53;9037:7;9028:6;9017:9;9013:22;8992:53;:::i;:::-;8982:63;;8937:118;9094:3;9121:53;9166:7;9157:6;9146:9;9142:22;9121:53;:::i;:::-;9111:63;;9065:119;9223:3;9250:53;9295:7;9286:6;9275:9;9271:22;9250:53;:::i;:::-;9240:63;;9194:119;8263:1057;;;;;;;;:::o;9326:179::-;9395:10;9416:46;9458:3;9450:6;9416:46;:::i;:::-;9494:4;9489:3;9485:14;9471:28;;9326:179;;;;:::o;9511:118::-;9598:24;9616:5;9598:24;:::i;:::-;9593:3;9586:37;9511:118;;:::o;9667:694::-;9803:52;9849:5;9803:52;:::i;:::-;9871:84;9948:6;9943:3;9871:84;:::i;:::-;9864:91;;9979:54;10027:5;9979:54;:::i;:::-;10056:7;10087:1;10072:282;10097:6;10094:1;10091:13;10072:282;;;10173:6;10167:13;10200:63;10259:3;10244:13;10200:63;:::i;:::-;10193:70;;10286:58;10337:6;10286:58;:::i;:::-;10276:68;;10132:222;10119:1;10116;10112:9;10107:14;;10072:282;;;10076:14;9779:582;;;9667:694;;:::o;10367:109::-;10448:21;10463:5;10448:21;:::i;:::-;10443:3;10436:34;10367:109;;:::o;10482:360::-;10568:3;10596:38;10628:5;10596:38;:::i;:::-;10650:70;10713:6;10708:3;10650:70;:::i;:::-;10643:77;;10729:52;10774:6;10769:3;10762:4;10755:5;10751:16;10729:52;:::i;:::-;10806:29;10828:6;10806:29;:::i;:::-;10801:3;10797:39;10790:46;;10572:270;10482:360;;;;:::o;10848:364::-;10936:3;10964:39;10997:5;10964:39;:::i;:::-;11019:71;11083:6;11078:3;11019:71;:::i;:::-;11012:78;;11099:52;11144:6;11139:3;11132:4;11125:5;11121:16;11099:52;:::i;:::-;11176:29;11198:6;11176:29;:::i;:::-;11171:3;11167:39;11160:46;;10940:272;10848:364;;;;:::o;11218:377::-;11324:3;11352:39;11385:5;11352:39;:::i;:::-;11407:89;11489:6;11484:3;11407:89;:::i;:::-;11400:96;;11505:52;11550:6;11545:3;11538:4;11531:5;11527:16;11505:52;:::i;:::-;11582:6;11577:3;11573:16;11566:23;;11328:267;11218:377;;;;:::o;11601:366::-;11743:3;11764:67;11828:2;11823:3;11764:67;:::i;:::-;11757:74;;11840:93;11929:3;11840:93;:::i;:::-;11958:2;11953:3;11949:12;11942:19;;11601:366;;;:::o;11973:::-;12115:3;12136:67;12200:2;12195:3;12136:67;:::i;:::-;12129:74;;12212:93;12301:3;12212:93;:::i;:::-;12330:2;12325:3;12321:12;12314:19;;11973:366;;;:::o;12345:::-;12487:3;12508:67;12572:2;12567:3;12508:67;:::i;:::-;12501:74;;12584:93;12673:3;12584:93;:::i;:::-;12702:2;12697:3;12693:12;12686:19;;12345:366;;;:::o;12717:::-;12859:3;12880:67;12944:2;12939:3;12880:67;:::i;:::-;12873:74;;12956:93;13045:3;12956:93;:::i;:::-;13074:2;13069:3;13065:12;13058:19;;12717:366;;;:::o;13089:::-;13231:3;13252:67;13316:2;13311:3;13252:67;:::i;:::-;13245:74;;13328:93;13417:3;13328:93;:::i;:::-;13446:2;13441:3;13437:12;13430:19;;13089:366;;;:::o;13461:::-;13603:3;13624:67;13688:2;13683:3;13624:67;:::i;:::-;13617:74;;13700:93;13789:3;13700:93;:::i;:::-;13818:2;13813:3;13809:12;13802:19;;13461:366;;;:::o;13833:::-;13975:3;13996:67;14060:2;14055:3;13996:67;:::i;:::-;13989:74;;14072:93;14161:3;14072:93;:::i;:::-;14190:2;14185:3;14181:12;14174:19;;13833:366;;;:::o;14205:::-;14347:3;14368:67;14432:2;14427:3;14368:67;:::i;:::-;14361:74;;14444:93;14533:3;14444:93;:::i;:::-;14562:2;14557:3;14553:12;14546:19;;14205:366;;;:::o;14577:::-;14719:3;14740:67;14804:2;14799:3;14740:67;:::i;:::-;14733:74;;14816:93;14905:3;14816:93;:::i;:::-;14934:2;14929:3;14925:12;14918:19;;14577:366;;;:::o;14949:::-;15091:3;15112:67;15176:2;15171:3;15112:67;:::i;:::-;15105:74;;15188:93;15277:3;15188:93;:::i;:::-;15306:2;15301:3;15297:12;15290:19;;14949:366;;;:::o;15321:::-;15463:3;15484:67;15548:2;15543:3;15484:67;:::i;:::-;15477:74;;15560:93;15649:3;15560:93;:::i;:::-;15678:2;15673:3;15669:12;15662:19;;15321:366;;;:::o;15693:::-;15835:3;15856:67;15920:2;15915:3;15856:67;:::i;:::-;15849:74;;15932:93;16021:3;15932:93;:::i;:::-;16050:2;16045:3;16041:12;16034:19;;15693:366;;;:::o;16065:::-;16207:3;16228:67;16292:2;16287:3;16228:67;:::i;:::-;16221:74;;16304:93;16393:3;16304:93;:::i;:::-;16422:2;16417:3;16413:12;16406:19;;16065:366;;;:::o;16437:::-;16579:3;16600:67;16664:2;16659:3;16600:67;:::i;:::-;16593:74;;16676:93;16765:3;16676:93;:::i;:::-;16794:2;16789:3;16785:12;16778:19;;16437:366;;;:::o;16809:::-;16951:3;16972:67;17036:2;17031:3;16972:67;:::i;:::-;16965:74;;17048:93;17137:3;17048:93;:::i;:::-;17166:2;17161:3;17157:12;17150:19;;16809:366;;;:::o;17181:398::-;17340:3;17361:83;17442:1;17437:3;17361:83;:::i;:::-;17354:90;;17453:93;17542:3;17453:93;:::i;:::-;17571:1;17566:3;17562:11;17555:18;;17181:398;;;:::o;17585:365::-;17727:3;17748:66;17812:1;17807:3;17748:66;:::i;:::-;17741:73;;17823:93;17912:3;17823:93;:::i;:::-;17941:2;17936:3;17932:12;17925:19;;17585:365;;;:::o;17956:366::-;18098:3;18119:67;18183:2;18178:3;18119:67;:::i;:::-;18112:74;;18195:93;18284:3;18195:93;:::i;:::-;18313:2;18308:3;18304:12;18297:19;;17956:366;;;:::o;18328:::-;18470:3;18491:67;18555:2;18550:3;18491:67;:::i;:::-;18484:74;;18567:93;18656:3;18567:93;:::i;:::-;18685:2;18680:3;18676:12;18669:19;;18328:366;;;:::o;18700:108::-;18777:24;18795:5;18777:24;:::i;:::-;18772:3;18765:37;18700:108;;:::o;18814:118::-;18901:24;18919:5;18901:24;:::i;:::-;18896:3;18889:37;18814:118;;:::o;18938:435::-;19118:3;19140:95;19231:3;19222:6;19140:95;:::i;:::-;19133:102;;19252:95;19343:3;19334:6;19252:95;:::i;:::-;19245:102;;19364:3;19357:10;;18938:435;;;;;:::o;19379:379::-;19563:3;19585:147;19728:3;19585:147;:::i;:::-;19578:154;;19749:3;19742:10;;19379:379;;;:::o;19764:222::-;19857:4;19895:2;19884:9;19880:18;19872:26;;19908:71;19976:1;19965:9;19961:17;19952:6;19908:71;:::i;:::-;19764:222;;;;:::o;19992:640::-;20187:4;20225:3;20214:9;20210:19;20202:27;;20239:71;20307:1;20296:9;20292:17;20283:6;20239:71;:::i;:::-;20320:72;20388:2;20377:9;20373:18;20364:6;20320:72;:::i;:::-;20402;20470:2;20459:9;20455:18;20446:6;20402:72;:::i;:::-;20521:9;20515:4;20511:20;20506:2;20495:9;20491:18;20484:48;20549:76;20620:4;20611:6;20549:76;:::i;:::-;20541:84;;19992:640;;;;;;;:::o;20638:315::-;20777:4;20815:3;20804:9;20800:19;20792:27;;20829:117;20943:1;20932:9;20928:17;20919:6;20829:117;:::i;:::-;20638:315;;;;:::o;20959:210::-;21046:4;21084:2;21073:9;21069:18;21061:26;;21097:65;21159:1;21148:9;21144:17;21135:6;21097:65;:::i;:::-;20959:210;;;;:::o;21175:313::-;21288:4;21326:2;21315:9;21311:18;21303:26;;21375:9;21369:4;21365:20;21361:1;21350:9;21346:17;21339:47;21403:78;21476:4;21467:6;21403:78;:::i;:::-;21395:86;;21175:313;;;;:::o;21494:419::-;21660:4;21698:2;21687:9;21683:18;21675:26;;21747:9;21741:4;21737:20;21733:1;21722:9;21718:17;21711:47;21775:131;21901:4;21775:131;:::i;:::-;21767:139;;21494:419;;;:::o;21919:::-;22085:4;22123:2;22112:9;22108:18;22100:26;;22172:9;22166:4;22162:20;22158:1;22147:9;22143:17;22136:47;22200:131;22326:4;22200:131;:::i;:::-;22192:139;;21919:419;;;:::o;22344:::-;22510:4;22548:2;22537:9;22533:18;22525:26;;22597:9;22591:4;22587:20;22583:1;22572:9;22568:17;22561:47;22625:131;22751:4;22625:131;:::i;:::-;22617:139;;22344:419;;;:::o;22769:::-;22935:4;22973:2;22962:9;22958:18;22950:26;;23022:9;23016:4;23012:20;23008:1;22997:9;22993:17;22986:47;23050:131;23176:4;23050:131;:::i;:::-;23042:139;;22769:419;;;:::o;23194:::-;23360:4;23398:2;23387:9;23383:18;23375:26;;23447:9;23441:4;23437:20;23433:1;23422:9;23418:17;23411:47;23475:131;23601:4;23475:131;:::i;:::-;23467:139;;23194:419;;;:::o;23619:::-;23785:4;23823:2;23812:9;23808:18;23800:26;;23872:9;23866:4;23862:20;23858:1;23847:9;23843:17;23836:47;23900:131;24026:4;23900:131;:::i;:::-;23892:139;;23619:419;;;:::o;24044:::-;24210:4;24248:2;24237:9;24233:18;24225:26;;24297:9;24291:4;24287:20;24283:1;24272:9;24268:17;24261:47;24325:131;24451:4;24325:131;:::i;:::-;24317:139;;24044:419;;;:::o;24469:::-;24635:4;24673:2;24662:9;24658:18;24650:26;;24722:9;24716:4;24712:20;24708:1;24697:9;24693:17;24686:47;24750:131;24876:4;24750:131;:::i;:::-;24742:139;;24469:419;;;:::o;24894:::-;25060:4;25098:2;25087:9;25083:18;25075:26;;25147:9;25141:4;25137:20;25133:1;25122:9;25118:17;25111:47;25175:131;25301:4;25175:131;:::i;:::-;25167:139;;24894:419;;;:::o;25319:::-;25485:4;25523:2;25512:9;25508:18;25500:26;;25572:9;25566:4;25562:20;25558:1;25547:9;25543:17;25536:47;25600:131;25726:4;25600:131;:::i;:::-;25592:139;;25319:419;;;:::o;25744:::-;25910:4;25948:2;25937:9;25933:18;25925:26;;25997:9;25991:4;25987:20;25983:1;25972:9;25968:17;25961:47;26025:131;26151:4;26025:131;:::i;:::-;26017:139;;25744:419;;;:::o;26169:::-;26335:4;26373:2;26362:9;26358:18;26350:26;;26422:9;26416:4;26412:20;26408:1;26397:9;26393:17;26386:47;26450:131;26576:4;26450:131;:::i;:::-;26442:139;;26169:419;;;:::o;26594:::-;26760:4;26798:2;26787:9;26783:18;26775:26;;26847:9;26841:4;26837:20;26833:1;26822:9;26818:17;26811:47;26875:131;27001:4;26875:131;:::i;:::-;26867:139;;26594:419;;;:::o;27019:::-;27185:4;27223:2;27212:9;27208:18;27200:26;;27272:9;27266:4;27262:20;27258:1;27247:9;27243:17;27236:47;27300:131;27426:4;27300:131;:::i;:::-;27292:139;;27019:419;;;:::o;27444:::-;27610:4;27648:2;27637:9;27633:18;27625:26;;27697:9;27691:4;27687:20;27683:1;27672:9;27668:17;27661:47;27725:131;27851:4;27725:131;:::i;:::-;27717:139;;27444:419;;;:::o;27869:::-;28035:4;28073:2;28062:9;28058:18;28050:26;;28122:9;28116:4;28112:20;28108:1;28097:9;28093:17;28086:47;28150:131;28276:4;28150:131;:::i;:::-;28142:139;;27869:419;;;:::o;28294:::-;28460:4;28498:2;28487:9;28483:18;28475:26;;28547:9;28541:4;28537:20;28533:1;28522:9;28518:17;28511:47;28575:131;28701:4;28575:131;:::i;:::-;28567:139;;28294:419;;;:::o;28719:::-;28885:4;28923:2;28912:9;28908:18;28900:26;;28972:9;28966:4;28962:20;28958:1;28947:9;28943:17;28936:47;29000:131;29126:4;29000:131;:::i;:::-;28992:139;;28719:419;;;:::o;29144:222::-;29237:4;29275:2;29264:9;29260:18;29252:26;;29288:71;29356:1;29345:9;29341:17;29332:6;29288:71;:::i;:::-;29144:222;;;;:::o;29372:442::-;29521:4;29559:2;29548:9;29544:18;29536:26;;29572:71;29640:1;29629:9;29625:17;29616:6;29572:71;:::i;:::-;29653:72;29721:2;29710:9;29706:18;29697:6;29653:72;:::i;:::-;29735;29803:2;29792:9;29788:18;29779:6;29735:72;:::i;:::-;29372:442;;;;;;:::o;29820:886::-;30081:4;30119:3;30108:9;30104:19;30096:27;;30133:71;30201:1;30190:9;30186:17;30177:6;30133:71;:::i;:::-;30214:72;30282:2;30271:9;30267:18;30258:6;30214:72;:::i;:::-;30296;30364:2;30353:9;30349:18;30340:6;30296:72;:::i;:::-;30378;30446:2;30435:9;30431:18;30422:6;30378:72;:::i;:::-;30460:73;30528:3;30517:9;30513:19;30504:6;30460:73;:::i;:::-;30543;30611:3;30600:9;30596:19;30587:6;30543:73;:::i;:::-;30626;30694:3;30683:9;30679:19;30670:6;30626:73;:::i;:::-;29820:886;;;;;;;;;;:::o;30712:129::-;30746:6;30773:20;;:::i;:::-;30763:30;;30802:33;30830:4;30822:6;30802:33;:::i;:::-;30712:129;;;:::o;30847:75::-;30880:6;30913:2;30907:9;30897:19;;30847:75;:::o;30928:307::-;30989:4;31079:18;31071:6;31068:30;31065:56;;;31101:18;;:::i;:::-;31065:56;31139:29;31161:6;31139:29;:::i;:::-;31131:37;;31223:4;31217;31213:15;31205:23;;30928:307;;;:::o;31241:308::-;31303:4;31393:18;31385:6;31382:30;31379:56;;;31415:18;;:::i;:::-;31379:56;31453:29;31475:6;31453:29;:::i;:::-;31445:37;;31537:4;31531;31527:15;31519:23;;31241:308;;;:::o;31555:98::-;31620:4;31643:3;31635:11;;31555:98;;;:::o;31659:104::-;31724:6;31752:4;31742:14;;31659:104;;;:::o;31769:98::-;31820:6;31854:5;31848:12;31838:22;;31769:98;;;:::o;31873:99::-;31925:6;31959:5;31953:12;31943:22;;31873:99;;;:::o;31978:111::-;32046:4;32078;32073:3;32069:14;32061:22;;31978:111;;;:::o;32095:143::-;32192:11;32229:3;32214:18;;32095:143;;;;:::o;32244:168::-;32327:11;32361:6;32356:3;32349:19;32401:4;32396:3;32392:14;32377:29;;32244:168;;;;:::o;32418:147::-;32519:11;32556:3;32541:18;;32418:147;;;;:::o;32571:169::-;32655:11;32689:6;32684:3;32677:19;32729:4;32724:3;32720:14;32705:29;;32571:169;;;;:::o;32746:148::-;32848:11;32885:3;32870:18;;32746:148;;;;:::o;32900:305::-;32940:3;32959:20;32977:1;32959:20;:::i;:::-;32954:25;;32993:20;33011:1;32993:20;:::i;:::-;32988:25;;33147:1;33079:66;33075:74;33072:1;33069:81;33066:107;;;33153:18;;:::i;:::-;33066:107;33197:1;33194;33190:9;33183:16;;32900:305;;;;:::o;33211:185::-;33251:1;33268:20;33286:1;33268:20;:::i;:::-;33263:25;;33302:20;33320:1;33302:20;:::i;:::-;33297:25;;33341:1;33331:35;;33346:18;;:::i;:::-;33331:35;33388:1;33385;33381:9;33376:14;;33211:185;;;;:::o;33402:191::-;33442:4;33462:20;33480:1;33462:20;:::i;:::-;33457:25;;33496:20;33514:1;33496:20;:::i;:::-;33491:25;;33535:1;33532;33529:8;33526:34;;;33540:18;;:::i;:::-;33526:34;33585:1;33582;33578:9;33570:17;;33402:191;;;;:::o;33599:96::-;33636:7;33665:24;33683:5;33665:24;:::i;:::-;33654:35;;33599:96;;;:::o;33701:90::-;33735:7;33778:5;33771:13;33764:21;33753:32;;33701:90;;;:::o;33797:149::-;33833:7;33873:66;33866:5;33862:78;33851:89;;33797:149;;;:::o;33952:126::-;33989:7;34029:42;34022:5;34018:54;34007:65;;33952:126;;;:::o;34084:77::-;34121:7;34150:5;34139:16;;34084:77;;;:::o;34167:154::-;34251:6;34246:3;34241;34228:30;34313:1;34304:6;34299:3;34295:16;34288:27;34167:154;;;:::o;34327:307::-;34395:1;34405:113;34419:6;34416:1;34413:13;34405:113;;;34504:1;34499:3;34495:11;34489:18;34485:1;34480:3;34476:11;34469:39;34441:2;34438:1;34434:10;34429:15;;34405:113;;;34536:6;34533:1;34530:13;34527:101;;;34616:1;34607:6;34602:3;34598:16;34591:27;34527:101;34376:258;34327:307;;;:::o;34640:320::-;34684:6;34721:1;34715:4;34711:12;34701:22;;34768:1;34762:4;34758:12;34789:18;34779:81;;34845:4;34837:6;34833:17;34823:27;;34779:81;34907:2;34899:6;34896:14;34876:18;34873:38;34870:84;;;34926:18;;:::i;:::-;34870:84;34691:269;34640:320;;;:::o;34966:281::-;35049:27;35071:4;35049:27;:::i;:::-;35041:6;35037:40;35179:6;35167:10;35164:22;35143:18;35131:10;35128:34;35125:62;35122:88;;;35190:18;;:::i;:::-;35122:88;35230:10;35226:2;35219:22;35009:238;34966:281;;:::o;35253:233::-;35292:3;35315:24;35333:5;35315:24;:::i;:::-;35306:33;;35361:66;35354:5;35351:77;35348:103;;;35431:18;;:::i;:::-;35348:103;35478:1;35471:5;35467:13;35460:20;;35253:233;;;:::o;35492:176::-;35524:1;35541:20;35559:1;35541:20;:::i;:::-;35536:25;;35575:20;35593:1;35575:20;:::i;:::-;35570:25;;35614:1;35604:35;;35619:18;;:::i;:::-;35604:35;35660:1;35657;35653:9;35648:14;;35492:176;;;;:::o;35674:180::-;35722:77;35719:1;35712:88;35819:4;35816:1;35809:15;35843:4;35840:1;35833:15;35860:180;35908:77;35905:1;35898:88;36005:4;36002:1;35995:15;36029:4;36026:1;36019:15;36046:180;36094:77;36091:1;36084:88;36191:4;36188:1;36181:15;36215:4;36212:1;36205:15;36232:180;36280:77;36277:1;36270:88;36377:4;36374:1;36367:15;36401:4;36398:1;36391:15;36418:180;36466:77;36463:1;36456:88;36563:4;36560:1;36553:15;36587:4;36584:1;36577:15;36604:117;36713:1;36710;36703:12;36727:117;36836:1;36833;36826:12;36850:117;36959:1;36956;36949:12;36973:117;37082:1;37079;37072:12;37096:102;37137:6;37188:2;37184:7;37179:2;37172:5;37168:14;37164:28;37154:38;;37096:102;;;:::o;37204:177::-;37344:29;37340:1;37332:6;37328:14;37321:53;37204:177;:::o;37387:225::-;37527:34;37523:1;37515:6;37511:14;37504:58;37596:8;37591:2;37583:6;37579:15;37572:33;37387:225;:::o;37618:176::-;37758:28;37754:1;37746:6;37742:14;37735:52;37618:176;:::o;37800:::-;37940:28;37936:1;37928:6;37924:14;37917:52;37800:176;:::o;37982:170::-;38122:22;38118:1;38110:6;38106:14;38099:46;37982:170;:::o;38158:169::-;38298:21;38294:1;38286:6;38282:14;38275:45;38158:169;:::o;38333:178::-;38473:30;38469:1;38461:6;38457:14;38450:54;38333:178;:::o;38517:170::-;38657:22;38653:1;38645:6;38641:14;38634:46;38517:170;:::o;38693:::-;38833:22;38829:1;38821:6;38817:14;38810:46;38693:170;:::o;38869:166::-;39009:18;39005:1;38997:6;38993:14;38986:42;38869:166;:::o;39041:173::-;39181:25;39177:1;39169:6;39165:14;39158:49;39041:173;:::o;39220:182::-;39360:34;39356:1;39348:6;39344:14;39337:58;39220:182;:::o;39408:169::-;39548:21;39544:1;39536:6;39532:14;39525:45;39408:169;:::o;39583:181::-;39723:33;39719:1;39711:6;39707:14;39700:57;39583:181;:::o;39770:177::-;39910:29;39906:1;39898:6;39894:14;39887:53;39770:177;:::o;39953:114::-;;:::o;40073:159::-;40213:11;40209:1;40201:6;40197:14;40190:35;40073:159;:::o;40238:168::-;40378:20;40374:1;40366:6;40362:14;40355:44;40238:168;:::o;40412:171::-;40552:23;40548:1;40540:6;40536:14;40529:47;40412:171;:::o;40589:122::-;40662:24;40680:5;40662:24;:::i;:::-;40655:5;40652:35;40642:63;;40701:1;40698;40691:12;40642:63;40589:122;:::o;40717:116::-;40787:21;40802:5;40787:21;:::i;:::-;40780:5;40777:32;40767:60;;40823:1;40820;40813:12;40767:60;40717:116;:::o;40839:120::-;40911:23;40928:5;40911:23;:::i;:::-;40904:5;40901:34;40891:62;;40949:1;40946;40939:12;40891:62;40839:120;:::o;40965:122::-;41038:24;41056:5;41038:24;:::i;:::-;41031:5;41028:35;41018:63;;41077:1;41074;41067:12;41018:63;40965:122;:::o
Swarm Source
ipfs://d9045b49d6a9157835a31290d9792835c58d56b1c3d0d5ba0b209c8711b1b8c0
Loading...
Loading
Loading...
Loading
[ 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.