ERC-721
Overview
Max Total Supply
164 TOB
Holders
24
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 TOBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TOB
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-07 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; 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); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } 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); } 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); } interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } library OriginalLogic { using ECDSA for bytes32; uint256 public constant MAX_SUPPLY = 10000; uint256 public constant WHITE_MINT_MAX = 15; uint256 public constant SALE_MINT_MAX = 10; function _canMint( bool _paused, uint256 _supply, uint8 _mintAmount, uint8 _saleStage, bool _isWhite, uint256 _cnt ) internal pure { require(!_paused, "Paused"); require(_supply + _mintAmount < MAX_SUPPLY, "No token left"); require(_saleStage > 0, "Not available"); require(_mintAmount > 0, "Must mint at least 1"); if (_isWhite) { require(_saleStage == 2 || _saleStage == 1, "invalid stage"); require(_mintAmount + _cnt <= WHITE_MINT_MAX, "You can only mint 15"); } else { require(_saleStage == 2, "invalid stage"); require(_mintAmount + _cnt <= SALE_MINT_MAX, "You can only mint 10"); } } function _isWhitelisted(address _addr, bytes memory signature) internal pure returns(address) { bytes32 chash = keccak256(abi.encodePacked("The original bat", _addr)); address singer = chash.toEthSignedMessageHash().recover(signature); return singer; } } contract TOB is ERC721Enumerable, Ownable, ReentrancyGuard { using Strings for uint256; event stageChanged(uint256 saleStage); string private constant NAME = "The original bat"; string private constant SYMBOL = "TOB"; uint256 private constant START_AT = 1; uint256 private constant MAX_SUPPLY = 10000; address private constant signer = 0xA9640de361D1aCf02269fABF4961464BfeD60Af9; //sale stages: //stage 0: no minting //stage 1: whitelist //stage 2: public sale //stage 3: done, can not minting uint8 public saleStage = 0; bool public paused = false; string private baseURI; string private batURI; mapping(address => uint8) private saleMintCount; constructor( string memory _batURI ) ERC721(NAME, SYMBOL) { setBaseURI(0, _batURI); } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "URI query for nonexistent token" ); if (saleStage <= 2) { return batURI; } return string(abi.encodePacked(baseURI, (_tokenId + START_AT).toString())); } function setBaseURI(uint8 uriType, string memory _newBaseURI) public onlyOwner { if (uriType == 0) { batURI = _newBaseURI; } else { baseURI = _newBaseURI; } } function mintWhitelist(uint8 _mintAmount, bytes memory signature) public nonReentrant { uint256 supply = totalSupply(); OriginalLogic._canMint( paused, supply, _mintAmount, saleStage, true, saleMintCount[msg.sender] ); require(OriginalLogic._isWhitelisted(msg.sender, signature) == signer, "Must be whitelisted"); saleMintCount[msg.sender] += _mintAmount; for (uint256 i = 0; i < _mintAmount; i++) { _safeMint(msg.sender, supply + START_AT + i); } } function mint(uint8 _mintAmount) public nonReentrant { uint256 supply = totalSupply(); OriginalLogic._canMint( paused, supply, _mintAmount, saleStage, false, saleMintCount[tx.origin] ); saleMintCount[tx.origin] += _mintAmount; for (uint256 i = 0; i < _mintAmount; i++) { _safeMint(tx.origin, supply + START_AT + i); } } function pause(bool _state) public onlyOwner { paused = _state; } function withdraw(address to) public onlyOwner { uint256 balance = address(this).balance; require(balance > 0); (bool success,) = to.call{value: balance}(""); require(success, "Transfer failed"); } function burn(uint256 tokenId) public { require(_isApprovedOrOwner(tx.origin, tokenId)); _burn(tokenId); } function burnByOwner(uint256 tokenId) public onlyOwner { _burn(tokenId); } function nextStage() public onlyOwner() { require(saleStage < 3); saleStage++; emit stageChanged(saleStage); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_batURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"saleStage","type":"uint256"}],"name":"stageChanged","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnByOwner","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":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextStage","outputs":[],"stateMutability":"nonpayable","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":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"uriType","type":"uint8"},{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600c60006101000a81548160ff021916908360ff1602179055506000600c60016101000a81548160ff0219169083151502179055503480156200004857600080fd5b506040516200532b3803806200532b83398181016040528101906200006e919062000461565b6040518060400160405280601081526020017f546865206f726967696e616c20626174000000000000000000000000000000008152506040518060400160405280600381526020017f544f4200000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f292919062000333565b5080600190805190602001906200010b92919062000333565b5050506200012e620001226200015060201b60201c565b6200015860201b60201c565b6001600b81905550620001496000826200021e60201b60201c565b50620006b9565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200022e6200027860201b60201c565b60008260ff1614156200025a5780600e90805190602001906200025392919062000333565b5062000274565b80600d90805190602001906200027292919062000333565b505b5050565b620002886200015060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002ae6200030960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000307576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fe90620004d9565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200034190620005a1565b90600052602060002090601f016020900481019282620003655760008555620003b1565b82601f106200038057805160ff1916838001178555620003b1565b82800160010185558215620003b1579182015b82811115620003b057825182559160200191906001019062000393565b5b509050620003c09190620003c4565b5090565b5b80821115620003df576000816000905550600101620003c5565b5090565b6000620003fa620003f48462000524565b620004fb565b90508281526020810184848401111562000419576200041862000670565b5b620004268482856200056b565b509392505050565b600082601f8301126200044657620004456200066b565b5b815162000458848260208601620003e3565b91505092915050565b6000602082840312156200047a57620004796200067a565b5b600082015167ffffffffffffffff8111156200049b576200049a62000675565b5b620004a9848285016200042e565b91505092915050565b6000620004c16020836200055a565b9150620004ce8262000690565b602082019050919050565b60006020820190508181036000830152620004f481620004b2565b9050919050565b6000620005076200051a565b9050620005158282620005d7565b919050565b6000604051905090565b600067ffffffffffffffff8211156200054257620005416200063c565b5b6200054d826200067f565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200058b5780820151818401526020810190506200056e565b838111156200059b576000848401525b50505050565b60006002820490506001821680620005ba57607f821691505b60208210811415620005d157620005d06200060d565b5b50919050565b620005e2826200067f565b810181811067ffffffffffffffff821117156200060457620006036200063c565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614c6280620006c96000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636352211e11610104578063a22cb465116100a2578063d9ab128811610071578063d9ab128814610516578063e985e9c514610532578063ee3743ab14610562578063f2fde38b1461056c576101cf565b8063a22cb46514610492578063b88d4fde146104ae578063bdc9cacd146104ca578063c87b56dd146104e6576101cf565b8063715018a6116100de578063715018a61461043057806380d9c3131461043a5780638da5cb5b1461045657806395d89b4114610474576101cf565b80636352211e146103b45780636ecd2306146103e457806370a0823114610400576101cf565b80632f745c59116101715780634aaca86d1161014b5780634aaca86d1461032c5780634f6ccce71461034a57806351cff8d91461037a5780635c975abb14610396576101cf565b80632f745c59146102c457806342842e0e146102f457806342966c6814610310576101cf565b8063081812fc116101ad578063081812fc1461023e578063095ea7b31461026e57806318160ddd1461028a57806323b872dd146102a8576101cf565b806301ffc9a7146101d457806302329a291461020457806306fdde0314610220575b600080fd5b6101ee60048036038101906101e9919061324b565b610588565b6040516101fb9190613ad0565b60405180910390f35b61021e6004803603810190610219919061321e565b610602565b005b610228610627565b6040516102359190613b30565b60405180910390f35b610258600480360381019061025391906132a5565b6106b9565b6040516102659190613a69565b60405180910390f35b610288600480360381019061028391906131de565b6106ff565b005b610292610817565b60405161029f9190613f12565b60405180910390f35b6102c260048036038101906102bd91906130c8565b610824565b005b6102de60048036038101906102d991906131de565b610884565b6040516102eb9190613f12565b60405180910390f35b61030e600480360381019061030991906130c8565b610929565b005b61032a600480360381019061032591906132a5565b610949565b005b610334610968565b6040516103419190613f48565b60405180910390f35b610364600480360381019061035f91906132a5565b61097b565b6040516103719190613f12565b60405180910390f35b610394600480360381019061038f919061305b565b6109ec565b005b61039e610ab7565b6040516103ab9190613ad0565b60405180910390f35b6103ce60048036038101906103c991906132a5565b610aca565b6040516103db9190613a69565b60405180910390f35b6103fe60048036038101906103f991906132d2565b610b7c565b005b61041a6004803603810190610415919061305b565b610d14565b6040516104279190613f12565b60405180910390f35b610438610dcc565b005b610454600480360381019061044f91906132a5565b610de0565b005b61045e610df4565b60405161046b9190613a69565b60405180910390f35b61047c610e1e565b6040516104899190613b30565b60405180910390f35b6104ac60048036038101906104a7919061319e565b610eb0565b005b6104c860048036038101906104c3919061311b565b610ec6565b005b6104e460048036038101906104df919061335b565b610f28565b005b61050060048036038101906104fb91906132a5565b610f74565b60405161050d9190613b30565b60405180910390f35b610530600480360381019061052b91906132ff565b6110a9565b005b61054c60048036038101906105479190613088565b6112cd565b6040516105599190613ad0565b60405180910390f35b61056a611361565b005b6105866004803603810190610581919061305b565b611408565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105fb57506105fa8261148c565b5b9050919050565b61060a61156e565b80600c60016101000a81548160ff02191690831515021790555050565b6060600080546106369061421e565b80601f01602080910402602001604051908101604052809291908181526020018280546106629061421e565b80156106af5780601f10610684576101008083540402835291602001916106af565b820191906000526020600020905b81548152906001019060200180831161069257829003601f168201915b5050505050905090565b60006106c4826115ec565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070a82610aca565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561077b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077290613e32565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079a611637565b73ffffffffffffffffffffffffffffffffffffffff1614806107c957506107c8816107c3611637565b6112cd565b5b610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff90613d92565b60405180910390fd5b610812838361163f565b505050565b6000600880549050905090565b61083561082f611637565b826116f8565b610874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086b90613ed2565b60405180910390fd5b61087f83838361178d565b505050565b600061088f83610d14565b82106108d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c790613c12565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61094483838360405180602001604052806000815250610ec6565b505050565b61095332826116f8565b61095c57600080fd5b610965816119f4565b50565b600c60009054906101000a900460ff1681565b6000610985610817565b82106109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd90613eb2565b60405180910390fd5b600882815481106109da576109d961443e565b5b90600052602060002001549050919050565b6109f461156e565b600047905060008111610a0657600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051610a2c90613a54565b60006040518083038185875af1925050503d8060008114610a69576040519150601f19603f3d011682016040523d82523d6000602084013e610a6e565b606091505b5050905080610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa990613c72565b60405180910390fd5b505050565b600c60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a90613e12565b60405180910390fd5b80915050919050565b6002600b541415610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb990613ef2565b60405180910390fd5b6002600b819055506000610bd4610817565b9050610c52600c60019054906101000a900460ff168284600c60009054906101000a900460ff166000600f60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16611b11565b81600f60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16610cad91906140a3565b92506101000a81548160ff021916908360ff16021790555060005b8260ff16811015610d0757610cf43282600185610ce5919061404d565b610cef919061404d565b611d82565b8080610cff90614281565b915050610cc8565b50506001600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c90613d52565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dd461156e565b610dde6000611da0565b565b610de861156e565b610df1816119f4565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e2d9061421e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e599061421e565b8015610ea65780601f10610e7b57610100808354040283529160200191610ea6565b820191906000526020600020905b815481529060010190602001808311610e8957829003601f168201915b5050505050905090565b610ec2610ebb611637565b8383611e66565b5050565b610ed7610ed1611637565b836116f8565b610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90613ed2565b60405180910390fd5b610f2284848484611fd3565b50505050565b610f3061156e565b60008260ff161415610f585780600e9080519060200190610f52929190612e5a565b50610f70565b80600d9080519060200190610f6e929190612e5a565b505b5050565b6060610f7f8261202f565b610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb590613bd2565b60405180910390fd5b6002600c60009054906101000a900460ff1660ff161161106a57600e8054610fe59061421e565b80601f01602080910402602001604051908101604052809291908181526020018280546110119061421e565b801561105e5780601f106110335761010080835404028352916020019161105e565b820191906000526020600020905b81548152906001019060200180831161104157829003601f168201915b505050505090506110a4565b600d61108160018461107c919061404d565b61209b565b6040516020016110929291906139e4565b60405160208183030381529060405290505b919050565b6002600b5414156110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e690613ef2565b60405180910390fd5b6002600b819055506000611101610817565b905061117f600c60019054906101000a900460ff168285600c60009054906101000a900460ff166001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16611b11565b73a9640de361d1acf02269fabf4961464bfed60af973ffffffffffffffffffffffffffffffffffffffff166111b433846121fc565b73ffffffffffffffffffffffffffffffffffffffff161461120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120190613bf2565b60405180910390fd5b82600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661126591906140a3565b92506101000a81548160ff021916908360ff16021790555060005b8360ff168110156112bf576112ac338260018561129d919061404d565b6112a7919061404d565b611d82565b80806112b790614281565b915050611280565b50506001600b819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61136961156e565b6003600c60009054906101000a900460ff1660ff161061138857600080fd5b600c600081819054906101000a900460ff16809291906113a7906142ca565b91906101000a81548160ff021916908360ff160217905550507f9b81842605af0e5e5ea930976837a6cf8ddae4c365030c958a17eb8fe380c4f5600c60009054906101000a900460ff166040516113fe9190613f2d565b60405180910390a1565b61141061156e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790613c52565b60405180910390fd5b61148981611da0565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061155757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611567575061156682612252565b5b9050919050565b611576611637565b73ffffffffffffffffffffffffffffffffffffffff16611594610df4565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190613df2565b60405180910390fd5b565b6115f58161202f565b611634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162b90613e12565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116b283610aca565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061170483610aca565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611746575061174581856112cd565b5b8061178457508373ffffffffffffffffffffffffffffffffffffffff1661176c846106b9565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117ad82610aca565b73ffffffffffffffffffffffffffffffffffffffff1614611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa90613c92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186a90613cd2565b60405180910390fd5b61187e8383836122bc565b61188960008261163f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118d9919061410b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611930919061404d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119ef8383836123d0565b505050565b60006119ff82610aca565b9050611a0d816000846122bc565b611a1860008361163f565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a68919061410b565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b0d816000846123d0565b5050565b8515611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4990613b72565b60405180910390fd5b6127108460ff1686611b64919061404d565b10611ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9b90613e92565b60405180910390fd5b60008360ff1611611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be190613e52565b60405180910390fd5b60008460ff1611611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2790613e72565b60405180910390fd5b8115611ce15760028360ff161480611c4b575060018360ff16145b611c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8190613d32565b60405180910390fd5b600f818560ff16611c9b919061404d565b1115611cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd390613bb2565b60405180910390fd5b611d7a565b60028360ff1614611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e90613d32565b60405180910390fd5b600a818560ff16611d38919061404d565b1115611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7090613dd2565b60405180910390fd5b5b505050505050565b611d9c8282604051806020016040528060008152506123d5565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc90613cf2565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fc69190613ad0565b60405180910390a3505050565b611fde84848461178d565b611fea84848484612430565b612029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202090613c32565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060008214156120e3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121f7565b600082905060005b600082146121155780806120fe90614281565b915050600a8261210e91906140da565b91506120eb565b60008167ffffffffffffffff8111156121315761213061446d565b5b6040519080825280601f01601f1916602001820160405280156121635781602001600182028036833780820191505090505b5090505b600085146121f05760018261217c919061410b565b9150600a8561218b9190614322565b6030612197919061404d565b60f81b8183815181106121ad576121ac61443e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121e991906140da565b9450612167565b8093505050505b919050565b600080836040516020016122109190613a2e565b604051602081830303815290604052805190602001209050600061224584612237846125c7565b6125f790919063ffffffff16565b9050809250505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122c783838361261e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561230a5761230581612623565b612349565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461234857612347838261266c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561238c57612387816127d9565b6123cb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123ca576123c982826128aa565b5b5b505050565b505050565b6123df8383612929565b6123ec6000848484612430565b61242b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242290613c32565b60405180910390fd5b505050565b60006124518473ffffffffffffffffffffffffffffffffffffffff16612b03565b156125ba578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261247a611637565b8786866040518563ffffffff1660e01b815260040161249c9493929190613a84565b602060405180830381600087803b1580156124b657600080fd5b505af19250505080156124e757506040513d601f19601f820116820180604052508101906124e49190613278565b60015b61256a573d8060008114612517576040519150601f19603f3d011682016040523d82523d6000602084013e61251c565b606091505b50600081511415612562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255990613c32565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125bf565b600190505b949350505050565b6000816040516020016125da9190613a08565b604051602081830303815290604052805190602001209050919050565b60008060006126068585612b26565b9150915061261381612b78565b819250505092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161267984610d14565b612683919061410b565b9050600060076000848152602001908152602001600020549050818114612768576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127ed919061410b565b905060006009600084815260200190815260200160002054905060006008838154811061281d5761281c61443e565b5b90600052602060002001549050806008838154811061283f5761283e61443e565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061288e5761288d61440f565b5b6001900381819060005260206000200160009055905550505050565b60006128b583610d14565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299090613db2565b60405180910390fd5b6129a28161202f565b156129e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d990613cb2565b60405180910390fd5b6129ee600083836122bc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a3e919061404d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612aff600083836123d0565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080604183511415612b685760008060006020860151925060408601519150606086015160001a9050612b5c87828585612d4d565b94509450505050612b71565b60006002915091505b9250929050565b60006004811115612b8c57612b8b6143b1565b5b816004811115612b9f57612b9e6143b1565b5b1415612baa57612d4a565b60016004811115612bbe57612bbd6143b1565b5b816004811115612bd157612bd06143b1565b5b1415612c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0990613b52565b60405180910390fd5b60026004811115612c2657612c256143b1565b5b816004811115612c3957612c386143b1565b5b1415612c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7190613b92565b60405180910390fd5b60036004811115612c8e57612c8d6143b1565b5b816004811115612ca157612ca06143b1565b5b1415612ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd990613d12565b60405180910390fd5b600480811115612cf557612cf46143b1565b5b816004811115612d0857612d076143b1565b5b1415612d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4090613d72565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612d88576000600391509150612e51565b601b8560ff1614158015612da05750601c8560ff1614155b15612db2576000600491509150612e51565b600060018787878760405160008152602001604052604051612dd79493929190613aeb565b6020604051602081039080840390855afa158015612df9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e4857600060019250925050612e51565b80600092509250505b94509492505050565b828054612e669061421e565b90600052602060002090601f016020900481019282612e885760008555612ecf565b82601f10612ea157805160ff1916838001178555612ecf565b82800160010185558215612ecf579182015b82811115612ece578251825591602001919060010190612eb3565b5b509050612edc9190612ee0565b5090565b5b80821115612ef9576000816000905550600101612ee1565b5090565b6000612f10612f0b84613f88565b613f63565b905082815260208101848484011115612f2c57612f2b6144a1565b5b612f378482856141dc565b509392505050565b6000612f52612f4d84613fb9565b613f63565b905082815260208101848484011115612f6e57612f6d6144a1565b5b612f798482856141dc565b509392505050565b600081359050612f9081614bb9565b92915050565b600081359050612fa581614bd0565b92915050565b600081359050612fba81614be7565b92915050565b600081519050612fcf81614be7565b92915050565b600082601f830112612fea57612fe961449c565b5b8135612ffa848260208601612efd565b91505092915050565b600082601f8301126130185761301761449c565b5b8135613028848260208601612f3f565b91505092915050565b60008135905061304081614bfe565b92915050565b60008135905061305581614c15565b92915050565b600060208284031215613071576130706144ab565b5b600061307f84828501612f81565b91505092915050565b6000806040838503121561309f5761309e6144ab565b5b60006130ad85828601612f81565b92505060206130be85828601612f81565b9150509250929050565b6000806000606084860312156130e1576130e06144ab565b5b60006130ef86828701612f81565b935050602061310086828701612f81565b925050604061311186828701613031565b9150509250925092565b60008060008060808587031215613135576131346144ab565b5b600061314387828801612f81565b945050602061315487828801612f81565b935050604061316587828801613031565b925050606085013567ffffffffffffffff811115613186576131856144a6565b5b61319287828801612fd5565b91505092959194509250565b600080604083850312156131b5576131b46144ab565b5b60006131c385828601612f81565b92505060206131d485828601612f96565b9150509250929050565b600080604083850312156131f5576131f46144ab565b5b600061320385828601612f81565b925050602061321485828601613031565b9150509250929050565b600060208284031215613234576132336144ab565b5b600061324284828501612f96565b91505092915050565b600060208284031215613261576132606144ab565b5b600061326f84828501612fab565b91505092915050565b60006020828403121561328e5761328d6144ab565b5b600061329c84828501612fc0565b91505092915050565b6000602082840312156132bb576132ba6144ab565b5b60006132c984828501613031565b91505092915050565b6000602082840312156132e8576132e76144ab565b5b60006132f684828501613046565b91505092915050565b60008060408385031215613316576133156144ab565b5b600061332485828601613046565b925050602083013567ffffffffffffffff811115613345576133446144a6565b5b61335185828601612fd5565b9150509250929050565b60008060408385031215613372576133716144ab565b5b600061338085828601613046565b925050602083013567ffffffffffffffff8111156133a1576133a06144a6565b5b6133ad85828601613003565b9150509250929050565b6133c08161413f565b82525050565b6133d76133d28261413f565b6142f4565b82525050565b6133e681614151565b82525050565b6133f58161415d565b82525050565b61340c6134078261415d565b614306565b82525050565b600061341d82613fff565b6134278185614015565b93506134378185602086016141eb565b613440816144b0565b840191505092915050565b60006134568261400a565b6134608185614031565b93506134708185602086016141eb565b613479816144b0565b840191505092915050565b600061348f8261400a565b6134998185614042565b93506134a98185602086016141eb565b80840191505092915050565b600081546134c28161421e565b6134cc8186614042565b945060018216600081146134e757600181146134f85761352b565b60ff1983168652818601935061352b565b61350185613fea565b60005b8381101561352357815481890152600182019150602081019050613504565b838801955050505b50505092915050565b6000613541601883614031565b915061354c826144ce565b602082019050919050565b6000613564600683614031565b915061356f826144f7565b602082019050919050565b6000613587601f83614031565b915061359282614520565b602082019050919050565b60006135aa601c83614042565b91506135b582614549565b601c82019050919050565b60006135cd601483614031565b91506135d882614572565b602082019050919050565b60006135f0601f83614031565b91506135fb8261459b565b602082019050919050565b6000613613601383614031565b915061361e826145c4565b602082019050919050565b6000613636602b83614031565b9150613641826145ed565b604082019050919050565b6000613659603283614031565b91506136648261463c565b604082019050919050565b600061367c602683614031565b91506136878261468b565b604082019050919050565b600061369f600f83614031565b91506136aa826146da565b602082019050919050565b60006136c2602583614031565b91506136cd82614703565b604082019050919050565b60006136e5601c83614031565b91506136f082614752565b602082019050919050565b6000613708601083614042565b91506137138261477b565b601082019050919050565b600061372b602483614031565b9150613736826147a4565b604082019050919050565b600061374e601983614031565b9150613759826147f3565b602082019050919050565b6000613771602283614031565b915061377c8261481c565b604082019050919050565b6000613794600d83614031565b915061379f8261486b565b602082019050919050565b60006137b7602983614031565b91506137c282614894565b604082019050919050565b60006137da602283614031565b91506137e5826148e3565b604082019050919050565b60006137fd603e83614031565b915061380882614932565b604082019050919050565b6000613820602083614031565b915061382b82614981565b602082019050919050565b6000613843601483614031565b915061384e826149aa565b602082019050919050565b6000613866602083614031565b9150613871826149d3565b602082019050919050565b6000613889601883614031565b9150613894826149fc565b602082019050919050565b60006138ac602183614031565b91506138b782614a25565b604082019050919050565b60006138cf600d83614031565b91506138da82614a74565b602082019050919050565b60006138f2601483614031565b91506138fd82614a9d565b602082019050919050565b6000613915600083614026565b915061392082614ac6565b600082019050919050565b6000613938600d83614031565b915061394382614ac9565b602082019050919050565b600061395b602c83614031565b915061396682614af2565b604082019050919050565b600061397e602e83614031565b915061398982614b41565b604082019050919050565b60006139a1601f83614031565b91506139ac82614b90565b602082019050919050565b6139c0816141b3565b82525050565b6139cf816141ca565b82525050565b6139de816141bd565b82525050565b60006139f082856134b5565b91506139fc8284613484565b91508190509392505050565b6000613a138261359d565b9150613a1f82846133fb565b60208201915081905092915050565b6000613a39826136fb565b9150613a4582846133c6565b60148201915081905092915050565b6000613a5f82613908565b9150819050919050565b6000602082019050613a7e60008301846133b7565b92915050565b6000608082019050613a9960008301876133b7565b613aa660208301866133b7565b613ab360408301856139b7565b8181036060830152613ac58184613412565b905095945050505050565b6000602082019050613ae560008301846133dd565b92915050565b6000608082019050613b0060008301876133ec565b613b0d60208301866139d5565b613b1a60408301856133ec565b613b2760608301846133ec565b95945050505050565b60006020820190508181036000830152613b4a818461344b565b905092915050565b60006020820190508181036000830152613b6b81613534565b9050919050565b60006020820190508181036000830152613b8b81613557565b9050919050565b60006020820190508181036000830152613bab8161357a565b9050919050565b60006020820190508181036000830152613bcb816135c0565b9050919050565b60006020820190508181036000830152613beb816135e3565b9050919050565b60006020820190508181036000830152613c0b81613606565b9050919050565b60006020820190508181036000830152613c2b81613629565b9050919050565b60006020820190508181036000830152613c4b8161364c565b9050919050565b60006020820190508181036000830152613c6b8161366f565b9050919050565b60006020820190508181036000830152613c8b81613692565b9050919050565b60006020820190508181036000830152613cab816136b5565b9050919050565b60006020820190508181036000830152613ccb816136d8565b9050919050565b60006020820190508181036000830152613ceb8161371e565b9050919050565b60006020820190508181036000830152613d0b81613741565b9050919050565b60006020820190508181036000830152613d2b81613764565b9050919050565b60006020820190508181036000830152613d4b81613787565b9050919050565b60006020820190508181036000830152613d6b816137aa565b9050919050565b60006020820190508181036000830152613d8b816137cd565b9050919050565b60006020820190508181036000830152613dab816137f0565b9050919050565b60006020820190508181036000830152613dcb81613813565b9050919050565b60006020820190508181036000830152613deb81613836565b9050919050565b60006020820190508181036000830152613e0b81613859565b9050919050565b60006020820190508181036000830152613e2b8161387c565b9050919050565b60006020820190508181036000830152613e4b8161389f565b9050919050565b60006020820190508181036000830152613e6b816138c2565b9050919050565b60006020820190508181036000830152613e8b816138e5565b9050919050565b60006020820190508181036000830152613eab8161392b565b9050919050565b60006020820190508181036000830152613ecb8161394e565b9050919050565b60006020820190508181036000830152613eeb81613971565b9050919050565b60006020820190508181036000830152613f0b81613994565b9050919050565b6000602082019050613f2760008301846139b7565b92915050565b6000602082019050613f4260008301846139c6565b92915050565b6000602082019050613f5d60008301846139d5565b92915050565b6000613f6d613f7e565b9050613f798282614250565b919050565b6000604051905090565b600067ffffffffffffffff821115613fa357613fa261446d565b5b613fac826144b0565b9050602081019050919050565b600067ffffffffffffffff821115613fd457613fd361446d565b5b613fdd826144b0565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614058826141b3565b9150614063836141b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561409857614097614353565b5b828201905092915050565b60006140ae826141bd565b91506140b9836141bd565b92508260ff038211156140cf576140ce614353565b5b828201905092915050565b60006140e5826141b3565b91506140f0836141b3565b925082614100576140ff614382565b5b828204905092915050565b6000614116826141b3565b9150614121836141b3565b92508282101561413457614133614353565b5b828203905092915050565b600061414a82614193565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006141d5826141bd565b9050919050565b82818337600083830152505050565b60005b838110156142095780820151818401526020810190506141ee565b83811115614218576000848401525b50505050565b6000600282049050600182168061423657607f821691505b6020821081141561424a576142496143e0565b5b50919050565b614259826144b0565b810181811067ffffffffffffffff821117156142785761427761446d565b5b80604052505050565b600061428c826141b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142bf576142be614353565b5b600182019050919050565b60006142d5826141bd565b915060ff8214156142e9576142e8614353565b5b600182019050919050565b60006142ff82614310565b9050919050565b6000819050919050565b600061431b826144c1565b9050919050565b600061432d826141b3565b9150614338836141b3565b92508261434857614347614382565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f596f752063616e206f6e6c79206d696e74203135000000000000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4d7573742062652077686974656c697374656400000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f546865206f726967696e616c2062617400000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e76616c696420737461676500000000000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f596f752063616e206f6e6c79206d696e74203130000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420617661696c61626c6500000000000000000000000000000000000000600082015250565b7f4d757374206d696e74206174206c656173742031000000000000000000000000600082015250565b50565b7f4e6f20746f6b656e206c65667400000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614bc28161413f565b8114614bcd57600080fd5b50565b614bd981614151565b8114614be457600080fd5b50565b614bf081614167565b8114614bfb57600080fd5b50565b614c07816141b3565b8114614c1257600080fd5b50565b614c1e816141bd565b8114614c2957600080fd5b5056fea2646970667358221220da209262f0226559e942c8dafdbbfd8c91fbfeccd99a4a05e1229ecb7cd01da164736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5256545a44754a5639554c73546465446a45384d6e6d695a4a714c7062454d35625a634558584d59667554660000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636352211e11610104578063a22cb465116100a2578063d9ab128811610071578063d9ab128814610516578063e985e9c514610532578063ee3743ab14610562578063f2fde38b1461056c576101cf565b8063a22cb46514610492578063b88d4fde146104ae578063bdc9cacd146104ca578063c87b56dd146104e6576101cf565b8063715018a6116100de578063715018a61461043057806380d9c3131461043a5780638da5cb5b1461045657806395d89b4114610474576101cf565b80636352211e146103b45780636ecd2306146103e457806370a0823114610400576101cf565b80632f745c59116101715780634aaca86d1161014b5780634aaca86d1461032c5780634f6ccce71461034a57806351cff8d91461037a5780635c975abb14610396576101cf565b80632f745c59146102c457806342842e0e146102f457806342966c6814610310576101cf565b8063081812fc116101ad578063081812fc1461023e578063095ea7b31461026e57806318160ddd1461028a57806323b872dd146102a8576101cf565b806301ffc9a7146101d457806302329a291461020457806306fdde0314610220575b600080fd5b6101ee60048036038101906101e9919061324b565b610588565b6040516101fb9190613ad0565b60405180910390f35b61021e6004803603810190610219919061321e565b610602565b005b610228610627565b6040516102359190613b30565b60405180910390f35b610258600480360381019061025391906132a5565b6106b9565b6040516102659190613a69565b60405180910390f35b610288600480360381019061028391906131de565b6106ff565b005b610292610817565b60405161029f9190613f12565b60405180910390f35b6102c260048036038101906102bd91906130c8565b610824565b005b6102de60048036038101906102d991906131de565b610884565b6040516102eb9190613f12565b60405180910390f35b61030e600480360381019061030991906130c8565b610929565b005b61032a600480360381019061032591906132a5565b610949565b005b610334610968565b6040516103419190613f48565b60405180910390f35b610364600480360381019061035f91906132a5565b61097b565b6040516103719190613f12565b60405180910390f35b610394600480360381019061038f919061305b565b6109ec565b005b61039e610ab7565b6040516103ab9190613ad0565b60405180910390f35b6103ce60048036038101906103c991906132a5565b610aca565b6040516103db9190613a69565b60405180910390f35b6103fe60048036038101906103f991906132d2565b610b7c565b005b61041a6004803603810190610415919061305b565b610d14565b6040516104279190613f12565b60405180910390f35b610438610dcc565b005b610454600480360381019061044f91906132a5565b610de0565b005b61045e610df4565b60405161046b9190613a69565b60405180910390f35b61047c610e1e565b6040516104899190613b30565b60405180910390f35b6104ac60048036038101906104a7919061319e565b610eb0565b005b6104c860048036038101906104c3919061311b565b610ec6565b005b6104e460048036038101906104df919061335b565b610f28565b005b61050060048036038101906104fb91906132a5565b610f74565b60405161050d9190613b30565b60405180910390f35b610530600480360381019061052b91906132ff565b6110a9565b005b61054c60048036038101906105479190613088565b6112cd565b6040516105599190613ad0565b60405180910390f35b61056a611361565b005b6105866004803603810190610581919061305b565b611408565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105fb57506105fa8261148c565b5b9050919050565b61060a61156e565b80600c60016101000a81548160ff02191690831515021790555050565b6060600080546106369061421e565b80601f01602080910402602001604051908101604052809291908181526020018280546106629061421e565b80156106af5780601f10610684576101008083540402835291602001916106af565b820191906000526020600020905b81548152906001019060200180831161069257829003601f168201915b5050505050905090565b60006106c4826115ec565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070a82610aca565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561077b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077290613e32565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079a611637565b73ffffffffffffffffffffffffffffffffffffffff1614806107c957506107c8816107c3611637565b6112cd565b5b610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff90613d92565b60405180910390fd5b610812838361163f565b505050565b6000600880549050905090565b61083561082f611637565b826116f8565b610874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086b90613ed2565b60405180910390fd5b61087f83838361178d565b505050565b600061088f83610d14565b82106108d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c790613c12565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61094483838360405180602001604052806000815250610ec6565b505050565b61095332826116f8565b61095c57600080fd5b610965816119f4565b50565b600c60009054906101000a900460ff1681565b6000610985610817565b82106109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd90613eb2565b60405180910390fd5b600882815481106109da576109d961443e565b5b90600052602060002001549050919050565b6109f461156e565b600047905060008111610a0657600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051610a2c90613a54565b60006040518083038185875af1925050503d8060008114610a69576040519150601f19603f3d011682016040523d82523d6000602084013e610a6e565b606091505b5050905080610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa990613c72565b60405180910390fd5b505050565b600c60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a90613e12565b60405180910390fd5b80915050919050565b6002600b541415610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb990613ef2565b60405180910390fd5b6002600b819055506000610bd4610817565b9050610c52600c60019054906101000a900460ff168284600c60009054906101000a900460ff166000600f60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16611b11565b81600f60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16610cad91906140a3565b92506101000a81548160ff021916908360ff16021790555060005b8260ff16811015610d0757610cf43282600185610ce5919061404d565b610cef919061404d565b611d82565b8080610cff90614281565b915050610cc8565b50506001600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c90613d52565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dd461156e565b610dde6000611da0565b565b610de861156e565b610df1816119f4565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e2d9061421e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e599061421e565b8015610ea65780601f10610e7b57610100808354040283529160200191610ea6565b820191906000526020600020905b815481529060010190602001808311610e8957829003601f168201915b5050505050905090565b610ec2610ebb611637565b8383611e66565b5050565b610ed7610ed1611637565b836116f8565b610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90613ed2565b60405180910390fd5b610f2284848484611fd3565b50505050565b610f3061156e565b60008260ff161415610f585780600e9080519060200190610f52929190612e5a565b50610f70565b80600d9080519060200190610f6e929190612e5a565b505b5050565b6060610f7f8261202f565b610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb590613bd2565b60405180910390fd5b6002600c60009054906101000a900460ff1660ff161161106a57600e8054610fe59061421e565b80601f01602080910402602001604051908101604052809291908181526020018280546110119061421e565b801561105e5780601f106110335761010080835404028352916020019161105e565b820191906000526020600020905b81548152906001019060200180831161104157829003601f168201915b505050505090506110a4565b600d61108160018461107c919061404d565b61209b565b6040516020016110929291906139e4565b60405160208183030381529060405290505b919050565b6002600b5414156110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e690613ef2565b60405180910390fd5b6002600b819055506000611101610817565b905061117f600c60019054906101000a900460ff168285600c60009054906101000a900460ff166001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16611b11565b73a9640de361d1acf02269fabf4961464bfed60af973ffffffffffffffffffffffffffffffffffffffff166111b433846121fc565b73ffffffffffffffffffffffffffffffffffffffff161461120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120190613bf2565b60405180910390fd5b82600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661126591906140a3565b92506101000a81548160ff021916908360ff16021790555060005b8360ff168110156112bf576112ac338260018561129d919061404d565b6112a7919061404d565b611d82565b80806112b790614281565b915050611280565b50506001600b819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61136961156e565b6003600c60009054906101000a900460ff1660ff161061138857600080fd5b600c600081819054906101000a900460ff16809291906113a7906142ca565b91906101000a81548160ff021916908360ff160217905550507f9b81842605af0e5e5ea930976837a6cf8ddae4c365030c958a17eb8fe380c4f5600c60009054906101000a900460ff166040516113fe9190613f2d565b60405180910390a1565b61141061156e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790613c52565b60405180910390fd5b61148981611da0565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061155757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611567575061156682612252565b5b9050919050565b611576611637565b73ffffffffffffffffffffffffffffffffffffffff16611594610df4565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190613df2565b60405180910390fd5b565b6115f58161202f565b611634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162b90613e12565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116b283610aca565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061170483610aca565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611746575061174581856112cd565b5b8061178457508373ffffffffffffffffffffffffffffffffffffffff1661176c846106b9565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117ad82610aca565b73ffffffffffffffffffffffffffffffffffffffff1614611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa90613c92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186a90613cd2565b60405180910390fd5b61187e8383836122bc565b61188960008261163f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118d9919061410b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611930919061404d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119ef8383836123d0565b505050565b60006119ff82610aca565b9050611a0d816000846122bc565b611a1860008361163f565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a68919061410b565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b0d816000846123d0565b5050565b8515611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4990613b72565b60405180910390fd5b6127108460ff1686611b64919061404d565b10611ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9b90613e92565b60405180910390fd5b60008360ff1611611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be190613e52565b60405180910390fd5b60008460ff1611611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2790613e72565b60405180910390fd5b8115611ce15760028360ff161480611c4b575060018360ff16145b611c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8190613d32565b60405180910390fd5b600f818560ff16611c9b919061404d565b1115611cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd390613bb2565b60405180910390fd5b611d7a565b60028360ff1614611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e90613d32565b60405180910390fd5b600a818560ff16611d38919061404d565b1115611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7090613dd2565b60405180910390fd5b5b505050505050565b611d9c8282604051806020016040528060008152506123d5565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc90613cf2565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fc69190613ad0565b60405180910390a3505050565b611fde84848461178d565b611fea84848484612430565b612029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202090613c32565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060008214156120e3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121f7565b600082905060005b600082146121155780806120fe90614281565b915050600a8261210e91906140da565b91506120eb565b60008167ffffffffffffffff8111156121315761213061446d565b5b6040519080825280601f01601f1916602001820160405280156121635781602001600182028036833780820191505090505b5090505b600085146121f05760018261217c919061410b565b9150600a8561218b9190614322565b6030612197919061404d565b60f81b8183815181106121ad576121ac61443e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121e991906140da565b9450612167565b8093505050505b919050565b600080836040516020016122109190613a2e565b604051602081830303815290604052805190602001209050600061224584612237846125c7565b6125f790919063ffffffff16565b9050809250505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122c783838361261e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561230a5761230581612623565b612349565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461234857612347838261266c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561238c57612387816127d9565b6123cb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123ca576123c982826128aa565b5b5b505050565b505050565b6123df8383612929565b6123ec6000848484612430565b61242b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242290613c32565b60405180910390fd5b505050565b60006124518473ffffffffffffffffffffffffffffffffffffffff16612b03565b156125ba578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261247a611637565b8786866040518563ffffffff1660e01b815260040161249c9493929190613a84565b602060405180830381600087803b1580156124b657600080fd5b505af19250505080156124e757506040513d601f19601f820116820180604052508101906124e49190613278565b60015b61256a573d8060008114612517576040519150601f19603f3d011682016040523d82523d6000602084013e61251c565b606091505b50600081511415612562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255990613c32565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125bf565b600190505b949350505050565b6000816040516020016125da9190613a08565b604051602081830303815290604052805190602001209050919050565b60008060006126068585612b26565b9150915061261381612b78565b819250505092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161267984610d14565b612683919061410b565b9050600060076000848152602001908152602001600020549050818114612768576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127ed919061410b565b905060006009600084815260200190815260200160002054905060006008838154811061281d5761281c61443e565b5b90600052602060002001549050806008838154811061283f5761283e61443e565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061288e5761288d61440f565b5b6001900381819060005260206000200160009055905550505050565b60006128b583610d14565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299090613db2565b60405180910390fd5b6129a28161202f565b156129e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d990613cb2565b60405180910390fd5b6129ee600083836122bc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a3e919061404d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612aff600083836123d0565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080604183511415612b685760008060006020860151925060408601519150606086015160001a9050612b5c87828585612d4d565b94509450505050612b71565b60006002915091505b9250929050565b60006004811115612b8c57612b8b6143b1565b5b816004811115612b9f57612b9e6143b1565b5b1415612baa57612d4a565b60016004811115612bbe57612bbd6143b1565b5b816004811115612bd157612bd06143b1565b5b1415612c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0990613b52565b60405180910390fd5b60026004811115612c2657612c256143b1565b5b816004811115612c3957612c386143b1565b5b1415612c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7190613b92565b60405180910390fd5b60036004811115612c8e57612c8d6143b1565b5b816004811115612ca157612ca06143b1565b5b1415612ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd990613d12565b60405180910390fd5b600480811115612cf557612cf46143b1565b5b816004811115612d0857612d076143b1565b5b1415612d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4090613d72565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612d88576000600391509150612e51565b601b8560ff1614158015612da05750601c8560ff1614155b15612db2576000600491509150612e51565b600060018787878760405160008152602001604052604051612dd79493929190613aeb565b6020604051602081039080840390855afa158015612df9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e4857600060019250925050612e51565b80600092509250505b94509492505050565b828054612e669061421e565b90600052602060002090601f016020900481019282612e885760008555612ecf565b82601f10612ea157805160ff1916838001178555612ecf565b82800160010185558215612ecf579182015b82811115612ece578251825591602001919060010190612eb3565b5b509050612edc9190612ee0565b5090565b5b80821115612ef9576000816000905550600101612ee1565b5090565b6000612f10612f0b84613f88565b613f63565b905082815260208101848484011115612f2c57612f2b6144a1565b5b612f378482856141dc565b509392505050565b6000612f52612f4d84613fb9565b613f63565b905082815260208101848484011115612f6e57612f6d6144a1565b5b612f798482856141dc565b509392505050565b600081359050612f9081614bb9565b92915050565b600081359050612fa581614bd0565b92915050565b600081359050612fba81614be7565b92915050565b600081519050612fcf81614be7565b92915050565b600082601f830112612fea57612fe961449c565b5b8135612ffa848260208601612efd565b91505092915050565b600082601f8301126130185761301761449c565b5b8135613028848260208601612f3f565b91505092915050565b60008135905061304081614bfe565b92915050565b60008135905061305581614c15565b92915050565b600060208284031215613071576130706144ab565b5b600061307f84828501612f81565b91505092915050565b6000806040838503121561309f5761309e6144ab565b5b60006130ad85828601612f81565b92505060206130be85828601612f81565b9150509250929050565b6000806000606084860312156130e1576130e06144ab565b5b60006130ef86828701612f81565b935050602061310086828701612f81565b925050604061311186828701613031565b9150509250925092565b60008060008060808587031215613135576131346144ab565b5b600061314387828801612f81565b945050602061315487828801612f81565b935050604061316587828801613031565b925050606085013567ffffffffffffffff811115613186576131856144a6565b5b61319287828801612fd5565b91505092959194509250565b600080604083850312156131b5576131b46144ab565b5b60006131c385828601612f81565b92505060206131d485828601612f96565b9150509250929050565b600080604083850312156131f5576131f46144ab565b5b600061320385828601612f81565b925050602061321485828601613031565b9150509250929050565b600060208284031215613234576132336144ab565b5b600061324284828501612f96565b91505092915050565b600060208284031215613261576132606144ab565b5b600061326f84828501612fab565b91505092915050565b60006020828403121561328e5761328d6144ab565b5b600061329c84828501612fc0565b91505092915050565b6000602082840312156132bb576132ba6144ab565b5b60006132c984828501613031565b91505092915050565b6000602082840312156132e8576132e76144ab565b5b60006132f684828501613046565b91505092915050565b60008060408385031215613316576133156144ab565b5b600061332485828601613046565b925050602083013567ffffffffffffffff811115613345576133446144a6565b5b61335185828601612fd5565b9150509250929050565b60008060408385031215613372576133716144ab565b5b600061338085828601613046565b925050602083013567ffffffffffffffff8111156133a1576133a06144a6565b5b6133ad85828601613003565b9150509250929050565b6133c08161413f565b82525050565b6133d76133d28261413f565b6142f4565b82525050565b6133e681614151565b82525050565b6133f58161415d565b82525050565b61340c6134078261415d565b614306565b82525050565b600061341d82613fff565b6134278185614015565b93506134378185602086016141eb565b613440816144b0565b840191505092915050565b60006134568261400a565b6134608185614031565b93506134708185602086016141eb565b613479816144b0565b840191505092915050565b600061348f8261400a565b6134998185614042565b93506134a98185602086016141eb565b80840191505092915050565b600081546134c28161421e565b6134cc8186614042565b945060018216600081146134e757600181146134f85761352b565b60ff1983168652818601935061352b565b61350185613fea565b60005b8381101561352357815481890152600182019150602081019050613504565b838801955050505b50505092915050565b6000613541601883614031565b915061354c826144ce565b602082019050919050565b6000613564600683614031565b915061356f826144f7565b602082019050919050565b6000613587601f83614031565b915061359282614520565b602082019050919050565b60006135aa601c83614042565b91506135b582614549565b601c82019050919050565b60006135cd601483614031565b91506135d882614572565b602082019050919050565b60006135f0601f83614031565b91506135fb8261459b565b602082019050919050565b6000613613601383614031565b915061361e826145c4565b602082019050919050565b6000613636602b83614031565b9150613641826145ed565b604082019050919050565b6000613659603283614031565b91506136648261463c565b604082019050919050565b600061367c602683614031565b91506136878261468b565b604082019050919050565b600061369f600f83614031565b91506136aa826146da565b602082019050919050565b60006136c2602583614031565b91506136cd82614703565b604082019050919050565b60006136e5601c83614031565b91506136f082614752565b602082019050919050565b6000613708601083614042565b91506137138261477b565b601082019050919050565b600061372b602483614031565b9150613736826147a4565b604082019050919050565b600061374e601983614031565b9150613759826147f3565b602082019050919050565b6000613771602283614031565b915061377c8261481c565b604082019050919050565b6000613794600d83614031565b915061379f8261486b565b602082019050919050565b60006137b7602983614031565b91506137c282614894565b604082019050919050565b60006137da602283614031565b91506137e5826148e3565b604082019050919050565b60006137fd603e83614031565b915061380882614932565b604082019050919050565b6000613820602083614031565b915061382b82614981565b602082019050919050565b6000613843601483614031565b915061384e826149aa565b602082019050919050565b6000613866602083614031565b9150613871826149d3565b602082019050919050565b6000613889601883614031565b9150613894826149fc565b602082019050919050565b60006138ac602183614031565b91506138b782614a25565b604082019050919050565b60006138cf600d83614031565b91506138da82614a74565b602082019050919050565b60006138f2601483614031565b91506138fd82614a9d565b602082019050919050565b6000613915600083614026565b915061392082614ac6565b600082019050919050565b6000613938600d83614031565b915061394382614ac9565b602082019050919050565b600061395b602c83614031565b915061396682614af2565b604082019050919050565b600061397e602e83614031565b915061398982614b41565b604082019050919050565b60006139a1601f83614031565b91506139ac82614b90565b602082019050919050565b6139c0816141b3565b82525050565b6139cf816141ca565b82525050565b6139de816141bd565b82525050565b60006139f082856134b5565b91506139fc8284613484565b91508190509392505050565b6000613a138261359d565b9150613a1f82846133fb565b60208201915081905092915050565b6000613a39826136fb565b9150613a4582846133c6565b60148201915081905092915050565b6000613a5f82613908565b9150819050919050565b6000602082019050613a7e60008301846133b7565b92915050565b6000608082019050613a9960008301876133b7565b613aa660208301866133b7565b613ab360408301856139b7565b8181036060830152613ac58184613412565b905095945050505050565b6000602082019050613ae560008301846133dd565b92915050565b6000608082019050613b0060008301876133ec565b613b0d60208301866139d5565b613b1a60408301856133ec565b613b2760608301846133ec565b95945050505050565b60006020820190508181036000830152613b4a818461344b565b905092915050565b60006020820190508181036000830152613b6b81613534565b9050919050565b60006020820190508181036000830152613b8b81613557565b9050919050565b60006020820190508181036000830152613bab8161357a565b9050919050565b60006020820190508181036000830152613bcb816135c0565b9050919050565b60006020820190508181036000830152613beb816135e3565b9050919050565b60006020820190508181036000830152613c0b81613606565b9050919050565b60006020820190508181036000830152613c2b81613629565b9050919050565b60006020820190508181036000830152613c4b8161364c565b9050919050565b60006020820190508181036000830152613c6b8161366f565b9050919050565b60006020820190508181036000830152613c8b81613692565b9050919050565b60006020820190508181036000830152613cab816136b5565b9050919050565b60006020820190508181036000830152613ccb816136d8565b9050919050565b60006020820190508181036000830152613ceb8161371e565b9050919050565b60006020820190508181036000830152613d0b81613741565b9050919050565b60006020820190508181036000830152613d2b81613764565b9050919050565b60006020820190508181036000830152613d4b81613787565b9050919050565b60006020820190508181036000830152613d6b816137aa565b9050919050565b60006020820190508181036000830152613d8b816137cd565b9050919050565b60006020820190508181036000830152613dab816137f0565b9050919050565b60006020820190508181036000830152613dcb81613813565b9050919050565b60006020820190508181036000830152613deb81613836565b9050919050565b60006020820190508181036000830152613e0b81613859565b9050919050565b60006020820190508181036000830152613e2b8161387c565b9050919050565b60006020820190508181036000830152613e4b8161389f565b9050919050565b60006020820190508181036000830152613e6b816138c2565b9050919050565b60006020820190508181036000830152613e8b816138e5565b9050919050565b60006020820190508181036000830152613eab8161392b565b9050919050565b60006020820190508181036000830152613ecb8161394e565b9050919050565b60006020820190508181036000830152613eeb81613971565b9050919050565b60006020820190508181036000830152613f0b81613994565b9050919050565b6000602082019050613f2760008301846139b7565b92915050565b6000602082019050613f4260008301846139c6565b92915050565b6000602082019050613f5d60008301846139d5565b92915050565b6000613f6d613f7e565b9050613f798282614250565b919050565b6000604051905090565b600067ffffffffffffffff821115613fa357613fa261446d565b5b613fac826144b0565b9050602081019050919050565b600067ffffffffffffffff821115613fd457613fd361446d565b5b613fdd826144b0565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614058826141b3565b9150614063836141b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561409857614097614353565b5b828201905092915050565b60006140ae826141bd565b91506140b9836141bd565b92508260ff038211156140cf576140ce614353565b5b828201905092915050565b60006140e5826141b3565b91506140f0836141b3565b925082614100576140ff614382565b5b828204905092915050565b6000614116826141b3565b9150614121836141b3565b92508282101561413457614133614353565b5b828203905092915050565b600061414a82614193565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006141d5826141bd565b9050919050565b82818337600083830152505050565b60005b838110156142095780820151818401526020810190506141ee565b83811115614218576000848401525b50505050565b6000600282049050600182168061423657607f821691505b6020821081141561424a576142496143e0565b5b50919050565b614259826144b0565b810181811067ffffffffffffffff821117156142785761427761446d565b5b80604052505050565b600061428c826141b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142bf576142be614353565b5b600182019050919050565b60006142d5826141bd565b915060ff8214156142e9576142e8614353565b5b600182019050919050565b60006142ff82614310565b9050919050565b6000819050919050565b600061431b826144c1565b9050919050565b600061432d826141b3565b9150614338836141b3565b92508261434857614347614382565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f596f752063616e206f6e6c79206d696e74203135000000000000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4d7573742062652077686974656c697374656400000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f546865206f726967696e616c2062617400000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e76616c696420737461676500000000000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f596f752063616e206f6e6c79206d696e74203130000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420617661696c61626c6500000000000000000000000000000000000000600082015250565b7f4d757374206d696e74206174206c656173742031000000000000000000000000600082015250565b50565b7f4e6f20746f6b656e206c65667400000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614bc28161413f565b8114614bcd57600080fd5b50565b614bd981614151565b8114614be457600080fd5b50565b614bf081614167565b8114614bfb57600080fd5b50565b614c07816141b3565b8114614c1257600080fd5b50565b614c1e816141bd565b8114614c2957600080fd5b5056fea2646970667358221220da209262f0226559e942c8dafdbbfd8c91fbfeccd99a4a05e1229ecb7cd01da164736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5256545a44754a5639554c73546465446a45384d6e6d695a4a714c7062454d35625a634558584d59667554660000000000000000000000
-----Decoded View---------------
Arg [0] : _batURI (string): ipfs://QmRVTZDuJV9ULsTdeDjE8MnmiZJqLpbEM5bZcEXXMYfuTf
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [2] : 697066733a2f2f516d5256545a44754a5639554c73546465446a45384d6e6d69
Arg [3] : 5a4a714c7062454d35625a634558584d59667554660000000000000000000000
Deployed Bytecode Sourcemap
52977:3372:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33063:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55633:79;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20199:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21712:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21229:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33703:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22412:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33371:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22819:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55971:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53542:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33893:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55724:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53575:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19910:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55130:495;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19641:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40429:103;;;:::i;:::-;;56108:88;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39781:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20368:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21955:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23075:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54263:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53844:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54487:635;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22181:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56204:142;;;:::i;:::-;;40687:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33063:224;33165:4;33204:35;33189:50;;;:11;:50;;;;:90;;;;33243:36;33267:11;33243:23;:36::i;:::-;33189:90;33182:97;;33063:224;;;:::o;55633:79::-;39667:13;:11;:13::i;:::-;55698:6:::1;55689;;:15;;;;;;;;;;;;;;;;;;55633:79:::0;:::o;20199:100::-;20253:13;20286:5;20279:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20199:100;:::o;21712:171::-;21788:7;21808:23;21823:7;21808:14;:23::i;:::-;21851:15;:24;21867:7;21851:24;;;;;;;;;;;;;;;;;;;;;21844:31;;21712:171;;;:::o;21229:417::-;21310:13;21326:23;21341:7;21326:14;:23::i;:::-;21310:39;;21374:5;21368:11;;:2;:11;;;;21360:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21468:5;21452:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;21477:37;21494:5;21501:12;:10;:12::i;:::-;21477:16;:37::i;:::-;21452:62;21430:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;21617:21;21626:2;21630:7;21617:8;:21::i;:::-;21299:347;21229:417;;:::o;33703:113::-;33764:7;33791:10;:17;;;;33784:24;;33703:113;:::o;22412:336::-;22607:41;22626:12;:10;:12::i;:::-;22640:7;22607:18;:41::i;:::-;22599:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;22712:28;22722:4;22728:2;22732:7;22712:9;:28::i;:::-;22412:336;;;:::o;33371:256::-;33468:7;33504:23;33521:5;33504:16;:23::i;:::-;33496:5;:31;33488:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33593:12;:19;33606:5;33593:19;;;;;;;;;;;;;;;:26;33613:5;33593:26;;;;;;;;;;;;33586:33;;33371:256;;;;:::o;22819:185::-;22957:39;22974:4;22980:2;22984:7;22957:39;;;;;;;;;;;;:16;:39::i;:::-;22819:185;;;:::o;55971:129::-;56028:38;56047:9;56058:7;56028:18;:38::i;:::-;56020:47;;;;;;56078:14;56084:7;56078:5;:14::i;:::-;55971:129;:::o;53542:26::-;;;;;;;;;;;;;:::o;33893:233::-;33968:7;34004:30;:28;:30::i;:::-;33996:5;:38;33988:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34101:10;34112:5;34101:17;;;;;;;;:::i;:::-;;;;;;;;;;34094:24;;33893:233;;;:::o;55724:239::-;39667:13;:11;:13::i;:::-;55782:15:::1;55800:21;55782:39;;55850:1;55840:7;:11;55832:20;;;::::0;::::1;;55865:12;55882:2;:7;;55897;55882:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55864:45;;;55928:7;55920:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;55771:192;;55724:239:::0;:::o;53575:26::-;;;;;;;;;;;;;:::o;19910:222::-;19982:7;20002:13;20018:7;:16;20026:7;20018:16;;;;;;;;;;;;;;;;;;;;;20002:32;;20070:1;20053:19;;:5;:19;;;;20045:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;20119:5;20112:12;;;19910:222;;;:::o;55130:495::-;42130:1;42728:7;;:19;;42720:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;42130:1;42861:7;:18;;;;55219:14:::1;55236:13;:11;:13::i;:::-;55219:30;;55260:185;55297:6;;;;;;;;;;;55318;55340:11;55366:9;;;;;;;;;;;55390:5;55410:13;:24;55424:9;55410:24;;;;;;;;;;;;;;;;;;;;;;;;;55260:185;;:22;:185::i;:::-;55484:11;55456:13;:24;55470:9;55456:24;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55511:9;55506:112;55530:11;55526:15;;:1;:15;55506:112;;;55563:43;55573:9;55604:1;53260;55584:6;:17;;;;:::i;:::-;:21;;;;:::i;:::-;55563:9;:43::i;:::-;55543:3;;;;;:::i;:::-;;;;55506:112;;;;55208:417;42086:1:::0;43040:7;:22;;;;55130:495;:::o;19641:207::-;19713:7;19758:1;19741:19;;:5;:19;;;;19733:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19824:9;:16;19834:5;19824:16;;;;;;;;;;;;;;;;19817:23;;19641:207;;;:::o;40429:103::-;39667:13;:11;:13::i;:::-;40494:30:::1;40521:1;40494:18;:30::i;:::-;40429:103::o:0;56108:88::-;39667:13;:11;:13::i;:::-;56174:14:::1;56180:7;56174:5;:14::i;:::-;56108:88:::0;:::o;39781:87::-;39827:7;39854:6;;;;;;;;;;;39847:13;;39781:87;:::o;20368:104::-;20424:13;20457:7;20450:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20368:104;:::o;21955:155::-;22050:52;22069:12;:10;:12::i;:::-;22083:8;22093;22050:18;:52::i;:::-;21955:155;;:::o;23075:323::-;23249:41;23268:12;:10;:12::i;:::-;23282:7;23249:18;:41::i;:::-;23241:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;23352:38;23366:4;23372:2;23376:7;23385:4;23352:13;:38::i;:::-;23075:323;;;;:::o;54263:216::-;39667:13;:11;:13::i;:::-;54368:1:::1;54357:7;:12;;;54353:119;;;54395:11;54386:6;:20;;;;;;;;;;;;:::i;:::-;;54353:119;;;54449:11;54439:7;:21;;;;;;;;;;;;:::i;:::-;;54353:119;54263:216:::0;;:::o;53844:411::-;53963:13;54016:17;54024:8;54016:7;:17::i;:::-;53994:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;54120:1;54107:9;;;;;;;;;;;:14;;;54103:60;;54145:6;54138:13;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54103:60;54204:7;54213:32;53260:1;54214:8;:19;;;;:::i;:::-;54213:30;:32::i;:::-;54187:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54173:74;;53844:411;;;;:::o;54487:635::-;42130:1;42728:7;;:19;;42720:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;42130:1;42861:7;:18;;;;54608:14:::1;54625:13;:11;:13::i;:::-;54608:30;;54649:185;54686:6;;;;;;;;;;;54707;54729:11;54755:9;;;;;;;;;;;54779:4;54798:13;:25;54812:10;54798:25;;;;;;;;;;;;;;;;;;;;;;;;;54649:185;;:22;:185::i;:::-;53352:42;54855:61;;:51;54884:10;54896:9;54855:28;:51::i;:::-;:61;;;54847:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;54980:11;54951:13;:25;54965:10;54951:25;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55007:9;55002:113;55026:11;55022:15;;:1;:15;55002:113;;;55059:44;55069:10;55101:1;53260;55081:6;:17;;;;:::i;:::-;:21;;;;:::i;:::-;55059:9;:44::i;:::-;55039:3;;;;;:::i;:::-;;;;55002:113;;;;54597:525;42086:1:::0;43040:7;:22;;;;54487:635;;:::o;22181:164::-;22278:4;22302:18;:25;22321:5;22302:25;;;;;;;;;;;;;;;:35;22328:8;22302:35;;;;;;;;;;;;;;;;;;;;;;;;;22295:42;;22181:164;;;;:::o;56204:142::-;39667:13;:11;:13::i;:::-;56275:1:::1;56263:9;;;;;;;;;;;:13;;;56255:22;;;::::0;::::1;;56288:9;;:11;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;56315:23;56328:9;;;;;;;;;;;56315:23;;;;;;:::i;:::-;;;;;;;;56204:142::o:0;40687:201::-;39667:13;:11;:13::i;:::-;40796:1:::1;40776:22;;:8;:22;;;;40768:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40852:28;40871:8;40852:18;:28::i;:::-;40687:201:::0;:::o;19272:305::-;19374:4;19426:25;19411:40;;;:11;:40;;;;:105;;;;19483:33;19468:48;;;:11;:48;;;;19411:105;:158;;;;19533:36;19557:11;19533:23;:36::i;:::-;19411:158;19391:178;;19272:305;;;:::o;39946:132::-;40021:12;:10;:12::i;:::-;40010:23;;:7;:5;:7::i;:::-;:23;;;40002:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39946:132::o;29687:135::-;29769:16;29777:7;29769;:16::i;:::-;29761:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;29687:135;:::o;5258:98::-;5311:7;5338:10;5331:17;;5258:98;:::o;28966:174::-;29068:2;29041:15;:24;29057:7;29041:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29124:7;29120:2;29086:46;;29095:23;29110:7;29095:14;:23::i;:::-;29086:46;;;;;;;;;;;;28966:174;;:::o;25199:264::-;25292:4;25309:13;25325:23;25340:7;25325:14;:23::i;:::-;25309:39;;25378:5;25367:16;;:7;:16;;;:52;;;;25387:32;25404:5;25411:7;25387:16;:32::i;:::-;25367:52;:87;;;;25447:7;25423:31;;:20;25435:7;25423:11;:20::i;:::-;:31;;;25367:87;25359:96;;;25199:264;;;;:::o;28222:625::-;28381:4;28354:31;;:23;28369:7;28354:14;:23::i;:::-;:31;;;28346:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;28460:1;28446:16;;:2;:16;;;;28438:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;28516:39;28537:4;28543:2;28547:7;28516:20;:39::i;:::-;28620:29;28637:1;28641:7;28620:8;:29::i;:::-;28681:1;28662:9;:15;28672:4;28662:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;28710:1;28693:9;:13;28703:2;28693:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28741:2;28722:7;:16;28730:7;28722:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28780:7;28776:2;28761:27;;28770:4;28761:27;;;;;;;;;;;;28801:38;28821:4;28827:2;28831:7;28801:19;:38::i;:::-;28222:625;;;:::o;27465:420::-;27525:13;27541:23;27556:7;27541:14;:23::i;:::-;27525:39;;27577:48;27598:5;27613:1;27617:7;27577:20;:48::i;:::-;27666:29;27683:1;27687:7;27666:8;:29::i;:::-;27728:1;27708:9;:16;27718:5;27708:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;27747:7;:16;27755:7;27747:16;;;;;;;;;;;;27740:23;;;;;;;;;;;27809:7;27805:1;27781:36;;27790:5;27781:36;;;;;;;;;;;;27830:47;27850:5;27865:1;27869:7;27830:19;:47::i;:::-;27514:371;27465:420;:::o;51873:771::-;52085:7;52084:8;52076:27;;;;;;;;;;;;:::i;:::-;;;;;;;;;51758:5;52132:11;52122:21;;:7;:21;;;;:::i;:::-;:34;52114:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;52206:1;52193:10;:14;;;52185:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;52258:1;52244:11;:15;;;52236:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;52299:8;52295:342;;;52346:1;52332:10;:15;;;:34;;;;52365:1;52351:10;:15;;;52332:34;52324:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;51813:2;52421:4;52407:11;:18;;;;;;:::i;:::-;:36;;52399:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52295:342;;;52523:1;52509:10;:15;;;52501:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;51862:2;52579:4;52565:11;:18;;;;;;:::i;:::-;:35;;52557:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52295:342;51873:771;;;;;;:::o;25805:110::-;25881:26;25891:2;25895:7;25881:26;;;;;;;;;;;;:9;:26::i;:::-;25805:110;;:::o;41048:191::-;41122:16;41141:6;;;;;;;;;;;41122:25;;41167:8;41158:6;;:17;;;;;;;;;;;;;;;;;;41222:8;41191:40;;41212:8;41191:40;;;;;;;;;;;;41111:128;41048:191;:::o;29283:315::-;29438:8;29429:17;;:5;:17;;;;29421:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;29525:8;29487:18;:25;29506:5;29487:25;;;;;;;;;;;;;;;:35;29513:8;29487:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;29571:8;29549:41;;29564:5;29549:41;;;29581:8;29549:41;;;;;;:::i;:::-;;;;;;;;29283:315;;;:::o;24279:313::-;24435:28;24445:4;24451:2;24455:7;24435:9;:28::i;:::-;24482:47;24505:4;24511:2;24515:7;24524:4;24482:22;:47::i;:::-;24474:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;24279:313;;;;:::o;24905:127::-;24970:4;25022:1;24994:30;;:7;:16;25002:7;24994:16;;;;;;;;;;;;;;;;;;;;;:30;;;;24987:37;;24905:127;;;:::o;16230:723::-;16286:13;16516:1;16507:5;:10;16503:53;;;16534:10;;;;;;;;;;;;;;;;;;;;;16503:53;16566:12;16581:5;16566:20;;16597:14;16622:78;16637:1;16629:4;:9;16622:78;;16655:8;;;;;:::i;:::-;;;;16686:2;16678:10;;;;;:::i;:::-;;;16622:78;;;16710:19;16742:6;16732:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16710:39;;16760:154;16776:1;16767:5;:10;16760:154;;16804:1;16794:11;;;;;:::i;:::-;;;16871:2;16863:5;:10;;;;:::i;:::-;16850:2;:24;;;;:::i;:::-;16837:39;;16820:6;16827;16820:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16900:2;16891:11;;;;;:::i;:::-;;;16760:154;;;16938:6;16924:21;;;;;16230:723;;;;:::o;52652:318::-;52766:7;52791:13;52854:5;52817:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;52807:54;;;;;;52791:70;;52872:14;52889:49;52928:9;52889:30;:5;:28;:30::i;:::-;:38;;:49;;;;:::i;:::-;52872:66;;52956:6;52949:13;;;;52652:318;;;;:::o;5579:157::-;5664:4;5703:25;5688:40;;;:11;:40;;;;5681:47;;5579:157;;;:::o;34739:589::-;34883:45;34910:4;34916:2;34920:7;34883:26;:45::i;:::-;34961:1;34945:18;;:4;:18;;;34941:187;;;34980:40;35012:7;34980:31;:40::i;:::-;34941:187;;;35050:2;35042:10;;:4;:10;;;35038:90;;35069:47;35102:4;35108:7;35069:32;:47::i;:::-;35038:90;34941:187;35156:1;35142:16;;:2;:16;;;35138:183;;;35175:45;35212:7;35175:36;:45::i;:::-;35138:183;;;35248:4;35242:10;;:2;:10;;;35238:83;;35269:40;35297:2;35301:7;35269:27;:40::i;:::-;35238:83;35138:183;34739:589;;;:::o;32322:125::-;;;;:::o;26142:319::-;26271:18;26277:2;26281:7;26271:5;:18::i;:::-;26322:53;26353:1;26357:2;26361:7;26370:4;26322:22;:53::i;:::-;26300:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;26142:319;;;:::o;30386:853::-;30540:4;30561:15;:2;:13;;;:15::i;:::-;30557:675;;;30613:2;30597:36;;;30634:12;:10;:12::i;:::-;30648:4;30654:7;30663:4;30597:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30593:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30855:1;30838:6;:13;:18;30834:328;;;30881:60;;;;;;;;;;:::i;:::-;;;;;;;;30834:328;31112:6;31106:13;31097:6;31093:2;31089:15;31082:38;30593:584;30729:41;;;30719:51;;;:6;:51;;;;30712:58;;;;;30557:675;31216:4;31209:11;;30386:853;;;;;;;:::o;50345:269::-;50414:7;50600:4;50547:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;50537:69;;;;;;50530:76;;50345:269;;;:::o;46543:231::-;46621:7;46642:17;46661:18;46683:27;46694:4;46700:9;46683:10;:27::i;:::-;46641:69;;;;46721:18;46733:5;46721:11;:18::i;:::-;46757:9;46750:16;;;;46543:231;;;;:::o;31811:126::-;;;;:::o;36051:164::-;36155:10;:17;;;;36128:15;:24;36144:7;36128:24;;;;;;;;;;;:44;;;;36183:10;36199:7;36183:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36051:164;:::o;36842:988::-;37108:22;37158:1;37133:22;37150:4;37133:16;:22::i;:::-;:26;;;;:::i;:::-;37108:51;;37170:18;37191:17;:26;37209:7;37191:26;;;;;;;;;;;;37170:47;;37338:14;37324:10;:28;37320:328;;37369:19;37391:12;:18;37404:4;37391:18;;;;;;;;;;;;;;;:34;37410:14;37391:34;;;;;;;;;;;;37369:56;;37475:11;37442:12;:18;37455:4;37442:18;;;;;;;;;;;;;;;:30;37461:10;37442:30;;;;;;;;;;;:44;;;;37592:10;37559:17;:30;37577:11;37559:30;;;;;;;;;;;:43;;;;37354:294;37320:328;37744:17;:26;37762:7;37744:26;;;;;;;;;;;37737:33;;;37788:12;:18;37801:4;37788:18;;;;;;;;;;;;;;;:34;37807:14;37788:34;;;;;;;;;;;37781:41;;;36923:907;;36842:988;;:::o;38125:1079::-;38378:22;38423:1;38403:10;:17;;;;:21;;;;:::i;:::-;38378:46;;38435:18;38456:15;:24;38472:7;38456:24;;;;;;;;;;;;38435:45;;38807:19;38829:10;38840:14;38829:26;;;;;;;;:::i;:::-;;;;;;;;;;38807:48;;38893:11;38868:10;38879;38868:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39004:10;38973:15;:28;38989:11;38973:28;;;;;;;;;;;:41;;;;39145:15;:24;39161:7;39145:24;;;;;;;;;;;39138:31;;;39180:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38196:1008;;;38125:1079;:::o;35629:221::-;35714:14;35731:20;35748:2;35731:16;:20::i;:::-;35714:37;;35789:7;35762:12;:16;35775:2;35762:16;;;;;;;;;;;;;;;:24;35779:6;35762:24;;;;;;;;;;;:34;;;;35836:6;35807:17;:26;35825:7;35807:26;;;;;;;;;;;:35;;;;35703:147;35629:221;;:::o;26797:439::-;26891:1;26877:16;;:2;:16;;;;26869:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;26950:16;26958:7;26950;:16::i;:::-;26949:17;26941:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27012:45;27041:1;27045:2;27049:7;27012:20;:45::i;:::-;27087:1;27070:9;:13;27080:2;27070:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27118:2;27099:7;:16;27107:7;27099:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27163:7;27159:2;27138:33;;27155:1;27138:33;;;;;;;;;;;;27184:44;27212:1;27216:2;27220:7;27184:19;:44::i;:::-;26797:439;;:::o;8672:326::-;8732:4;8989:1;8967:7;:19;;;:23;8960:30;;8672:326;;;:::o;44994:747::-;45075:7;45084:12;45133:2;45113:9;:16;:22;45109:625;;;45152:9;45176;45200:7;45457:4;45446:9;45442:20;45436:27;45431:32;;45507:4;45496:9;45492:20;45486:27;45481:32;;45565:4;45554:9;45550:20;45544:27;45541:1;45536:36;45531:41;;45608:25;45619:4;45625:1;45628;45631;45608:10;:25::i;:::-;45601:32;;;;;;;;;45109:625;45682:1;45686:35;45666:56;;;;44994:747;;;;;;:::o;43265:643::-;43343:20;43334:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;43330:571;;;43380:7;;43330:571;43441:29;43432:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;43428:473;;;43487:34;;;;;;;;;;:::i;:::-;;;;;;;;43428:473;43552:35;43543:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;43539:362;;;43604:41;;;;;;;;;;:::i;:::-;;;;;;;;43539:362;43676:30;43667:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;43663:238;;;43723:44;;;;;;;;;;:::i;:::-;;;;;;;;43663:238;43798:30;43789:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;43785:116;;;43845:44;;;;;;;;;;:::i;:::-;;;;;;;;43785:116;43265:643;;:::o;47995:1632::-;48126:7;48135:12;49060:66;49055:1;49047:10;;:79;49043:163;;;49159:1;49163:30;49143:51;;;;;;49043:163;49225:2;49220:1;:7;;;;:18;;;;;49236:2;49231:1;:7;;;;49220:18;49216:102;;;49271:1;49275:30;49255:51;;;;;;49216:102;49415:14;49432:24;49442:4;49448:1;49451;49454;49432:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49415:41;;49489:1;49471:20;;:6;:20;;;49467:103;;;49524:1;49528:29;49508:50;;;;;;;49467:103;49590:6;49598:20;49582:37;;;;;47995:1632;;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:135::-;2321:5;2359:6;2346:20;2337:29;;2375:31;2400:5;2375:31;:::i;:::-;2277:135;;;;:::o;2418:329::-;2477:6;2526:2;2514:9;2505:7;2501:23;2497:32;2494:119;;;2532:79;;:::i;:::-;2494:119;2652:1;2677:53;2722:7;2713:6;2702:9;2698:22;2677:53;:::i;:::-;2667:63;;2623:117;2418:329;;;;:::o;2753:474::-;2821:6;2829;2878:2;2866:9;2857:7;2853:23;2849:32;2846:119;;;2884:79;;:::i;:::-;2846:119;3004:1;3029:53;3074:7;3065:6;3054:9;3050:22;3029:53;:::i;:::-;3019:63;;2975:117;3131:2;3157:53;3202:7;3193:6;3182:9;3178:22;3157:53;:::i;:::-;3147:63;;3102:118;2753:474;;;;;:::o;3233:619::-;3310:6;3318;3326;3375:2;3363:9;3354:7;3350:23;3346:32;3343:119;;;3381:79;;:::i;:::-;3343:119;3501:1;3526:53;3571:7;3562:6;3551:9;3547:22;3526:53;:::i;:::-;3516:63;;3472:117;3628:2;3654:53;3699:7;3690:6;3679:9;3675:22;3654:53;:::i;:::-;3644:63;;3599:118;3756:2;3782:53;3827:7;3818:6;3807:9;3803:22;3782:53;:::i;:::-;3772:63;;3727:118;3233:619;;;;;:::o;3858:943::-;3953:6;3961;3969;3977;4026:3;4014:9;4005:7;4001:23;3997:33;3994:120;;;4033:79;;:::i;:::-;3994:120;4153:1;4178:53;4223:7;4214:6;4203:9;4199:22;4178:53;:::i;:::-;4168:63;;4124:117;4280:2;4306:53;4351:7;4342:6;4331:9;4327:22;4306:53;:::i;:::-;4296:63;;4251:118;4408:2;4434:53;4479:7;4470:6;4459:9;4455:22;4434:53;:::i;:::-;4424:63;;4379:118;4564:2;4553:9;4549:18;4536:32;4595:18;4587:6;4584:30;4581:117;;;4617:79;;:::i;:::-;4581:117;4722:62;4776:7;4767:6;4756:9;4752:22;4722:62;:::i;:::-;4712:72;;4507:287;3858:943;;;;;;;:::o;4807:468::-;4872:6;4880;4929:2;4917:9;4908:7;4904:23;4900:32;4897:119;;;4935:79;;:::i;:::-;4897:119;5055:1;5080:53;5125:7;5116:6;5105:9;5101:22;5080:53;:::i;:::-;5070:63;;5026:117;5182:2;5208:50;5250:7;5241:6;5230:9;5226:22;5208:50;:::i;:::-;5198:60;;5153:115;4807:468;;;;;:::o;5281:474::-;5349:6;5357;5406:2;5394:9;5385:7;5381:23;5377:32;5374:119;;;5412:79;;:::i;:::-;5374:119;5532:1;5557:53;5602:7;5593:6;5582:9;5578:22;5557:53;:::i;:::-;5547:63;;5503:117;5659:2;5685:53;5730:7;5721:6;5710:9;5706:22;5685:53;:::i;:::-;5675:63;;5630:118;5281:474;;;;;:::o;5761:323::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:50;6059:7;6050:6;6039:9;6035:22;6017:50;:::i;:::-;6007:60;;5963:114;5761:323;;;;:::o;6090:327::-;6148:6;6197:2;6185:9;6176:7;6172:23;6168:32;6165:119;;;6203:79;;:::i;:::-;6165:119;6323:1;6348:52;6392:7;6383:6;6372:9;6368:22;6348:52;:::i;:::-;6338:62;;6294:116;6090:327;;;;:::o;6423:349::-;6492:6;6541:2;6529:9;6520:7;6516:23;6512:32;6509:119;;;6547:79;;:::i;:::-;6509:119;6667:1;6692:63;6747:7;6738:6;6727:9;6723:22;6692:63;:::i;:::-;6682:73;;6638:127;6423:349;;;;:::o;6778:329::-;6837:6;6886:2;6874:9;6865:7;6861:23;6857:32;6854:119;;;6892:79;;:::i;:::-;6854:119;7012:1;7037:53;7082:7;7073:6;7062:9;7058:22;7037:53;:::i;:::-;7027:63;;6983:117;6778:329;;;;:::o;7113:325::-;7170:6;7219:2;7207:9;7198:7;7194:23;7190:32;7187:119;;;7225:79;;:::i;:::-;7187:119;7345:1;7370:51;7413:7;7404:6;7393:9;7389:22;7370:51;:::i;:::-;7360:61;;7316:115;7113:325;;;;:::o;7444:648::-;7519:6;7527;7576:2;7564:9;7555:7;7551:23;7547:32;7544:119;;;7582:79;;:::i;:::-;7544:119;7702:1;7727:51;7770:7;7761:6;7750:9;7746:22;7727:51;:::i;:::-;7717:61;;7673:115;7855:2;7844:9;7840:18;7827:32;7886:18;7878:6;7875:30;7872:117;;;7908:79;;:::i;:::-;7872:117;8013:62;8067:7;8058:6;8047:9;8043:22;8013:62;:::i;:::-;8003:72;;7798:287;7444:648;;;;;:::o;8098:650::-;8174:6;8182;8231:2;8219:9;8210:7;8206:23;8202:32;8199:119;;;8237:79;;:::i;:::-;8199:119;8357:1;8382:51;8425:7;8416:6;8405:9;8401:22;8382:51;:::i;:::-;8372:61;;8328:115;8510:2;8499:9;8495:18;8482:32;8541:18;8533:6;8530:30;8527:117;;;8563:79;;:::i;:::-;8527:117;8668:63;8723:7;8714:6;8703:9;8699:22;8668:63;:::i;:::-;8658:73;;8453:288;8098:650;;;;;:::o;8754:118::-;8841:24;8859:5;8841:24;:::i;:::-;8836:3;8829:37;8754:118;;:::o;8878:157::-;8983:45;9003:24;9021:5;9003:24;:::i;:::-;8983:45;:::i;:::-;8978:3;8971:58;8878:157;;:::o;9041:109::-;9122:21;9137:5;9122:21;:::i;:::-;9117:3;9110:34;9041:109;;:::o;9156:118::-;9243:24;9261:5;9243:24;:::i;:::-;9238:3;9231:37;9156:118;;:::o;9280:157::-;9385:45;9405:24;9423:5;9405:24;:::i;:::-;9385:45;:::i;:::-;9380:3;9373:58;9280:157;;:::o;9443:360::-;9529:3;9557:38;9589:5;9557:38;:::i;:::-;9611:70;9674:6;9669:3;9611:70;:::i;:::-;9604:77;;9690:52;9735:6;9730:3;9723:4;9716:5;9712:16;9690:52;:::i;:::-;9767:29;9789:6;9767:29;:::i;:::-;9762:3;9758:39;9751:46;;9533:270;9443:360;;;;:::o;9809:364::-;9897:3;9925:39;9958:5;9925:39;:::i;:::-;9980:71;10044:6;10039:3;9980:71;:::i;:::-;9973:78;;10060:52;10105:6;10100:3;10093:4;10086:5;10082:16;10060:52;:::i;:::-;10137:29;10159:6;10137:29;:::i;:::-;10132:3;10128:39;10121:46;;9901:272;9809:364;;;;:::o;10179:377::-;10285:3;10313:39;10346:5;10313:39;:::i;:::-;10368:89;10450:6;10445:3;10368:89;:::i;:::-;10361:96;;10466:52;10511:6;10506:3;10499:4;10492:5;10488:16;10466:52;:::i;:::-;10543:6;10538:3;10534:16;10527:23;;10289:267;10179:377;;;;:::o;10586:845::-;10689:3;10726:5;10720:12;10755:36;10781:9;10755:36;:::i;:::-;10807:89;10889:6;10884:3;10807:89;:::i;:::-;10800:96;;10927:1;10916:9;10912:17;10943:1;10938:137;;;;11089:1;11084:341;;;;10905:520;;10938:137;11022:4;11018:9;11007;11003:25;10998:3;10991:38;11058:6;11053:3;11049:16;11042:23;;10938:137;;11084:341;11151:38;11183:5;11151:38;:::i;:::-;11211:1;11225:154;11239:6;11236:1;11233:13;11225:154;;;11313:7;11307:14;11303:1;11298:3;11294:11;11287:35;11363:1;11354:7;11350:15;11339:26;;11261:4;11258:1;11254:12;11249:17;;11225:154;;;11408:6;11403:3;11399:16;11392:23;;11091:334;;10905:520;;10693:738;;10586:845;;;;:::o;11437:366::-;11579:3;11600:67;11664:2;11659:3;11600:67;:::i;:::-;11593:74;;11676:93;11765:3;11676:93;:::i;:::-;11794:2;11789:3;11785:12;11778:19;;11437:366;;;:::o;11809:365::-;11951:3;11972:66;12036:1;12031:3;11972:66;:::i;:::-;11965:73;;12047:93;12136:3;12047:93;:::i;:::-;12165:2;12160:3;12156:12;12149:19;;11809:365;;;:::o;12180:366::-;12322:3;12343:67;12407:2;12402:3;12343:67;:::i;:::-;12336:74;;12419:93;12508:3;12419:93;:::i;:::-;12537:2;12532:3;12528:12;12521:19;;12180:366;;;:::o;12552:402::-;12712:3;12733:85;12815:2;12810:3;12733:85;:::i;:::-;12726:92;;12827:93;12916:3;12827:93;:::i;:::-;12945:2;12940:3;12936:12;12929:19;;12552:402;;;:::o;12960:366::-;13102:3;13123:67;13187:2;13182:3;13123:67;:::i;:::-;13116:74;;13199:93;13288:3;13199:93;:::i;:::-;13317:2;13312:3;13308:12;13301:19;;12960:366;;;:::o;13332:::-;13474:3;13495:67;13559:2;13554:3;13495:67;:::i;:::-;13488:74;;13571:93;13660:3;13571:93;:::i;:::-;13689:2;13684:3;13680:12;13673:19;;13332:366;;;:::o;13704:::-;13846:3;13867:67;13931:2;13926:3;13867:67;:::i;:::-;13860:74;;13943:93;14032:3;13943:93;:::i;:::-;14061:2;14056:3;14052:12;14045:19;;13704:366;;;:::o;14076:::-;14218:3;14239:67;14303:2;14298:3;14239:67;:::i;:::-;14232:74;;14315:93;14404:3;14315:93;:::i;:::-;14433:2;14428:3;14424:12;14417:19;;14076:366;;;:::o;14448:::-;14590:3;14611:67;14675:2;14670:3;14611:67;:::i;:::-;14604:74;;14687:93;14776:3;14687:93;:::i;:::-;14805:2;14800:3;14796:12;14789:19;;14448:366;;;:::o;14820:::-;14962:3;14983:67;15047:2;15042:3;14983:67;:::i;:::-;14976:74;;15059:93;15148:3;15059:93;:::i;:::-;15177:2;15172:3;15168:12;15161:19;;14820:366;;;:::o;15192:::-;15334:3;15355:67;15419:2;15414:3;15355:67;:::i;:::-;15348:74;;15431:93;15520:3;15431:93;:::i;:::-;15549:2;15544:3;15540:12;15533:19;;15192:366;;;:::o;15564:::-;15706:3;15727:67;15791:2;15786:3;15727:67;:::i;:::-;15720:74;;15803:93;15892:3;15803:93;:::i;:::-;15921:2;15916:3;15912:12;15905:19;;15564:366;;;:::o;15936:::-;16078:3;16099:67;16163:2;16158:3;16099:67;:::i;:::-;16092:74;;16175:93;16264:3;16175:93;:::i;:::-;16293:2;16288:3;16284:12;16277:19;;15936:366;;;:::o;16308:402::-;16468:3;16489:85;16571:2;16566:3;16489:85;:::i;:::-;16482:92;;16583:93;16672:3;16583:93;:::i;:::-;16701:2;16696:3;16692:12;16685:19;;16308:402;;;:::o;16716:366::-;16858:3;16879:67;16943:2;16938:3;16879:67;:::i;:::-;16872:74;;16955:93;17044:3;16955:93;:::i;:::-;17073:2;17068:3;17064:12;17057:19;;16716:366;;;:::o;17088:::-;17230:3;17251:67;17315:2;17310:3;17251:67;:::i;:::-;17244:74;;17327:93;17416:3;17327:93;:::i;:::-;17445:2;17440:3;17436:12;17429:19;;17088:366;;;:::o;17460:::-;17602:3;17623:67;17687:2;17682:3;17623:67;:::i;:::-;17616:74;;17699:93;17788:3;17699:93;:::i;:::-;17817:2;17812:3;17808:12;17801:19;;17460:366;;;:::o;17832:::-;17974:3;17995:67;18059:2;18054:3;17995:67;:::i;:::-;17988:74;;18071:93;18160:3;18071:93;:::i;:::-;18189:2;18184:3;18180:12;18173:19;;17832:366;;;:::o;18204:::-;18346:3;18367:67;18431:2;18426:3;18367:67;:::i;:::-;18360:74;;18443:93;18532:3;18443:93;:::i;:::-;18561:2;18556:3;18552:12;18545:19;;18204:366;;;:::o;18576:::-;18718:3;18739:67;18803:2;18798:3;18739:67;:::i;:::-;18732:74;;18815:93;18904:3;18815:93;:::i;:::-;18933:2;18928:3;18924:12;18917:19;;18576:366;;;:::o;18948:::-;19090:3;19111:67;19175:2;19170:3;19111:67;:::i;:::-;19104:74;;19187:93;19276:3;19187:93;:::i;:::-;19305:2;19300:3;19296:12;19289:19;;18948:366;;;:::o;19320:::-;19462:3;19483:67;19547:2;19542:3;19483:67;:::i;:::-;19476:74;;19559:93;19648:3;19559:93;:::i;:::-;19677:2;19672:3;19668:12;19661:19;;19320:366;;;:::o;19692:::-;19834:3;19855:67;19919:2;19914:3;19855:67;:::i;:::-;19848:74;;19931:93;20020:3;19931:93;:::i;:::-;20049:2;20044:3;20040:12;20033:19;;19692:366;;;:::o;20064:::-;20206:3;20227:67;20291:2;20286:3;20227:67;:::i;:::-;20220:74;;20303:93;20392:3;20303:93;:::i;:::-;20421:2;20416:3;20412:12;20405:19;;20064:366;;;:::o;20436:::-;20578:3;20599:67;20663:2;20658:3;20599:67;:::i;:::-;20592:74;;20675:93;20764:3;20675:93;:::i;:::-;20793:2;20788:3;20784:12;20777:19;;20436:366;;;:::o;20808:::-;20950:3;20971:67;21035:2;21030:3;20971:67;:::i;:::-;20964:74;;21047:93;21136:3;21047:93;:::i;:::-;21165:2;21160:3;21156:12;21149:19;;20808:366;;;:::o;21180:::-;21322:3;21343:67;21407:2;21402:3;21343:67;:::i;:::-;21336:74;;21419:93;21508:3;21419:93;:::i;:::-;21537:2;21532:3;21528:12;21521:19;;21180:366;;;:::o;21552:::-;21694:3;21715:67;21779:2;21774:3;21715:67;:::i;:::-;21708:74;;21791:93;21880:3;21791:93;:::i;:::-;21909:2;21904:3;21900:12;21893:19;;21552:366;;;:::o;21924:398::-;22083:3;22104:83;22185:1;22180:3;22104:83;:::i;:::-;22097:90;;22196:93;22285:3;22196:93;:::i;:::-;22314:1;22309:3;22305:11;22298:18;;21924:398;;;:::o;22328:366::-;22470:3;22491:67;22555:2;22550:3;22491:67;:::i;:::-;22484:74;;22567:93;22656:3;22567:93;:::i;:::-;22685:2;22680:3;22676:12;22669:19;;22328:366;;;:::o;22700:::-;22842:3;22863:67;22927:2;22922:3;22863:67;:::i;:::-;22856:74;;22939:93;23028:3;22939:93;:::i;:::-;23057:2;23052:3;23048:12;23041:19;;22700:366;;;:::o;23072:::-;23214:3;23235:67;23299:2;23294:3;23235:67;:::i;:::-;23228:74;;23311:93;23400:3;23311:93;:::i;:::-;23429:2;23424:3;23420:12;23413:19;;23072:366;;;:::o;23444:::-;23586:3;23607:67;23671:2;23666:3;23607:67;:::i;:::-;23600:74;;23683:93;23772:3;23683:93;:::i;:::-;23801:2;23796:3;23792:12;23785:19;;23444:366;;;:::o;23816:118::-;23903:24;23921:5;23903:24;:::i;:::-;23898:3;23891:37;23816:118;;:::o;23940:127::-;24025:35;24054:5;24025:35;:::i;:::-;24020:3;24013:48;23940:127;;:::o;24073:112::-;24156:22;24172:5;24156:22;:::i;:::-;24151:3;24144:35;24073:112;;:::o;24191:429::-;24368:3;24390:92;24478:3;24469:6;24390:92;:::i;:::-;24383:99;;24499:95;24590:3;24581:6;24499:95;:::i;:::-;24492:102;;24611:3;24604:10;;24191:429;;;;;:::o;24626:522::-;24839:3;24861:148;25005:3;24861:148;:::i;:::-;24854:155;;25019:75;25090:3;25081:6;25019:75;:::i;:::-;25119:2;25114:3;25110:12;25103:19;;25139:3;25132:10;;24626:522;;;;:::o;25154:::-;25367:3;25389:148;25533:3;25389:148;:::i;:::-;25382:155;;25547:75;25618:3;25609:6;25547:75;:::i;:::-;25647:2;25642:3;25638:12;25631:19;;25667:3;25660:10;;25154:522;;;;:::o;25682:379::-;25866:3;25888:147;26031:3;25888:147;:::i;:::-;25881:154;;26052:3;26045:10;;25682:379;;;:::o;26067:222::-;26160:4;26198:2;26187:9;26183:18;26175:26;;26211:71;26279:1;26268:9;26264:17;26255:6;26211:71;:::i;:::-;26067:222;;;;:::o;26295:640::-;26490:4;26528:3;26517:9;26513:19;26505:27;;26542:71;26610:1;26599:9;26595:17;26586:6;26542:71;:::i;:::-;26623:72;26691:2;26680:9;26676:18;26667:6;26623:72;:::i;:::-;26705;26773:2;26762:9;26758:18;26749:6;26705:72;:::i;:::-;26824:9;26818:4;26814:20;26809:2;26798:9;26794:18;26787:48;26852:76;26923:4;26914:6;26852:76;:::i;:::-;26844:84;;26295:640;;;;;;;:::o;26941:210::-;27028:4;27066:2;27055:9;27051:18;27043:26;;27079:65;27141:1;27130:9;27126:17;27117:6;27079:65;:::i;:::-;26941:210;;;;:::o;27157:545::-;27330:4;27368:3;27357:9;27353:19;27345:27;;27382:71;27450:1;27439:9;27435:17;27426:6;27382:71;:::i;:::-;27463:68;27527:2;27516:9;27512:18;27503:6;27463:68;:::i;:::-;27541:72;27609:2;27598:9;27594:18;27585:6;27541:72;:::i;:::-;27623;27691:2;27680:9;27676:18;27667:6;27623:72;:::i;:::-;27157:545;;;;;;;:::o;27708:313::-;27821:4;27859:2;27848:9;27844:18;27836:26;;27908:9;27902:4;27898:20;27894:1;27883:9;27879:17;27872:47;27936:78;28009:4;28000:6;27936:78;:::i;:::-;27928:86;;27708:313;;;;:::o;28027:419::-;28193:4;28231:2;28220:9;28216:18;28208:26;;28280:9;28274:4;28270:20;28266:1;28255:9;28251:17;28244:47;28308:131;28434:4;28308:131;:::i;:::-;28300:139;;28027:419;;;:::o;28452:::-;28618:4;28656:2;28645:9;28641:18;28633:26;;28705:9;28699:4;28695:20;28691:1;28680:9;28676:17;28669:47;28733:131;28859:4;28733:131;:::i;:::-;28725:139;;28452:419;;;:::o;28877:::-;29043:4;29081:2;29070:9;29066:18;29058:26;;29130:9;29124:4;29120:20;29116:1;29105:9;29101:17;29094:47;29158:131;29284:4;29158:131;:::i;:::-;29150:139;;28877:419;;;:::o;29302:::-;29468:4;29506:2;29495:9;29491:18;29483:26;;29555:9;29549:4;29545:20;29541:1;29530:9;29526:17;29519:47;29583:131;29709:4;29583:131;:::i;:::-;29575:139;;29302:419;;;:::o;29727:::-;29893:4;29931:2;29920:9;29916:18;29908:26;;29980:9;29974:4;29970:20;29966:1;29955:9;29951:17;29944:47;30008:131;30134:4;30008:131;:::i;:::-;30000:139;;29727:419;;;:::o;30152:::-;30318:4;30356:2;30345:9;30341:18;30333:26;;30405:9;30399:4;30395:20;30391:1;30380:9;30376:17;30369:47;30433:131;30559:4;30433:131;:::i;:::-;30425:139;;30152:419;;;:::o;30577:::-;30743:4;30781:2;30770:9;30766:18;30758:26;;30830:9;30824:4;30820:20;30816:1;30805:9;30801:17;30794:47;30858:131;30984:4;30858:131;:::i;:::-;30850:139;;30577:419;;;:::o;31002:::-;31168:4;31206:2;31195:9;31191:18;31183:26;;31255:9;31249:4;31245:20;31241:1;31230:9;31226:17;31219:47;31283:131;31409:4;31283:131;:::i;:::-;31275:139;;31002:419;;;:::o;31427:::-;31593:4;31631:2;31620:9;31616:18;31608:26;;31680:9;31674:4;31670:20;31666:1;31655:9;31651:17;31644:47;31708:131;31834:4;31708:131;:::i;:::-;31700:139;;31427:419;;;:::o;31852:::-;32018:4;32056:2;32045:9;32041:18;32033:26;;32105:9;32099:4;32095:20;32091:1;32080:9;32076:17;32069:47;32133:131;32259:4;32133:131;:::i;:::-;32125:139;;31852:419;;;:::o;32277:::-;32443:4;32481:2;32470:9;32466:18;32458:26;;32530:9;32524:4;32520:20;32516:1;32505:9;32501:17;32494:47;32558:131;32684:4;32558:131;:::i;:::-;32550:139;;32277:419;;;:::o;32702:::-;32868:4;32906:2;32895:9;32891:18;32883:26;;32955:9;32949:4;32945:20;32941:1;32930:9;32926:17;32919:47;32983:131;33109:4;32983:131;:::i;:::-;32975:139;;32702:419;;;:::o;33127:::-;33293:4;33331:2;33320:9;33316:18;33308:26;;33380:9;33374:4;33370:20;33366:1;33355:9;33351:17;33344:47;33408:131;33534:4;33408:131;:::i;:::-;33400:139;;33127:419;;;:::o;33552:::-;33718:4;33756:2;33745:9;33741:18;33733:26;;33805:9;33799:4;33795:20;33791:1;33780:9;33776:17;33769:47;33833:131;33959:4;33833:131;:::i;:::-;33825:139;;33552:419;;;:::o;33977:::-;34143:4;34181:2;34170:9;34166:18;34158:26;;34230:9;34224:4;34220:20;34216:1;34205:9;34201:17;34194:47;34258:131;34384:4;34258:131;:::i;:::-;34250:139;;33977:419;;;:::o;34402:::-;34568:4;34606:2;34595:9;34591:18;34583:26;;34655:9;34649:4;34645:20;34641:1;34630:9;34626:17;34619:47;34683:131;34809:4;34683:131;:::i;:::-;34675:139;;34402:419;;;:::o;34827:::-;34993:4;35031:2;35020:9;35016:18;35008:26;;35080:9;35074:4;35070:20;35066:1;35055:9;35051:17;35044:47;35108:131;35234:4;35108:131;:::i;:::-;35100:139;;34827:419;;;:::o;35252:::-;35418:4;35456:2;35445:9;35441:18;35433:26;;35505:9;35499:4;35495:20;35491:1;35480:9;35476:17;35469:47;35533:131;35659:4;35533:131;:::i;:::-;35525:139;;35252:419;;;:::o;35677:::-;35843:4;35881:2;35870:9;35866:18;35858:26;;35930:9;35924:4;35920:20;35916:1;35905:9;35901:17;35894:47;35958:131;36084:4;35958:131;:::i;:::-;35950:139;;35677:419;;;:::o;36102:::-;36268:4;36306:2;36295:9;36291:18;36283:26;;36355:9;36349:4;36345:20;36341:1;36330:9;36326:17;36319:47;36383:131;36509:4;36383:131;:::i;:::-;36375:139;;36102:419;;;:::o;36527:::-;36693:4;36731:2;36720:9;36716:18;36708:26;;36780:9;36774:4;36770:20;36766:1;36755:9;36751:17;36744:47;36808:131;36934:4;36808:131;:::i;:::-;36800:139;;36527:419;;;:::o;36952:::-;37118:4;37156:2;37145:9;37141:18;37133:26;;37205:9;37199:4;37195:20;37191:1;37180:9;37176:17;37169:47;37233:131;37359:4;37233:131;:::i;:::-;37225:139;;36952:419;;;:::o;37377:::-;37543:4;37581:2;37570:9;37566:18;37558:26;;37630:9;37624:4;37620:20;37616:1;37605:9;37601:17;37594:47;37658:131;37784:4;37658:131;:::i;:::-;37650:139;;37377:419;;;:::o;37802:::-;37968:4;38006:2;37995:9;37991:18;37983:26;;38055:9;38049:4;38045:20;38041:1;38030:9;38026:17;38019:47;38083:131;38209:4;38083:131;:::i;:::-;38075:139;;37802:419;;;:::o;38227:::-;38393:4;38431:2;38420:9;38416:18;38408:26;;38480:9;38474:4;38470:20;38466:1;38455:9;38451:17;38444:47;38508:131;38634:4;38508:131;:::i;:::-;38500:139;;38227:419;;;:::o;38652:::-;38818:4;38856:2;38845:9;38841:18;38833:26;;38905:9;38899:4;38895:20;38891:1;38880:9;38876:17;38869:47;38933:131;39059:4;38933:131;:::i;:::-;38925:139;;38652:419;;;:::o;39077:::-;39243:4;39281:2;39270:9;39266:18;39258:26;;39330:9;39324:4;39320:20;39316:1;39305:9;39301:17;39294:47;39358:131;39484:4;39358:131;:::i;:::-;39350:139;;39077:419;;;:::o;39502:::-;39668:4;39706:2;39695:9;39691:18;39683:26;;39755:9;39749:4;39745:20;39741:1;39730:9;39726:17;39719:47;39783:131;39909:4;39783:131;:::i;:::-;39775:139;;39502:419;;;:::o;39927:::-;40093:4;40131:2;40120:9;40116:18;40108:26;;40180:9;40174:4;40170:20;40166:1;40155:9;40151:17;40144:47;40208:131;40334:4;40208:131;:::i;:::-;40200:139;;39927:419;;;:::o;40352:::-;40518:4;40556:2;40545:9;40541:18;40533:26;;40605:9;40599:4;40595:20;40591:1;40580:9;40576:17;40569:47;40633:131;40759:4;40633:131;:::i;:::-;40625:139;;40352:419;;;:::o;40777:222::-;40870:4;40908:2;40897:9;40893:18;40885:26;;40921:71;40989:1;40978:9;40974:17;40965:6;40921:71;:::i;:::-;40777:222;;;;:::o;41005:218::-;41096:4;41134:2;41123:9;41119:18;41111:26;;41147:69;41213:1;41202:9;41198:17;41189:6;41147:69;:::i;:::-;41005:218;;;;:::o;41229:214::-;41318:4;41356:2;41345:9;41341:18;41333:26;;41369:67;41433:1;41422:9;41418:17;41409:6;41369:67;:::i;:::-;41229:214;;;;:::o;41449:129::-;41483:6;41510:20;;:::i;:::-;41500:30;;41539:33;41567:4;41559:6;41539:33;:::i;:::-;41449:129;;;:::o;41584:75::-;41617:6;41650:2;41644:9;41634:19;;41584:75;:::o;41665:307::-;41726:4;41816:18;41808:6;41805:30;41802:56;;;41838:18;;:::i;:::-;41802:56;41876:29;41898:6;41876:29;:::i;:::-;41868:37;;41960:4;41954;41950:15;41942:23;;41665:307;;;:::o;41978:308::-;42040:4;42130:18;42122:6;42119:30;42116:56;;;42152:18;;:::i;:::-;42116:56;42190:29;42212:6;42190:29;:::i;:::-;42182:37;;42274:4;42268;42264:15;42256:23;;41978:308;;;:::o;42292:141::-;42341:4;42364:3;42356:11;;42387:3;42384:1;42377:14;42421:4;42418:1;42408:18;42400:26;;42292:141;;;:::o;42439:98::-;42490:6;42524:5;42518:12;42508:22;;42439:98;;;:::o;42543:99::-;42595:6;42629:5;42623:12;42613:22;;42543:99;;;:::o;42648:168::-;42731:11;42765:6;42760:3;42753:19;42805:4;42800:3;42796:14;42781:29;;42648:168;;;;:::o;42822:147::-;42923:11;42960:3;42945:18;;42822:147;;;;:::o;42975:169::-;43059:11;43093:6;43088:3;43081:19;43133:4;43128:3;43124:14;43109:29;;42975:169;;;;:::o;43150:148::-;43252:11;43289:3;43274:18;;43150:148;;;;:::o;43304:305::-;43344:3;43363:20;43381:1;43363:20;:::i;:::-;43358:25;;43397:20;43415:1;43397:20;:::i;:::-;43392:25;;43551:1;43483:66;43479:74;43476:1;43473:81;43470:107;;;43557:18;;:::i;:::-;43470:107;43601:1;43598;43594:9;43587:16;;43304:305;;;;:::o;43615:237::-;43653:3;43672:18;43688:1;43672:18;:::i;:::-;43667:23;;43704:18;43720:1;43704:18;:::i;:::-;43699:23;;43794:1;43788:4;43784:12;43781:1;43778:19;43775:45;;;43800:18;;:::i;:::-;43775:45;43844:1;43841;43837:9;43830:16;;43615:237;;;;:::o;43858:185::-;43898:1;43915:20;43933:1;43915:20;:::i;:::-;43910:25;;43949:20;43967:1;43949:20;:::i;:::-;43944:25;;43988:1;43978:35;;43993:18;;:::i;:::-;43978:35;44035:1;44032;44028:9;44023:14;;43858:185;;;;:::o;44049:191::-;44089:4;44109:20;44127:1;44109:20;:::i;:::-;44104:25;;44143:20;44161:1;44143:20;:::i;:::-;44138:25;;44182:1;44179;44176:8;44173:34;;;44187:18;;:::i;:::-;44173:34;44232:1;44229;44225:9;44217:17;;44049:191;;;;:::o;44246:96::-;44283:7;44312:24;44330:5;44312:24;:::i;:::-;44301:35;;44246:96;;;:::o;44348:90::-;44382:7;44425:5;44418:13;44411:21;44400:32;;44348:90;;;:::o;44444:77::-;44481:7;44510:5;44499:16;;44444:77;;;:::o;44527:149::-;44563:7;44603:66;44596:5;44592:78;44581:89;;44527:149;;;:::o;44682:126::-;44719:7;44759:42;44752:5;44748:54;44737:65;;44682:126;;;:::o;44814:77::-;44851:7;44880:5;44869:16;;44814:77;;;:::o;44897:86::-;44932:7;44972:4;44965:5;44961:16;44950:27;;44897:86;;;:::o;44989:109::-;45037:9;45070:22;45086:5;45070:22;:::i;:::-;45057:35;;44989:109;;;:::o;45104:154::-;45188:6;45183:3;45178;45165:30;45250:1;45241:6;45236:3;45232:16;45225:27;45104:154;;;:::o;45264:307::-;45332:1;45342:113;45356:6;45353:1;45350:13;45342:113;;;45441:1;45436:3;45432:11;45426:18;45422:1;45417:3;45413:11;45406:39;45378:2;45375:1;45371:10;45366:15;;45342:113;;;45473:6;45470:1;45467:13;45464:101;;;45553:1;45544:6;45539:3;45535:16;45528:27;45464:101;45313:258;45264:307;;;:::o;45577:320::-;45621:6;45658:1;45652:4;45648:12;45638:22;;45705:1;45699:4;45695:12;45726:18;45716:81;;45782:4;45774:6;45770:17;45760:27;;45716:81;45844:2;45836:6;45833:14;45813:18;45810:38;45807:84;;;45863:18;;:::i;:::-;45807:84;45628:269;45577:320;;;:::o;45903:281::-;45986:27;46008:4;45986:27;:::i;:::-;45978:6;45974:40;46116:6;46104:10;46101:22;46080:18;46068:10;46065:34;46062:62;46059:88;;;46127:18;;:::i;:::-;46059:88;46167:10;46163:2;46156:22;45946:238;45903:281;;:::o;46190:233::-;46229:3;46252:24;46270:5;46252:24;:::i;:::-;46243:33;;46298:66;46291:5;46288:77;46285:103;;;46368:18;;:::i;:::-;46285:103;46415:1;46408:5;46404:13;46397:20;;46190:233;;;:::o;46429:167::-;46466:3;46489:22;46505:5;46489:22;:::i;:::-;46480:31;;46533:4;46526:5;46523:15;46520:41;;;46541:18;;:::i;:::-;46520:41;46588:1;46581:5;46577:13;46570:20;;46429:167;;;:::o;46602:100::-;46641:7;46670:26;46690:5;46670:26;:::i;:::-;46659:37;;46602:100;;;:::o;46708:79::-;46747:7;46776:5;46765:16;;46708:79;;;:::o;46793:94::-;46832:7;46861:20;46875:5;46861:20;:::i;:::-;46850:31;;46793:94;;;:::o;46893:176::-;46925:1;46942:20;46960:1;46942:20;:::i;:::-;46937:25;;46976:20;46994:1;46976:20;:::i;:::-;46971:25;;47015:1;47005:35;;47020:18;;:::i;:::-;47005:35;47061:1;47058;47054:9;47049:14;;46893:176;;;;:::o;47075:180::-;47123:77;47120:1;47113:88;47220:4;47217:1;47210:15;47244:4;47241:1;47234:15;47261:180;47309:77;47306:1;47299:88;47406:4;47403:1;47396:15;47430:4;47427:1;47420:15;47447:180;47495:77;47492:1;47485:88;47592:4;47589:1;47582:15;47616:4;47613:1;47606:15;47633:180;47681:77;47678:1;47671:88;47778:4;47775:1;47768:15;47802:4;47799:1;47792:15;47819:180;47867:77;47864:1;47857:88;47964:4;47961:1;47954:15;47988:4;47985:1;47978:15;48005:180;48053:77;48050:1;48043:88;48150:4;48147:1;48140:15;48174:4;48171:1;48164:15;48191:180;48239:77;48236:1;48229:88;48336:4;48333:1;48326:15;48360:4;48357:1;48350:15;48377:117;48486:1;48483;48476:12;48500:117;48609:1;48606;48599:12;48623:117;48732:1;48729;48722:12;48746:117;48855:1;48852;48845:12;48869:102;48910:6;48961:2;48957:7;48952:2;48945:5;48941:14;48937:28;48927:38;;48869:102;;;:::o;48977:94::-;49010:8;49058:5;49054:2;49050:14;49029:35;;48977:94;;;:::o;49077:174::-;49217:26;49213:1;49205:6;49201:14;49194:50;49077:174;:::o;49257:156::-;49397:8;49393:1;49385:6;49381:14;49374:32;49257:156;:::o;49419:181::-;49559:33;49555:1;49547:6;49543:14;49536:57;49419:181;:::o;49606:214::-;49746:66;49742:1;49734:6;49730:14;49723:90;49606:214;:::o;49826:170::-;49966:22;49962:1;49954:6;49950:14;49943:46;49826:170;:::o;50002:181::-;50142:33;50138:1;50130:6;50126:14;50119:57;50002:181;:::o;50189:169::-;50329:21;50325:1;50317:6;50313:14;50306:45;50189:169;:::o;50364:230::-;50504:34;50500:1;50492:6;50488:14;50481:58;50573:13;50568:2;50560:6;50556:15;50549:38;50364:230;:::o;50600:237::-;50740:34;50736:1;50728:6;50724:14;50717:58;50809:20;50804:2;50796:6;50792:15;50785:45;50600:237;:::o;50843:225::-;50983:34;50979:1;50971:6;50967:14;50960:58;51052:8;51047:2;51039:6;51035:15;51028:33;50843:225;:::o;51074:165::-;51214:17;51210:1;51202:6;51198:14;51191:41;51074:165;:::o;51245:224::-;51385:34;51381:1;51373:6;51369:14;51362:58;51454:7;51449:2;51441:6;51437:15;51430:32;51245:224;:::o;51475:178::-;51615:30;51611:1;51603:6;51599:14;51592:54;51475:178;:::o;51659:166::-;51799:18;51795:1;51787:6;51783:14;51776:42;51659:166;:::o;51831:223::-;51971:34;51967:1;51959:6;51955:14;51948:58;52040:6;52035:2;52027:6;52023:15;52016:31;51831:223;:::o;52060:175::-;52200:27;52196:1;52188:6;52184:14;52177:51;52060:175;:::o;52241:221::-;52381:34;52377:1;52369:6;52365:14;52358:58;52450:4;52445:2;52437:6;52433:15;52426:29;52241:221;:::o;52468:163::-;52608:15;52604:1;52596:6;52592:14;52585:39;52468:163;:::o;52637:228::-;52777:34;52773:1;52765:6;52761:14;52754:58;52846:11;52841:2;52833:6;52829:15;52822:36;52637:228;:::o;52871:221::-;53011:34;53007:1;52999:6;52995:14;52988:58;53080:4;53075:2;53067:6;53063:15;53056:29;52871:221;:::o;53098:249::-;53238:34;53234:1;53226:6;53222:14;53215:58;53307:32;53302:2;53294:6;53290:15;53283:57;53098:249;:::o;53353:182::-;53493:34;53489:1;53481:6;53477:14;53470:58;53353:182;:::o;53541:170::-;53681:22;53677:1;53669:6;53665:14;53658:46;53541:170;:::o;53717:182::-;53857:34;53853:1;53845:6;53841:14;53834:58;53717:182;:::o;53905:174::-;54045:26;54041:1;54033:6;54029:14;54022:50;53905:174;:::o;54085:220::-;54225:34;54221:1;54213:6;54209:14;54202:58;54294:3;54289:2;54281:6;54277:15;54270:28;54085:220;:::o;54311:163::-;54451:15;54447:1;54439:6;54435:14;54428:39;54311:163;:::o;54480:170::-;54620:22;54616:1;54608:6;54604:14;54597:46;54480:170;:::o;54656:114::-;;:::o;54776:163::-;54916:15;54912:1;54904:6;54900:14;54893:39;54776:163;:::o;54945:231::-;55085:34;55081:1;55073:6;55069:14;55062:58;55154:14;55149:2;55141:6;55137:15;55130:39;54945:231;:::o;55182:233::-;55322:34;55318:1;55310:6;55306:14;55299:58;55391:16;55386:2;55378:6;55374:15;55367:41;55182:233;:::o;55421:181::-;55561:33;55557:1;55549:6;55545:14;55538:57;55421:181;:::o;55608:122::-;55681:24;55699:5;55681:24;:::i;:::-;55674:5;55671:35;55661:63;;55720:1;55717;55710:12;55661:63;55608:122;:::o;55736:116::-;55806:21;55821:5;55806:21;:::i;:::-;55799:5;55796:32;55786:60;;55842:1;55839;55832:12;55786:60;55736:116;:::o;55858:120::-;55930:23;55947:5;55930:23;:::i;:::-;55923:5;55920:34;55910:62;;55968:1;55965;55958:12;55910:62;55858:120;:::o;55984:122::-;56057:24;56075:5;56057:24;:::i;:::-;56050:5;56047:35;56037:63;;56096:1;56093;56086:12;56037:63;55984:122;:::o;56112:118::-;56183:22;56199:5;56183:22;:::i;:::-;56176:5;56173:33;56163:61;;56220:1;56217;56210:12;56163:61;56112:118;:::o
Swarm Source
ipfs://da209262f0226559e942c8dafdbbfd8c91fbfeccd99a4a05e1229ecb7cd01da1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.