Polygon Sponsored slots available. Book your slot here!
ERC-721
NFT
Overview
Max Total Supply
9,258 glasses
Holders
5,842
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 glassesLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
UniqueGlassesGenerator
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-10 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/utils/Strings.sol /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @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); } /** * @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 of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-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` 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 { } } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/contracts/access/Ownable.sol /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/ContextMixin.sol /** * https://github.com/maticnetwork/pos-portal/blob/master/contracts/common/ContextMixin.sol */ abstract contract ContextMixin { function msgSender() internal view returns (address sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = msg.sender; } return sender; } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: contracts/Initializable.sol contract Initializable { bool inited = false; modifier initializer() { require(!inited, "already inited"); _; inited = true; } } // File: contracts/EIP712Base.sol contract EIP712Base is Initializable { struct EIP712Domain { string name; string version; address verifyingContract; bytes32 salt; } string constant public ERC712_VERSION = "1"; bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)" ) ); bytes32 internal domainSeperator; // supposed to be called once while initializing. // one of the contractsa that inherits this contract follows proxy pattern // so it is not possible to do this in a constructor function _initializeEIP712( string memory name ) internal initializer { _setDomainSeperator(name); } function _setDomainSeperator(string memory name) internal { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(ERC712_VERSION)), address(this), bytes32(getChainId()) ) ); } function getDomainSeperator() public view returns (bytes32) { return domainSeperator; } function getChainId() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } } // File: contracts/NativeMetaTransaction.sol contract NativeMetaTransaction is EIP712Base { using SafeMath for uint256; bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address relayerAddress, bytes functionSignature ); mapping(address => uint256) nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable returns (bytes memory) { MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match" ); // increase nonce for user (to avoid re-use) nonces[userAddress] = nonces[userAddress].add(1); emit MetaTransactionExecuted( userAddress, msg.sender, functionSignature ); // Append userAddress and relayer address at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "Function call not successful"); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) public view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address signer, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER"); return signer == ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); } } // File: contracts/UniqueGlassesGenerator.sol contract UniqueGlassesGenerator is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable, ContextMixin, NativeMetaTransaction { address proxyRegistryAddress; string baseURI; string prefixURI; constructor(string memory name, string memory symbol, string memory _baseStorageURI, string memory _prefixStorageURI, address _proxyRegistryAddress) ERC721(name, symbol) { _initializeEIP712(name); proxyRegistryAddress = _proxyRegistryAddress; baseURI = string(abi.encodePacked(_baseStorageURI, "/")); prefixURI = string(abi.encodePacked(_prefixStorageURI, "/")); } function _msgSender() internal override view returns (address sender) { return ContextMixin.msgSender(); } function setBaseURI(string memory _baseStorageURI) public onlyOwner { baseURI = string(abi.encodePacked(_baseStorageURI, "/")); } function setPrefixURI(string memory _prefixStorageURI) public onlyOwner { prefixURI = string(abi.encodePacked(_prefixStorageURI, "/")); } function getBaseURI() public view onlyOwner returns (string memory) { return baseURI; } function getPrefixURI() public view onlyOwner returns (string memory) { return prefixURI; } function _baseURI() internal view override returns (string memory) { return string(abi.encodePacked(baseURI, prefixURI, "metadata/")); } function addItem( address nftOwner, uint256 tokenId, string memory _tokenURI ) public onlyOwner returns (uint256) { _safeMint(nftOwner, tokenId); _setTokenURI(tokenId, _tokenURI); return tokenId; } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } /** * Override isApprovedForAll to whitelist proxy accounts */ function isApprovedForAll( address _owner, address _operator ) public override view returns (bool isOperator) { if (_operator == address(proxyRegistryAddress)) { return true; } return ERC721.isApprovedForAll(_owner, _operator); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"_baseStorageURI","type":"string"},{"internalType":"string","name":"_prefixStorageURI","type":"string"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftOwner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"addItem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrefixURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseStorageURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_prefixStorageURI","type":"string"}],"name":"setPrefixURI","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"}]
Contract Creation Code
60806040526000600b60146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040516200553638038062005536833981810160405281019062000052919062000550565b848481600090805190602001906200006c92919062000417565b5080600190805190602001906200008592919062000417565b50505060006200009a6200020a60201b60201c565b905080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200014a856200022660201b60201c565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826040516020016200019e919062000713565b604051602081830303815290604052600f9080519060200190620001c492919062000417565b5081604051602001620001d8919062000713565b60405160208183030381529060405260109080519060200190620001fe92919062000417565b50505050505062000968565b600062000221620002a860201b620019ea1760201c565b905090565b600b60149054906101000a900460ff161562000279576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002709062000796565b60405180910390fd5b6200028a816200035b60201b60201c565b6001600b60146101000a81548160ff02191690831515021790555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156200035457600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505062000358565b3390505b90565b6040518060800160405280604f8152602001620054e7604f91398051906020012081805190602001206040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508051906020012030620003d26200040a60201b60201c565b60001b604051602001620003eb95949392919062000739565b60405160208183030381529060405280519060200120600c8190555050565b6000804690508091505090565b8280546200042590620008ba565b90600052602060002090601f01602090048101928262000449576000855562000495565b82601f106200046457805160ff191683800117855562000495565b8280016001018555821562000495579182015b828111156200049457825182559160200191906001019062000477565b5b509050620004a49190620004a8565b5090565b5b80821115620004c3576000816000905550600101620004a9565b5090565b6000620004de620004d884620007ec565b620007b8565b905082815260208101848484011115620004f757600080fd5b6200050484828562000884565b509392505050565b6000815190506200051d816200094e565b92915050565b600082601f8301126200053557600080fd5b815162000547848260208601620004c7565b91505092915050565b600080600080600060a086880312156200056957600080fd5b600086015167ffffffffffffffff8111156200058457600080fd5b620005928882890162000523565b955050602086015167ffffffffffffffff811115620005b057600080fd5b620005be8882890162000523565b945050604086015167ffffffffffffffff811115620005dc57600080fd5b620005ea8882890162000523565b935050606086015167ffffffffffffffff8111156200060857600080fd5b620006168882890162000523565b925050608062000629888289016200050c565b9150509295509295909350565b620006418162000846565b82525050565b62000652816200085a565b82525050565b600062000665826200081f565b6200067181856200083b565b93506200068381856020860162000884565b80840191505092915050565b60006200069e600e836200082a565b91507f616c726561647920696e697465640000000000000000000000000000000000006000830152602082019050919050565b6000620006e06001836200083b565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b600062000721828462000658565b91506200072e82620006d1565b915081905092915050565b600060a08201905062000750600083018862000647565b6200075f602083018762000647565b6200076e604083018662000647565b6200077d606083018562000636565b6200078c608083018462000647565b9695505050505050565b60006020820190508181036000830152620007b1816200068f565b9050919050565b6000604051905081810181811067ffffffffffffffff82111715620007e257620007e16200091f565b5b8060405250919050565b600067ffffffffffffffff8211156200080a57620008096200091f565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000620008538262000864565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620008a457808201518184015260208101905062000887565b83811115620008b4576000848401525b50505050565b60006002820490506001821680620008d357607f821691505b60208210811415620008ea57620008e9620008f0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009598162000846565b81146200096557600080fd5b50565b614b6f80620009786000396000f3fe6080604052600436106101c25760003560e01c806355f804b3116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd1461065b578063e985e9c514610698578063f2fde38b146106d5578063f85c5a8a146106fe576101c2565b806395d89b41146105b5578063a22cb465146105e0578063b2c94ee614610609578063b88d4fde14610632576101c2565b806370a08231116100d157806370a082311461050b578063714c539814610548578063715018a6146105735780638da5cb5b1461058a576101c2565b806355f804b31461047a5780636352211e146104a35780636b3a0cef146104e0576101c2565b806320379ee5116101645780632f745c591161013e5780632f745c59146103ac5780633408e470146103e957806342842e0e146104145780634f6ccce71461043d576101c2565b806320379ee51461031b57806323b872dd146103465780632d0335ab1461036f576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780630c53c51c146102955780630f7e5970146102c557806318160ddd146102f0576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906134f9565b61073b565b6040516101fb919061423d565b60405180910390f35b34801561021057600080fd5b5061021961074d565b604051610226919061431f565b60405180910390f35b34801561023b57600080fd5b506102566004803603810190610251919061358c565b6107df565b6040516102639190614198565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190613456565b610864565b005b6102af60048036038101906102aa91906133c7565b61097c565b6040516102bc91906142fd565b60405180910390f35b3480156102d157600080fd5b506102da610bee565b6040516102e7919061431f565b60405180910390f35b3480156102fc57600080fd5b50610305610c27565b6040516103129190614621565b60405180910390f35b34801561032757600080fd5b50610330610c34565b60405161033d9190614258565b60405180910390f35b34801561035257600080fd5b5061036d600480360381019061036891906132c1565b610c3e565b005b34801561037b57600080fd5b506103966004803603810190610391919061325c565b610c9e565b6040516103a39190614621565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190613456565b610ce7565b6040516103e09190614621565b60405180910390f35b3480156103f557600080fd5b506103fe610d8c565b60405161040b9190614621565b60405180910390f35b34801561042057600080fd5b5061043b600480360381019061043691906132c1565b610d99565b005b34801561044957600080fd5b50610464600480360381019061045f919061358c565b610db9565b6040516104719190614621565b60405180910390f35b34801561048657600080fd5b506104a1600480360381019061049c919061354b565b610e50565b005b3480156104af57600080fd5b506104ca60048036038101906104c5919061358c565b610f05565b6040516104d79190614198565b60405180910390f35b3480156104ec57600080fd5b506104f5610fb7565b604051610502919061431f565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d919061325c565b6110c5565b60405161053f9190614621565b60405180910390f35b34801561055457600080fd5b5061055d61117d565b60405161056a919061431f565b60405180910390f35b34801561057f57600080fd5b5061058861128b565b005b34801561059657600080fd5b5061059f6113c8565b6040516105ac9190614198565b60405180910390f35b3480156105c157600080fd5b506105ca6113f2565b6040516105d7919061431f565b60405180910390f35b3480156105ec57600080fd5b506106076004803603810190610602919061338b565b611484565b005b34801561061557600080fd5b50610630600480360381019061062b919061354b565b611605565b005b34801561063e57600080fd5b5061065960048036038101906106549190613310565b6116ba565b005b34801561066757600080fd5b50610682600480360381019061067d919061358c565b61171c565b60405161068f919061431f565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613285565b61172e565b6040516106cc919061423d565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f7919061325c565b6117a2565b005b34801561070a57600080fd5b5061072560048036038101906107209190613492565b61194e565b6040516107329190614621565b60405180910390f35b600061074682611a9b565b9050919050565b60606000805461075c906148b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610788906148b8565b80156107d55780601f106107aa576101008083540402835291602001916107d5565b820191906000526020600020905b8154815290600101906020018083116107b857829003601f168201915b5050505050905090565b60006107ea82611b15565b610829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082090614521565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086f82610f05565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d7906145c1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ff611b81565b73ffffffffffffffffffffffffffffffffffffffff16148061092e575061092d81610928611b81565b61172e565b5b61096d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096490614461565b60405180910390fd5b6109778383611b90565b505050565b606060006040518060600160405280600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018781525090506109ff8782878787611c49565b610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590614581565b60405180910390fd5b610a916001600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5290919063ffffffff16565b600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610b07939291906141b3565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610b3c9291906140c4565b604051602081830303815290604052604051610b5891906140ad565b6000604051808303816000865af19150503d8060008114610b95576040519150601f19603f3d011682016040523d82523d6000602084013e610b9a565b606091505b509150915081610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd6906143a1565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600880549050905090565b6000600c54905090565b610c4f610c49611b81565b82611d68565b610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c85906145e1565b60405180910390fd5b610c99838383611e46565b505050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610cf2836110c5565b8210610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90614341565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000804690508091505090565b610db4838383604051806020016040528060008152506116ba565b505050565b6000610dc3610c27565b8210610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb90614601565b60405180910390fd5b60088281548110610e3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e58611b81565b73ffffffffffffffffffffffffffffffffffffffff16610e766113c8565b73ffffffffffffffffffffffffffffffffffffffff1614610ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec390614541565b60405180910390fd5b80604051602001610edd9190614110565b604051602081830303815290604052600f9080519060200190610f01929190613056565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa5906144a1565b60405180910390fd5b80915050919050565b6060610fc1611b81565b73ffffffffffffffffffffffffffffffffffffffff16610fdf6113c8565b73ffffffffffffffffffffffffffffffffffffffff1614611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c90614541565b60405180910390fd5b60108054611042906148b8565b80601f016020809104026020016040519081016040528092919081815260200182805461106e906148b8565b80156110bb5780601f10611090576101008083540402835291602001916110bb565b820191906000526020600020905b81548152906001019060200180831161109e57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d90614481565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060611187611b81565b73ffffffffffffffffffffffffffffffffffffffff166111a56113c8565b73ffffffffffffffffffffffffffffffffffffffff16146111fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f290614541565b60405180910390fd5b600f8054611208906148b8565b80601f0160208091040260200160405190810160405280929190818152602001828054611234906148b8565b80156112815780601f1061125657610100808354040283529160200191611281565b820191906000526020600020905b81548152906001019060200180831161126457829003601f168201915b5050505050905090565b611293611b81565b73ffffffffffffffffffffffffffffffffffffffff166112b16113c8565b73ffffffffffffffffffffffffffffffffffffffff1614611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe90614541565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611401906148b8565b80601f016020809104026020016040519081016040528092919081815260200182805461142d906148b8565b801561147a5780601f1061144f5761010080835404028352916020019161147a565b820191906000526020600020905b81548152906001019060200180831161145d57829003601f168201915b5050505050905090565b61148c611b81565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190614401565b60405180910390fd5b8060056000611507611b81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115b4611b81565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115f9919061423d565b60405180910390a35050565b61160d611b81565b73ffffffffffffffffffffffffffffffffffffffff1661162b6113c8565b73ffffffffffffffffffffffffffffffffffffffff1614611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890614541565b60405180910390fd5b806040516020016116929190614110565b604051602081830303815290604052601090805190602001906116b6929190613056565b5050565b6116cb6116c5611b81565b83611d68565b61170a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611701906145e1565b60405180910390fd5b611716848484846120a2565b50505050565b6060611727826120fe565b9050919050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561178f576001905061179c565b6117998383612250565b90505b92915050565b6117aa611b81565b73ffffffffffffffffffffffffffffffffffffffff166117c86113c8565b73ffffffffffffffffffffffffffffffffffffffff161461181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181590614541565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561188e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188590614381565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611958611b81565b73ffffffffffffffffffffffffffffffffffffffff166119766113c8565b73ffffffffffffffffffffffffffffffffffffffff16146119cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c390614541565b60405180910390fd5b6119d684846122e4565b6119e08383612302565b8290509392505050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611a9457600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611a98565b3390505b90565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b0e5750611b0d82612376565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000611b8b6119ea565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c0383610f05565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb190614441565b60405180910390fd5b6001611ccd611cc887612458565b6124c0565b83868660405160008152602001604052604051611ced94939291906142b8565b6020604051602081039080840390855afa158015611d0f573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183611d609190614730565b905092915050565b6000611d7382611b15565b611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da990614421565b60405180910390fd5b6000611dbd83610f05565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e2c57508373ffffffffffffffffffffffffffffffffffffffff16611e14846107df565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e3d5750611e3c818561172e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e6682610f05565b73ffffffffffffffffffffffffffffffffffffffff1614611ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb390614561565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f23906143e1565b60405180910390fd5b611f378383836124f9565b611f42600082611b90565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f9291906147b7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fe99190614730565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6120ad848484611e46565b6120b984848484612509565b6120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef90614361565b60405180910390fd5b50505050565b606061210982611b15565b612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213f90614501565b60405180910390fd5b6000600a60008481526020019081526020016000208054612168906148b8565b80601f0160208091040260200160405190810160405280929190818152602001828054612194906148b8565b80156121e15780601f106121b6576101008083540402835291602001916121e1565b820191906000526020600020905b8154815290600101906020018083116121c457829003601f168201915b5050505050905060006121f26126a0565b905060008151141561220857819250505061224b565b60008251111561223d5780826040516020016122259291906140ec565b6040516020818303038152906040529250505061224b565b612246846126cb565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122fe828260405180602001604052806000815250612772565b5050565b61230b82611b15565b61234a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612341906144c1565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190612371929190613056565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061244157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124515750612450826127cd565b5b9050919050565b6000604051806080016040528060438152602001614af76043913980519060200120826000015183602001518460400151805190602001206040516020016124a39493929190614273565b604051602081830303815290604052805190602001209050919050565b60006124ca610c34565b826040516020016124dc929190614161565b604051602081830303815290604052805190602001209050919050565b612504838383612837565b505050565b600061252a8473ffffffffffffffffffffffffffffffffffffffff1661294b565b15612693578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612553611b81565b8786866040518563ffffffff1660e01b815260040161257594939291906141f1565b602060405180830381600087803b15801561258f57600080fd5b505af19250505080156125c057506040513d601f19601f820116820180604052508101906125bd9190613522565b60015b612643573d80600081146125f0576040519150601f19603f3d011682016040523d82523d6000602084013e6125f5565b606091505b5060008151141561263b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263290614361565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612698565b600190505b949350505050565b6060600f60106040516020016126b7929190614132565b604051602081830303815290604052905090565b60606126d682611b15565b612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270c906145a1565b60405180910390fd5b600061271f6126a0565b9050600081511161273f576040518060200160405280600081525061276a565b806127498461295e565b60405160200161275a9291906140ec565b6040516020818303038152906040525b915050919050565b61277c8383612b0b565b6127896000848484612509565b6127c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bf90614361565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612842838383612cd9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128855761288081612cde565b6128c4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128c3576128c28382612d27565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129075761290281612e94565b612946565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612945576129448282612fd7565b5b5b505050565b600080823b905060008111915050919050565b606060008214156129a6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b06565b600082905060005b600082146129d85780806129c1906148ea565b915050600a826129d19190614786565b91506129ae565b60008167ffffffffffffffff811115612a1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a4c5781602001600182028036833780820191505090505b5090505b60008514612aff57600182612a6591906147b7565b9150600a85612a749190614961565b6030612a809190614730565b60f81b818381518110612abc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612af89190614786565b9450612a50565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b72906144e1565b60405180910390fd5b612b8481611b15565b15612bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbb906143c1565b60405180910390fd5b612bd0600083836124f9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c209190614730565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d34846110c5565b612d3e91906147b7565b9050600060076000848152602001908152602001600020549050818114612e23576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ea891906147b7565b9050600060096000848152602001908152602001600020549050600060088381548110612efe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612f46577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612fbb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612fe2836110c5565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613062906148b8565b90600052602060002090601f01602090048101928261308457600085556130cb565b82601f1061309d57805160ff19168380011785556130cb565b828001600101855582156130cb579182015b828111156130ca5782518255916020019190600101906130af565b5b5090506130d891906130dc565b5090565b5b808211156130f55760008160009055506001016130dd565b5090565b600061310c6131078461466d565b61463c565b90508281526020810184848401111561312457600080fd5b61312f848285614876565b509392505050565b600061314a6131458461469d565b61463c565b90508281526020810184848401111561316257600080fd5b61316d848285614876565b509392505050565b60008135905061318481614a6c565b92915050565b60008135905061319981614a83565b92915050565b6000813590506131ae81614a9a565b92915050565b6000813590506131c381614ab1565b92915050565b6000815190506131d881614ab1565b92915050565b600082601f8301126131ef57600080fd5b81356131ff8482602086016130f9565b91505092915050565b600082601f83011261321957600080fd5b8135613229848260208601613137565b91505092915050565b60008135905061324181614ac8565b92915050565b60008135905061325681614adf565b92915050565b60006020828403121561326e57600080fd5b600061327c84828501613175565b91505092915050565b6000806040838503121561329857600080fd5b60006132a685828601613175565b92505060206132b785828601613175565b9150509250929050565b6000806000606084860312156132d657600080fd5b60006132e486828701613175565b93505060206132f586828701613175565b925050604061330686828701613232565b9150509250925092565b6000806000806080858703121561332657600080fd5b600061333487828801613175565b945050602061334587828801613175565b935050604061335687828801613232565b925050606085013567ffffffffffffffff81111561337357600080fd5b61337f878288016131de565b91505092959194509250565b6000806040838503121561339e57600080fd5b60006133ac85828601613175565b92505060206133bd8582860161318a565b9150509250929050565b600080600080600060a086880312156133df57600080fd5b60006133ed88828901613175565b955050602086013567ffffffffffffffff81111561340a57600080fd5b613416888289016131de565b94505060406134278882890161319f565b93505060606134388882890161319f565b925050608061344988828901613247565b9150509295509295909350565b6000806040838503121561346957600080fd5b600061347785828601613175565b925050602061348885828601613232565b9150509250929050565b6000806000606084860312156134a757600080fd5b60006134b586828701613175565b93505060206134c686828701613232565b925050604084013567ffffffffffffffff8111156134e357600080fd5b6134ef86828701613208565b9150509250925092565b60006020828403121561350b57600080fd5b6000613519848285016131b4565b91505092915050565b60006020828403121561353457600080fd5b6000613542848285016131c9565b91505092915050565b60006020828403121561355d57600080fd5b600082013567ffffffffffffffff81111561357757600080fd5b61358384828501613208565b91505092915050565b60006020828403121561359e57600080fd5b60006135ac84828501613232565b91505092915050565b6135be816147eb565b82525050565b6135d56135d0826147eb565b614933565b82525050565b6135e4816147fd565b82525050565b6135f381614809565b82525050565b61360a61360582614809565b614945565b82525050565b600061361b826146e2565b61362581856146f8565b9350613635818560208601614885565b61363e81614a4e565b840191505092915050565b6000613654826146e2565b61365e8185614709565b935061366e818560208601614885565b80840191505092915050565b6000613685826146ed565b61368f8185614714565b935061369f818560208601614885565b6136a881614a4e565b840191505092915050565b60006136be826146ed565b6136c88185614725565b93506136d8818560208601614885565b80840191505092915050565b600081546136f1816148b8565b6136fb8186614725565b9450600182166000811461371657600181146137275761375a565b60ff1983168652818601935061375a565b613730856146cd565b60005b8381101561375257815481890152600182019150602081019050613733565b838801955050505b50505092915050565b6000613770602b83614714565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006137d6603283614714565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061383c602683614714565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138a2601c83614714565b91507f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006000830152602082019050919050565b60006138e2601c83614714565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613922600283614725565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000613962602483614714565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139c8601983614714565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613a08602c83614714565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a6e602583614714565b91507f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008301527f49474e45520000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ad4603883614714565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613b3a602a83614714565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ba0602983614714565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c06602e83614714565b91507f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008301527f6578697374656e7420746f6b656e0000000000000000000000000000000000006020830152604082019050919050565b6000613c6c602083614714565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613cac603183614714565b91507f45524337323155524953746f726167653a2055524920717565727920666f722060008301527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020830152604082019050919050565b6000613d12602c83614714565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613d78602083614714565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613db8602983614714565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e1e602183614714565b91507f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008301527f68000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e84602f83614714565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613eea600983614725565b91507f6d657461646174612f00000000000000000000000000000000000000000000006000830152600982019050919050565b6000613f2a602183614714565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f90603183614714565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613ff6602c83614714565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061405c600183614725565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6140988161485f565b82525050565b6140a781614869565b82525050565b60006140b98284613649565b915081905092915050565b60006140d08285613649565b91506140dc82846135c4565b6014820191508190509392505050565b60006140f882856136b3565b915061410482846136b3565b91508190509392505050565b600061411c82846136b3565b91506141278261404f565b915081905092915050565b600061413e82856136e4565b915061414a82846136e4565b915061415582613edd565b91508190509392505050565b600061416c82613915565b915061417882856135f9565b60208201915061418882846135f9565b6020820191508190509392505050565b60006020820190506141ad60008301846135b5565b92915050565b60006060820190506141c860008301866135b5565b6141d560208301856135b5565b81810360408301526141e78184613610565b9050949350505050565b600060808201905061420660008301876135b5565b61421360208301866135b5565b614220604083018561408f565b81810360608301526142328184613610565b905095945050505050565b600060208201905061425260008301846135db565b92915050565b600060208201905061426d60008301846135ea565b92915050565b600060808201905061428860008301876135ea565b614295602083018661408f565b6142a260408301856135b5565b6142af60608301846135ea565b95945050505050565b60006080820190506142cd60008301876135ea565b6142da602083018661409e565b6142e760408301856135ea565b6142f460608301846135ea565b95945050505050565b600060208201905081810360008301526143178184613610565b905092915050565b60006020820190508181036000830152614339818461367a565b905092915050565b6000602082019050818103600083015261435a81613763565b9050919050565b6000602082019050818103600083015261437a816137c9565b9050919050565b6000602082019050818103600083015261439a8161382f565b9050919050565b600060208201905081810360008301526143ba81613895565b9050919050565b600060208201905081810360008301526143da816138d5565b9050919050565b600060208201905081810360008301526143fa81613955565b9050919050565b6000602082019050818103600083015261441a816139bb565b9050919050565b6000602082019050818103600083015261443a816139fb565b9050919050565b6000602082019050818103600083015261445a81613a61565b9050919050565b6000602082019050818103600083015261447a81613ac7565b9050919050565b6000602082019050818103600083015261449a81613b2d565b9050919050565b600060208201905081810360008301526144ba81613b93565b9050919050565b600060208201905081810360008301526144da81613bf9565b9050919050565b600060208201905081810360008301526144fa81613c5f565b9050919050565b6000602082019050818103600083015261451a81613c9f565b9050919050565b6000602082019050818103600083015261453a81613d05565b9050919050565b6000602082019050818103600083015261455a81613d6b565b9050919050565b6000602082019050818103600083015261457a81613dab565b9050919050565b6000602082019050818103600083015261459a81613e11565b9050919050565b600060208201905081810360008301526145ba81613e77565b9050919050565b600060208201905081810360008301526145da81613f1d565b9050919050565b600060208201905081810360008301526145fa81613f83565b9050919050565b6000602082019050818103600083015261461a81613fe9565b9050919050565b6000602082019050614636600083018461408f565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561466357614662614a1f565b5b8060405250919050565b600067ffffffffffffffff82111561468857614687614a1f565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156146b8576146b7614a1f565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061473b8261485f565b91506147468361485f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561477b5761477a614992565b5b828201905092915050565b60006147918261485f565b915061479c8361485f565b9250826147ac576147ab6149c1565b5b828204905092915050565b60006147c28261485f565b91506147cd8361485f565b9250828210156147e0576147df614992565b5b828203905092915050565b60006147f68261483f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156148a3578082015181840152602081019050614888565b838111156148b2576000848401525b50505050565b600060028204905060018216806148d057607f821691505b602082108114156148e4576148e36149f0565b5b50919050565b60006148f58261485f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561492857614927614992565b5b600182019050919050565b600061493e8261494f565b9050919050565b6000819050919050565b600061495a82614a5f565b9050919050565b600061496c8261485f565b91506149778361485f565b925082614987576149866149c1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614a75816147eb565b8114614a8057600080fd5b50565b614a8c816147fd565b8114614a9757600080fd5b50565b614aa381614809565b8114614aae57600080fd5b50565b614aba81614813565b8114614ac557600080fd5b50565b614ad18161485f565b8114614adc57600080fd5b50565b614ae881614869565b8114614af357600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220970fb0d378e8943b229dc615ed4302bd052c46584d3abca32764d0750b67bfa464736f6c63430008000033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c742900000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000058807bad0b376efc12f5ad86aac70e78ed67deae0000000000000000000000000000000000000000000000000000000000000017556e69717565476c6173736573202d20476c61737365730000000000000000000000000000000000000000000000000000000000000000000000000000000007676c617373657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f756e69717565676c617373657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007676c617373657300000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101c25760003560e01c806355f804b3116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd1461065b578063e985e9c514610698578063f2fde38b146106d5578063f85c5a8a146106fe576101c2565b806395d89b41146105b5578063a22cb465146105e0578063b2c94ee614610609578063b88d4fde14610632576101c2565b806370a08231116100d157806370a082311461050b578063714c539814610548578063715018a6146105735780638da5cb5b1461058a576101c2565b806355f804b31461047a5780636352211e146104a35780636b3a0cef146104e0576101c2565b806320379ee5116101645780632f745c591161013e5780632f745c59146103ac5780633408e470146103e957806342842e0e146104145780634f6ccce71461043d576101c2565b806320379ee51461031b57806323b872dd146103465780632d0335ab1461036f576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780630c53c51c146102955780630f7e5970146102c557806318160ddd146102f0576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906134f9565b61073b565b6040516101fb919061423d565b60405180910390f35b34801561021057600080fd5b5061021961074d565b604051610226919061431f565b60405180910390f35b34801561023b57600080fd5b506102566004803603810190610251919061358c565b6107df565b6040516102639190614198565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190613456565b610864565b005b6102af60048036038101906102aa91906133c7565b61097c565b6040516102bc91906142fd565b60405180910390f35b3480156102d157600080fd5b506102da610bee565b6040516102e7919061431f565b60405180910390f35b3480156102fc57600080fd5b50610305610c27565b6040516103129190614621565b60405180910390f35b34801561032757600080fd5b50610330610c34565b60405161033d9190614258565b60405180910390f35b34801561035257600080fd5b5061036d600480360381019061036891906132c1565b610c3e565b005b34801561037b57600080fd5b506103966004803603810190610391919061325c565b610c9e565b6040516103a39190614621565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190613456565b610ce7565b6040516103e09190614621565b60405180910390f35b3480156103f557600080fd5b506103fe610d8c565b60405161040b9190614621565b60405180910390f35b34801561042057600080fd5b5061043b600480360381019061043691906132c1565b610d99565b005b34801561044957600080fd5b50610464600480360381019061045f919061358c565b610db9565b6040516104719190614621565b60405180910390f35b34801561048657600080fd5b506104a1600480360381019061049c919061354b565b610e50565b005b3480156104af57600080fd5b506104ca60048036038101906104c5919061358c565b610f05565b6040516104d79190614198565b60405180910390f35b3480156104ec57600080fd5b506104f5610fb7565b604051610502919061431f565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d919061325c565b6110c5565b60405161053f9190614621565b60405180910390f35b34801561055457600080fd5b5061055d61117d565b60405161056a919061431f565b60405180910390f35b34801561057f57600080fd5b5061058861128b565b005b34801561059657600080fd5b5061059f6113c8565b6040516105ac9190614198565b60405180910390f35b3480156105c157600080fd5b506105ca6113f2565b6040516105d7919061431f565b60405180910390f35b3480156105ec57600080fd5b506106076004803603810190610602919061338b565b611484565b005b34801561061557600080fd5b50610630600480360381019061062b919061354b565b611605565b005b34801561063e57600080fd5b5061065960048036038101906106549190613310565b6116ba565b005b34801561066757600080fd5b50610682600480360381019061067d919061358c565b61171c565b60405161068f919061431f565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613285565b61172e565b6040516106cc919061423d565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f7919061325c565b6117a2565b005b34801561070a57600080fd5b5061072560048036038101906107209190613492565b61194e565b6040516107329190614621565b60405180910390f35b600061074682611a9b565b9050919050565b60606000805461075c906148b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610788906148b8565b80156107d55780601f106107aa576101008083540402835291602001916107d5565b820191906000526020600020905b8154815290600101906020018083116107b857829003601f168201915b5050505050905090565b60006107ea82611b15565b610829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082090614521565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086f82610f05565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d7906145c1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ff611b81565b73ffffffffffffffffffffffffffffffffffffffff16148061092e575061092d81610928611b81565b61172e565b5b61096d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096490614461565b60405180910390fd5b6109778383611b90565b505050565b606060006040518060600160405280600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018781525090506109ff8782878787611c49565b610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590614581565b60405180910390fd5b610a916001600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5290919063ffffffff16565b600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610b07939291906141b3565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610b3c9291906140c4565b604051602081830303815290604052604051610b5891906140ad565b6000604051808303816000865af19150503d8060008114610b95576040519150601f19603f3d011682016040523d82523d6000602084013e610b9a565b606091505b509150915081610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd6906143a1565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600880549050905090565b6000600c54905090565b610c4f610c49611b81565b82611d68565b610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c85906145e1565b60405180910390fd5b610c99838383611e46565b505050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610cf2836110c5565b8210610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90614341565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000804690508091505090565b610db4838383604051806020016040528060008152506116ba565b505050565b6000610dc3610c27565b8210610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb90614601565b60405180910390fd5b60088281548110610e3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e58611b81565b73ffffffffffffffffffffffffffffffffffffffff16610e766113c8565b73ffffffffffffffffffffffffffffffffffffffff1614610ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec390614541565b60405180910390fd5b80604051602001610edd9190614110565b604051602081830303815290604052600f9080519060200190610f01929190613056565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa5906144a1565b60405180910390fd5b80915050919050565b6060610fc1611b81565b73ffffffffffffffffffffffffffffffffffffffff16610fdf6113c8565b73ffffffffffffffffffffffffffffffffffffffff1614611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c90614541565b60405180910390fd5b60108054611042906148b8565b80601f016020809104026020016040519081016040528092919081815260200182805461106e906148b8565b80156110bb5780601f10611090576101008083540402835291602001916110bb565b820191906000526020600020905b81548152906001019060200180831161109e57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d90614481565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060611187611b81565b73ffffffffffffffffffffffffffffffffffffffff166111a56113c8565b73ffffffffffffffffffffffffffffffffffffffff16146111fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f290614541565b60405180910390fd5b600f8054611208906148b8565b80601f0160208091040260200160405190810160405280929190818152602001828054611234906148b8565b80156112815780601f1061125657610100808354040283529160200191611281565b820191906000526020600020905b81548152906001019060200180831161126457829003601f168201915b5050505050905090565b611293611b81565b73ffffffffffffffffffffffffffffffffffffffff166112b16113c8565b73ffffffffffffffffffffffffffffffffffffffff1614611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe90614541565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611401906148b8565b80601f016020809104026020016040519081016040528092919081815260200182805461142d906148b8565b801561147a5780601f1061144f5761010080835404028352916020019161147a565b820191906000526020600020905b81548152906001019060200180831161145d57829003601f168201915b5050505050905090565b61148c611b81565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190614401565b60405180910390fd5b8060056000611507611b81565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115b4611b81565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115f9919061423d565b60405180910390a35050565b61160d611b81565b73ffffffffffffffffffffffffffffffffffffffff1661162b6113c8565b73ffffffffffffffffffffffffffffffffffffffff1614611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890614541565b60405180910390fd5b806040516020016116929190614110565b604051602081830303815290604052601090805190602001906116b6929190613056565b5050565b6116cb6116c5611b81565b83611d68565b61170a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611701906145e1565b60405180910390fd5b611716848484846120a2565b50505050565b6060611727826120fe565b9050919050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561178f576001905061179c565b6117998383612250565b90505b92915050565b6117aa611b81565b73ffffffffffffffffffffffffffffffffffffffff166117c86113c8565b73ffffffffffffffffffffffffffffffffffffffff161461181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181590614541565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561188e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188590614381565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611958611b81565b73ffffffffffffffffffffffffffffffffffffffff166119766113c8565b73ffffffffffffffffffffffffffffffffffffffff16146119cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c390614541565b60405180910390fd5b6119d684846122e4565b6119e08383612302565b8290509392505050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611a9457600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611a98565b3390505b90565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b0e5750611b0d82612376565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000611b8b6119ea565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c0383610f05565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb190614441565b60405180910390fd5b6001611ccd611cc887612458565b6124c0565b83868660405160008152602001604052604051611ced94939291906142b8565b6020604051602081039080840390855afa158015611d0f573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183611d609190614730565b905092915050565b6000611d7382611b15565b611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da990614421565b60405180910390fd5b6000611dbd83610f05565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e2c57508373ffffffffffffffffffffffffffffffffffffffff16611e14846107df565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e3d5750611e3c818561172e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e6682610f05565b73ffffffffffffffffffffffffffffffffffffffff1614611ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb390614561565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f23906143e1565b60405180910390fd5b611f378383836124f9565b611f42600082611b90565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f9291906147b7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fe99190614730565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6120ad848484611e46565b6120b984848484612509565b6120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef90614361565b60405180910390fd5b50505050565b606061210982611b15565b612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213f90614501565b60405180910390fd5b6000600a60008481526020019081526020016000208054612168906148b8565b80601f0160208091040260200160405190810160405280929190818152602001828054612194906148b8565b80156121e15780601f106121b6576101008083540402835291602001916121e1565b820191906000526020600020905b8154815290600101906020018083116121c457829003601f168201915b5050505050905060006121f26126a0565b905060008151141561220857819250505061224b565b60008251111561223d5780826040516020016122259291906140ec565b6040516020818303038152906040529250505061224b565b612246846126cb565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122fe828260405180602001604052806000815250612772565b5050565b61230b82611b15565b61234a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612341906144c1565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190612371929190613056565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061244157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124515750612450826127cd565b5b9050919050565b6000604051806080016040528060438152602001614af76043913980519060200120826000015183602001518460400151805190602001206040516020016124a39493929190614273565b604051602081830303815290604052805190602001209050919050565b60006124ca610c34565b826040516020016124dc929190614161565b604051602081830303815290604052805190602001209050919050565b612504838383612837565b505050565b600061252a8473ffffffffffffffffffffffffffffffffffffffff1661294b565b15612693578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612553611b81565b8786866040518563ffffffff1660e01b815260040161257594939291906141f1565b602060405180830381600087803b15801561258f57600080fd5b505af19250505080156125c057506040513d601f19601f820116820180604052508101906125bd9190613522565b60015b612643573d80600081146125f0576040519150601f19603f3d011682016040523d82523d6000602084013e6125f5565b606091505b5060008151141561263b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263290614361565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612698565b600190505b949350505050565b6060600f60106040516020016126b7929190614132565b604051602081830303815290604052905090565b60606126d682611b15565b612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270c906145a1565b60405180910390fd5b600061271f6126a0565b9050600081511161273f576040518060200160405280600081525061276a565b806127498461295e565b60405160200161275a9291906140ec565b6040516020818303038152906040525b915050919050565b61277c8383612b0b565b6127896000848484612509565b6127c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bf90614361565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612842838383612cd9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128855761288081612cde565b6128c4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128c3576128c28382612d27565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129075761290281612e94565b612946565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612945576129448282612fd7565b5b5b505050565b600080823b905060008111915050919050565b606060008214156129a6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b06565b600082905060005b600082146129d85780806129c1906148ea565b915050600a826129d19190614786565b91506129ae565b60008167ffffffffffffffff811115612a1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a4c5781602001600182028036833780820191505090505b5090505b60008514612aff57600182612a6591906147b7565b9150600a85612a749190614961565b6030612a809190614730565b60f81b818381518110612abc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612af89190614786565b9450612a50565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b72906144e1565b60405180910390fd5b612b8481611b15565b15612bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbb906143c1565b60405180910390fd5b612bd0600083836124f9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c209190614730565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d34846110c5565b612d3e91906147b7565b9050600060076000848152602001908152602001600020549050818114612e23576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ea891906147b7565b9050600060096000848152602001908152602001600020549050600060088381548110612efe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612f46577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612fbb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612fe2836110c5565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613062906148b8565b90600052602060002090601f01602090048101928261308457600085556130cb565b82601f1061309d57805160ff19168380011785556130cb565b828001600101855582156130cb579182015b828111156130ca5782518255916020019190600101906130af565b5b5090506130d891906130dc565b5090565b5b808211156130f55760008160009055506001016130dd565b5090565b600061310c6131078461466d565b61463c565b90508281526020810184848401111561312457600080fd5b61312f848285614876565b509392505050565b600061314a6131458461469d565b61463c565b90508281526020810184848401111561316257600080fd5b61316d848285614876565b509392505050565b60008135905061318481614a6c565b92915050565b60008135905061319981614a83565b92915050565b6000813590506131ae81614a9a565b92915050565b6000813590506131c381614ab1565b92915050565b6000815190506131d881614ab1565b92915050565b600082601f8301126131ef57600080fd5b81356131ff8482602086016130f9565b91505092915050565b600082601f83011261321957600080fd5b8135613229848260208601613137565b91505092915050565b60008135905061324181614ac8565b92915050565b60008135905061325681614adf565b92915050565b60006020828403121561326e57600080fd5b600061327c84828501613175565b91505092915050565b6000806040838503121561329857600080fd5b60006132a685828601613175565b92505060206132b785828601613175565b9150509250929050565b6000806000606084860312156132d657600080fd5b60006132e486828701613175565b93505060206132f586828701613175565b925050604061330686828701613232565b9150509250925092565b6000806000806080858703121561332657600080fd5b600061333487828801613175565b945050602061334587828801613175565b935050604061335687828801613232565b925050606085013567ffffffffffffffff81111561337357600080fd5b61337f878288016131de565b91505092959194509250565b6000806040838503121561339e57600080fd5b60006133ac85828601613175565b92505060206133bd8582860161318a565b9150509250929050565b600080600080600060a086880312156133df57600080fd5b60006133ed88828901613175565b955050602086013567ffffffffffffffff81111561340a57600080fd5b613416888289016131de565b94505060406134278882890161319f565b93505060606134388882890161319f565b925050608061344988828901613247565b9150509295509295909350565b6000806040838503121561346957600080fd5b600061347785828601613175565b925050602061348885828601613232565b9150509250929050565b6000806000606084860312156134a757600080fd5b60006134b586828701613175565b93505060206134c686828701613232565b925050604084013567ffffffffffffffff8111156134e357600080fd5b6134ef86828701613208565b9150509250925092565b60006020828403121561350b57600080fd5b6000613519848285016131b4565b91505092915050565b60006020828403121561353457600080fd5b6000613542848285016131c9565b91505092915050565b60006020828403121561355d57600080fd5b600082013567ffffffffffffffff81111561357757600080fd5b61358384828501613208565b91505092915050565b60006020828403121561359e57600080fd5b60006135ac84828501613232565b91505092915050565b6135be816147eb565b82525050565b6135d56135d0826147eb565b614933565b82525050565b6135e4816147fd565b82525050565b6135f381614809565b82525050565b61360a61360582614809565b614945565b82525050565b600061361b826146e2565b61362581856146f8565b9350613635818560208601614885565b61363e81614a4e565b840191505092915050565b6000613654826146e2565b61365e8185614709565b935061366e818560208601614885565b80840191505092915050565b6000613685826146ed565b61368f8185614714565b935061369f818560208601614885565b6136a881614a4e565b840191505092915050565b60006136be826146ed565b6136c88185614725565b93506136d8818560208601614885565b80840191505092915050565b600081546136f1816148b8565b6136fb8186614725565b9450600182166000811461371657600181146137275761375a565b60ff1983168652818601935061375a565b613730856146cd565b60005b8381101561375257815481890152600182019150602081019050613733565b838801955050505b50505092915050565b6000613770602b83614714565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006137d6603283614714565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061383c602683614714565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138a2601c83614714565b91507f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006000830152602082019050919050565b60006138e2601c83614714565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613922600283614725565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000613962602483614714565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139c8601983614714565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613a08602c83614714565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a6e602583614714565b91507f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008301527f49474e45520000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ad4603883614714565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613b3a602a83614714565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ba0602983614714565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c06602e83614714565b91507f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008301527f6578697374656e7420746f6b656e0000000000000000000000000000000000006020830152604082019050919050565b6000613c6c602083614714565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613cac603183614714565b91507f45524337323155524953746f726167653a2055524920717565727920666f722060008301527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020830152604082019050919050565b6000613d12602c83614714565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613d78602083614714565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613db8602983614714565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e1e602183614714565b91507f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008301527f68000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e84602f83614714565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613eea600983614725565b91507f6d657461646174612f00000000000000000000000000000000000000000000006000830152600982019050919050565b6000613f2a602183614714565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f90603183614714565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613ff6602c83614714565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061405c600183614725565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6140988161485f565b82525050565b6140a781614869565b82525050565b60006140b98284613649565b915081905092915050565b60006140d08285613649565b91506140dc82846135c4565b6014820191508190509392505050565b60006140f882856136b3565b915061410482846136b3565b91508190509392505050565b600061411c82846136b3565b91506141278261404f565b915081905092915050565b600061413e82856136e4565b915061414a82846136e4565b915061415582613edd565b91508190509392505050565b600061416c82613915565b915061417882856135f9565b60208201915061418882846135f9565b6020820191508190509392505050565b60006020820190506141ad60008301846135b5565b92915050565b60006060820190506141c860008301866135b5565b6141d560208301856135b5565b81810360408301526141e78184613610565b9050949350505050565b600060808201905061420660008301876135b5565b61421360208301866135b5565b614220604083018561408f565b81810360608301526142328184613610565b905095945050505050565b600060208201905061425260008301846135db565b92915050565b600060208201905061426d60008301846135ea565b92915050565b600060808201905061428860008301876135ea565b614295602083018661408f565b6142a260408301856135b5565b6142af60608301846135ea565b95945050505050565b60006080820190506142cd60008301876135ea565b6142da602083018661409e565b6142e760408301856135ea565b6142f460608301846135ea565b95945050505050565b600060208201905081810360008301526143178184613610565b905092915050565b60006020820190508181036000830152614339818461367a565b905092915050565b6000602082019050818103600083015261435a81613763565b9050919050565b6000602082019050818103600083015261437a816137c9565b9050919050565b6000602082019050818103600083015261439a8161382f565b9050919050565b600060208201905081810360008301526143ba81613895565b9050919050565b600060208201905081810360008301526143da816138d5565b9050919050565b600060208201905081810360008301526143fa81613955565b9050919050565b6000602082019050818103600083015261441a816139bb565b9050919050565b6000602082019050818103600083015261443a816139fb565b9050919050565b6000602082019050818103600083015261445a81613a61565b9050919050565b6000602082019050818103600083015261447a81613ac7565b9050919050565b6000602082019050818103600083015261449a81613b2d565b9050919050565b600060208201905081810360008301526144ba81613b93565b9050919050565b600060208201905081810360008301526144da81613bf9565b9050919050565b600060208201905081810360008301526144fa81613c5f565b9050919050565b6000602082019050818103600083015261451a81613c9f565b9050919050565b6000602082019050818103600083015261453a81613d05565b9050919050565b6000602082019050818103600083015261455a81613d6b565b9050919050565b6000602082019050818103600083015261457a81613dab565b9050919050565b6000602082019050818103600083015261459a81613e11565b9050919050565b600060208201905081810360008301526145ba81613e77565b9050919050565b600060208201905081810360008301526145da81613f1d565b9050919050565b600060208201905081810360008301526145fa81613f83565b9050919050565b6000602082019050818103600083015261461a81613fe9565b9050919050565b6000602082019050614636600083018461408f565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561466357614662614a1f565b5b8060405250919050565b600067ffffffffffffffff82111561468857614687614a1f565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156146b8576146b7614a1f565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061473b8261485f565b91506147468361485f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561477b5761477a614992565b5b828201905092915050565b60006147918261485f565b915061479c8361485f565b9250826147ac576147ab6149c1565b5b828204905092915050565b60006147c28261485f565b91506147cd8361485f565b9250828210156147e0576147df614992565b5b828203905092915050565b60006147f68261483f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156148a3578082015181840152602081019050614888565b838111156148b2576000848401525b50505050565b600060028204905060018216806148d057607f821691505b602082108114156148e4576148e36149f0565b5b50919050565b60006148f58261485f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561492857614927614992565b5b600182019050919050565b600061493e8261494f565b9050919050565b6000819050919050565b600061495a82614a5f565b9050919050565b600061496c8261485f565b91506149778361485f565b925082614987576149866149c1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614a75816147eb565b8114614a8057600080fd5b50565b614a8c816147fd565b8114614a9757600080fd5b50565b614aa381614809565b8114614aae57600080fd5b50565b614aba81614813565b8114614ac557600080fd5b50565b614ad18161485f565b8114614adc57600080fd5b50565b614ae881614869565b8114614af357600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220970fb0d378e8943b229dc615ed4302bd052c46584d3abca32764d0750b67bfa464736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000058807bad0b376efc12f5ad86aac70e78ed67deae0000000000000000000000000000000000000000000000000000000000000017556e69717565476c6173736573202d20476c61737365730000000000000000000000000000000000000000000000000000000000000000000000000000000007676c617373657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f756e69717565676c617373657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007676c617373657300000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): UniqueGlasses - Glasses
Arg [1] : symbol (string): glasses
Arg [2] : _baseStorageURI (string): https://storage.googleapis.com/uniqueglasses
Arg [3] : _prefixStorageURI (string): glasses
Arg [4] : _proxyRegistryAddress (address): 0x58807baD0B376efc12F5AD86aAc70E78ed67deaE
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 00000000000000000000000058807bad0b376efc12f5ad86aac70e78ed67deae
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [6] : 556e69717565476c6173736573202d20476c6173736573000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [8] : 676c617373657300000000000000000000000000000000000000000000000000
Arg [9] : 000000000000000000000000000000000000000000000000000000000000002c
Arg [10] : 68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f75
Arg [11] : 6e69717565676c61737365730000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [13] : 676c617373657300000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
57305:2949:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59423:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21267:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22727:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22264:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55080:1142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52304:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34647:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53314:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23617:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56648:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34315:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53423:161;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23993:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34837:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58113:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20961:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58532:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20691:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58423:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43727:148;;;;;;;;;;;;;:::i;:::-;;43076:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21436:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23020:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58264:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24215:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59073:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59944:307;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44030:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58802:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59423:212;59562:4;59591:36;59615:11;59591:23;:36::i;:::-;59584:43;;59423:212;;;:::o;21267:100::-;21321:13;21354:5;21347:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21267:100;:::o;22727:221::-;22803:7;22831:16;22839:7;22831;:16::i;:::-;22823:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22916:15;:24;22932:7;22916:24;;;;;;;;;;;;;;;;;;;;;22909:31;;22727:221;;;:::o;22264:397::-;22345:13;22361:23;22376:7;22361:14;:23::i;:::-;22345:39;;22409:5;22403:11;;:2;:11;;;;22395:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22489:5;22473:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22498:37;22515:5;22522:12;:10;:12::i;:::-;22498:16;:37::i;:::-;22473:62;22465:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22632:21;22641:2;22645:7;22632:8;:21::i;:::-;22264:397;;;:::o;55080:1142::-;55281:12;55306:29;55338:152;;;;;;;;55376:6;:19;55383:11;55376:19;;;;;;;;;;;;;;;;55338:152;;;;55416:11;55338:152;;;;;;55461:17;55338:152;;;55306:184;;55525:45;55532:11;55545:6;55553:4;55559;55565;55525:6;:45::i;:::-;55503:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;55720:26;55744:1;55720:6;:19;55727:11;55720:19;;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;55698:6;:19;55705:11;55698:19;;;;;;;;;;;;;;;:48;;;;55764:117;55802:11;55828:10;55853:17;55764:117;;;;;;;;:::i;:::-;;;;;;;;55992:12;56006:23;56041:4;56033:18;;56083:17;56102:11;56066:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56033:92;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55991:134;;;;56144:7;56136:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;56204:10;56197:17;;;;;55080:1142;;;;;;;:::o;52304:43::-;;;;;;;;;;;;;;;;;;;:::o;34647:113::-;34708:7;34735:10;:17;;;;34728:24;;34647:113;:::o;53314:101::-;53365:7;53392:15;;53385:22;;53314:101;:::o;23617:305::-;23778:41;23797:12;:10;:12::i;:::-;23811:7;23778:18;:41::i;:::-;23770:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23886:28;23896:4;23902:2;23906:7;23886:9;:28::i;:::-;23617:305;;;:::o;56648:107::-;56701:13;56735:6;:12;56742:4;56735:12;;;;;;;;;;;;;;;;56727:20;;56648:107;;;:::o;34315:256::-;34412:7;34448:23;34465:5;34448:16;:23::i;:::-;34440:5;:31;34432:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34537:12;:19;34550:5;34537:19;;;;;;;;;;;;;;;:26;34557:5;34537:26;;;;;;;;;;;;34530:33;;34315:256;;;;:::o;53423:161::-;53466:7;53486:10;53537:9;53531:15;;53574:2;53567:9;;;53423:161;:::o;23993:151::-;24097:39;24114:4;24120:2;24124:7;24097:39;;;;;;;;;;;;:16;:39::i;:::-;23993:151;;;:::o;34837:233::-;34912:7;34948:30;:28;:30::i;:::-;34940:5;:38;34932:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35045:10;35056:5;35045:17;;;;;;;;;;;;;;;;;;;;;;;;35038:24;;34837:233;;;:::o;58113:143::-;43307:12;:10;:12::i;:::-;43296:23;;:7;:5;:7::i;:::-;:23;;;43288:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58226:15:::1;58209:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;58192:7;:56;;;;;;;;;;;;:::i;:::-;;58113:143:::0;:::o;20961:239::-;21033:7;21053:13;21069:7;:16;21077:7;21069:16;;;;;;;;;;;;;;;;;;;;;21053:32;;21121:1;21104:19;;:5;:19;;;;21096:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21187:5;21180:12;;;20961:239;;;:::o;58532:104::-;58587:13;43307:12;:10;:12::i;:::-;43296:23;;:7;:5;:7::i;:::-;:23;;;43288:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58619:9:::1;58612:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58532:104:::0;:::o;20691:208::-;20763:7;20808:1;20791:19;;:5;:19;;;;20783:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20875:9;:16;20885:5;20875:16;;;;;;;;;;;;;;;;20868:23;;20691:208;;;:::o;58423:101::-;58476:13;43307:12;:10;:12::i;:::-;43296:23;;:7;:5;:7::i;:::-;:23;;;43288:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58509:7:::1;58502:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58423:101:::0;:::o;43727:148::-;43307:12;:10;:12::i;:::-;43296:23;;:7;:5;:7::i;:::-;:23;;;43288:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43834:1:::1;43797:40;;43818:6;;;;;;;;;;;43797:40;;;;;;;;;;;;43865:1;43848:6;;:19;;;;;;;;;;;;;;;;;;43727:148::o:0;43076:87::-;43122:7;43149:6;;;;;;;;;;;43142:13;;43076:87;:::o;21436:104::-;21492:13;21525:7;21518:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21436:104;:::o;23020:295::-;23135:12;:10;:12::i;:::-;23123:24;;:8;:24;;;;23115:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23235:8;23190:18;:32;23209:12;:10;:12::i;:::-;23190:32;;;;;;;;;;;;;;;:42;23223:8;23190:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23288:8;23259:48;;23274:12;:10;:12::i;:::-;23259:48;;;23298:8;23259:48;;;;;;:::i;:::-;;;;;;;;23020:295;;:::o;58264:151::-;43307:12;:10;:12::i;:::-;43296:23;;:7;:5;:7::i;:::-;:23;;;43288:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58383:17:::1;58366:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;58347:9;:60;;;;;;;;;;;;:::i;:::-;;58264:151:::0;:::o;24215:285::-;24347:41;24366:12;:10;:12::i;:::-;24380:7;24347:18;:41::i;:::-;24339:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24453:39;24467:4;24473:2;24477:7;24486:5;24453:13;:39::i;:::-;24215:285;;;;:::o;59073:196::-;59200:13;59238:23;59253:7;59238:14;:23::i;:::-;59231:30;;59073:196;;;:::o;59944:307::-;60060:15;60113:20;;;;;;;;;;;60092:42;;:9;:42;;;60088:86;;;60158:4;60151:11;;;;60088:86;60201:42;60225:6;60233:9;60201:23;:42::i;:::-;60194:49;;59944:307;;;;;:::o;44030:244::-;43307:12;:10;:12::i;:::-;43296:23;;:7;:5;:7::i;:::-;:23;;;43288:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44139:1:::1;44119:22;;:8;:22;;;;44111:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44229:8;44200:38;;44221:6;;;;;;;;;;;44200:38;;;;;;;;;;;;44258:8;44249:6;;:17;;;;;;;;;;;;;;;;;;44030:244:::0;:::o;58802:263::-;58939:7;43307:12;:10;:12::i;:::-;43296:23;;:7;:5;:7::i;:::-;:23;;;43288:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58959:28:::1;58969:8;58979:7;58959:9;:28::i;:::-;58998:32;59011:7;59020:9;58998:12;:32::i;:::-;59050:7;59043:14;;58802:263:::0;;;;;:::o;44461:601::-;44505:14;44558:4;44536:27;;:10;:27;;;44532:499;;;44580:18;44601:8;;44580:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44624:13;44640:8;;:15;;44624:31;;44892:42;44862:5;44855;44851:17;44845:24;44819:134;44809:144;;44679:289;;;;;45009:10;45000:19;;44532:499;44461:601;:::o;33994:237::-;34096:4;34135:35;34120:50;;;:11;:50;;;;:103;;;;34187:36;34211:11;34187:23;:36::i;:::-;34120:103;34113:110;;33994:237;;;:::o;25967:127::-;26032:4;26084:1;26056:30;;:7;:16;26064:7;26056:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26049:37;;25967:127;;;:::o;57944:161::-;58034:14;58073:24;:22;:24::i;:::-;58066:31;;57944:161;:::o;29844:174::-;29946:2;29919:15;:24;29935:7;29919:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30002:7;29998:2;29964:46;;29973:23;29988:7;29973:14;:23::i;:::-;29964:46;;;;;;;;;;;;29844:174;;:::o;56763:486::-;56941:4;56984:1;56966:20;;:6;:20;;;;56958:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;57082:159;57110:47;57129:27;57149:6;57129:19;:27::i;:::-;57110:18;:47::i;:::-;57176:4;57199;57222;57082:159;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57059:182;;:6;:182;;;57039:202;;56763:486;;;;;;;:::o;47670:98::-;47728:7;47759:1;47755;:5;;;;:::i;:::-;47748:12;;47670:98;;;;:::o;26261:348::-;26354:4;26379:16;26387:7;26379;:16::i;:::-;26371:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26455:13;26471:23;26486:7;26471:14;:23::i;:::-;26455:39;;26524:5;26513:16;;:7;:16;;;:51;;;;26557:7;26533:31;;:20;26545:7;26533:11;:20::i;:::-;:31;;;26513:51;:87;;;;26568:32;26585:5;26592:7;26568:16;:32::i;:::-;26513:87;26505:96;;;26261:348;;;;:::o;29182:544::-;29307:4;29280:31;;:23;29295:7;29280:14;:23::i;:::-;:31;;;29272:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29390:1;29376:16;;:2;:16;;;;29368:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29446:39;29467:4;29473:2;29477:7;29446:20;:39::i;:::-;29550:29;29567:1;29571:7;29550:8;:29::i;:::-;29611:1;29592:9;:15;29602:4;29592:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29640:1;29623:9;:13;29633:2;29623:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29671:2;29652:7;:16;29660:7;29652:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29710:7;29706:2;29691:27;;29700:4;29691:27;;;;;;;;;;;;29182:544;;;:::o;25382:272::-;25496:28;25506:4;25512:2;25516:7;25496:9;:28::i;:::-;25543:48;25566:4;25572:2;25576:7;25585:5;25543:22;:48::i;:::-;25535:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25382:272;;;;:::o;40519:679::-;40592:13;40626:16;40634:7;40626;:16::i;:::-;40618:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;40709:23;40735:10;:19;40746:7;40735:19;;;;;;;;;;;40709:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40765:18;40786:10;:8;:10::i;:::-;40765:31;;40894:1;40878:4;40872:18;:23;40868:72;;;40919:9;40912:16;;;;;;40868:72;41070:1;41050:9;41044:23;:27;41040:108;;;41119:4;41125:9;41102:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41088:48;;;;;;41040:108;41167:23;41182:7;41167:14;:23::i;:::-;41160:30;;;;40519:679;;;;:::o;23386:164::-;23483:4;23507:18;:25;23526:5;23507:25;;;;;;;;;;;;;;;:35;23533:8;23507:35;;;;;;;;;;;;;;;;;;;;;;;;;23500:42;;23386:164;;;;:::o;26951:110::-;27027:26;27037:2;27041:7;27027:26;;;;;;;;;;;;:9;:26::i;:::-;26951:110;;:::o;41354:217::-;41454:16;41462:7;41454;:16::i;:::-;41446:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;41554:9;41532:10;:19;41543:7;41532:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;41354:217;;:::o;20335:292::-;20437:4;20476:25;20461:40;;;:11;:40;;;;:105;;;;20533:33;20518:48;;;:11;:48;;;;20461:105;:158;;;;20583:36;20607:11;20583:23;:36::i;:::-;20461:158;20454:165;;20335:292;;;:::o;56230:410::-;56340:7;54424:100;;;;;;;;;;;;;;;;;54404:127;;;;;;56494:6;:12;;;56529:6;:11;;;56573:6;:24;;;56563:35;;;;;;56413:204;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56385:247;;;;;;56365:267;;56230:410;;;:::o;53953:258::-;54052:7;54154:20;:18;:20::i;:::-;54176:11;54125:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54097:106;;;;;;54077:126;;53953:258;;;:::o;59643:215::-;59805:45;59832:4;59838:2;59842:7;59805:26;:45::i;:::-;59643:215;;;:::o;30583:843::-;30704:4;30730:15;:2;:13;;;:15::i;:::-;30726:693;;;30782:2;30766:36;;;30803:12;:10;:12::i;:::-;30817:4;30823:7;30832:5;30766:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30762:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31029:1;31012:6;:13;:18;31008:341;;;31055:60;;;;;;;;;;:::i;:::-;;;;;;;;31008:341;31299:6;31293:13;31284:6;31280:2;31276:15;31269:38;30762:602;30899:45;;;30889:55;;;:6;:55;;;;30882:62;;;;;30726:693;31403:4;31396:11;;30583:843;;;;;;;:::o;58644:150::-;58696:13;58753:7;58762:9;58736:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58722:64;;58644:150;:::o;21611:360::-;21684:13;21718:16;21726:7;21718;:16::i;:::-;21710:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21799:21;21823:10;:8;:10::i;:::-;21799:34;;21875:1;21857:7;21851:21;:25;:112;;;;;;;;;;;;;;;;;21916:7;21925:18;:7;:16;:18::i;:::-;21899:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21851:112;21844:119;;;21611:360;;;:::o;27288:250::-;27384:18;27390:2;27394:7;27384:5;:18::i;:::-;27421:54;27452:1;27456:2;27460:7;27469:5;27421:22;:54::i;:::-;27413:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27288:250;;;:::o;18876:157::-;18961:4;19000:25;18985:40;;;:11;:40;;;;18978:47;;18876:157;;;:::o;35683:555::-;35793:45;35820:4;35826:2;35830:7;35793:26;:45::i;:::-;35871:1;35855:18;;:4;:18;;;35851:187;;;35890:40;35922:7;35890:31;:40::i;:::-;35851:187;;;35960:2;35952:10;;:4;:10;;;35948:90;;35979:47;36012:4;36018:7;35979:32;:47::i;:::-;35948:90;35851:187;36066:1;36052:16;;:2;:16;;;36048:183;;;36085:45;36122:7;36085:36;:45::i;:::-;36048:183;;;36158:4;36152:10;;:2;:10;;;36148:83;;36179:40;36207:2;36211:7;36179:27;:40::i;:::-;36148:83;36048:183;35683:555;;;:::o;7876:422::-;7936:4;8144:12;8255:7;8243:20;8235:28;;8289:1;8282:4;:8;8275:15;;;7876:422;;;:::o;16352:723::-;16408:13;16638:1;16629:5;:10;16625:53;;;16656:10;;;;;;;;;;;;;;;;;;;;;16625:53;16688:12;16703:5;16688:20;;16719:14;16744:78;16759:1;16751:4;:9;16744:78;;16777:8;;;;;:::i;:::-;;;;16808:2;16800:10;;;;;:::i;:::-;;;16744:78;;;16832:19;16864:6;16854:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16832:39;;16882:154;16898:1;16889:5;:10;16882:154;;16926:1;16916:11;;;;;:::i;:::-;;;16993:2;16985:5;:10;;;;:::i;:::-;16972:2;:24;;;;:::i;:::-;16959:39;;16942:6;16949;16942:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17022:2;17013:11;;;;;:::i;:::-;;;16882:154;;;17060:6;17046:21;;;;;16352:723;;;;:::o;27874:382::-;27968:1;27954:16;;:2;:16;;;;27946:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28027:16;28035:7;28027;:16::i;:::-;28026:17;28018:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28089:45;28118:1;28122:2;28126:7;28089:20;:45::i;:::-;28164:1;28147:9;:13;28157:2;28147:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28195:2;28176:7;:16;28184:7;28176:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28240:7;28236:2;28215:33;;28232:1;28215:33;;;;;;;;;;;;27874:382;;:::o;32039:93::-;;;;:::o;36961:164::-;37065:10;:17;;;;37038:15;:24;37054:7;37038:24;;;;;;;;;;;:44;;;;37093:10;37109:7;37093:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36961:164;:::o;37752:988::-;38018:22;38068:1;38043:22;38060:4;38043:16;:22::i;:::-;:26;;;;:::i;:::-;38018:51;;38080:18;38101:17;:26;38119:7;38101:26;;;;;;;;;;;;38080:47;;38248:14;38234:10;:28;38230:328;;38279:19;38301:12;:18;38314:4;38301:18;;;;;;;;;;;;;;;:34;38320:14;38301:34;;;;;;;;;;;;38279:56;;38385:11;38352:12;:18;38365:4;38352:18;;;;;;;;;;;;;;;:30;38371:10;38352:30;;;;;;;;;;;:44;;;;38502:10;38469:17;:30;38487:11;38469:30;;;;;;;;;;;:43;;;;38230:328;;38654:17;:26;38672:7;38654:26;;;;;;;;;;;38647:33;;;38698:12;:18;38711:4;38698:18;;;;;;;;;;;;;;;:34;38717:14;38698:34;;;;;;;;;;;38691:41;;;37752:988;;;;:::o;39035:1079::-;39288:22;39333:1;39313:10;:17;;;;:21;;;;:::i;:::-;39288:46;;39345:18;39366:15;:24;39382:7;39366:24;;;;;;;;;;;;39345:45;;39717:19;39739:10;39750:14;39739:26;;;;;;;;;;;;;;;;;;;;;;;;39717:48;;39803:11;39778:10;39789;39778:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;39914:10;39883:15;:28;39899:11;39883:28;;;;;;;;;;;:41;;;;40055:15;:24;40071:7;40055:24;;;;;;;;;;;40048:31;;;40090:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39035:1079;;;;:::o;36539:221::-;36624:14;36641:20;36658:2;36641:16;:20::i;:::-;36624:37;;36699:7;36672:12;:16;36685:2;36672:16;;;;;;;;;;;;;;;:24;36689:6;36672:24;;;;;;;;;;;:34;;;;36746:6;36717:17;:26;36735:7;36717:26;;;;;;;;;;;:35;;;;36539:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:139::-;;1073:6;1060:20;1051:29;;1089:33;1116:5;1089:33;:::i;:::-;1041:87;;;;:::o;1134:137::-;;1217:6;1204:20;1195:29;;1233:32;1259:5;1233:32;:::i;:::-;1185:86;;;;:::o;1277:141::-;;1364:6;1358:13;1349:22;;1380:32;1406:5;1380:32;:::i;:::-;1339:79;;;;:::o;1437:271::-;;1541:3;1534:4;1526:6;1522:17;1518:27;1508:2;;1559:1;1556;1549:12;1508:2;1599:6;1586:20;1624:78;1698:3;1690:6;1683:4;1675:6;1671:17;1624:78;:::i;:::-;1615:87;;1498:210;;;;;:::o;1728:273::-;;1833:3;1826:4;1818:6;1814:17;1810:27;1800:2;;1851:1;1848;1841:12;1800:2;1891:6;1878:20;1916:79;1991:3;1983:6;1976:4;1968:6;1964:17;1916:79;:::i;:::-;1907:88;;1790:211;;;;;:::o;2007:139::-;;2091:6;2078:20;2069:29;;2107:33;2134:5;2107:33;:::i;:::-;2059:87;;;;:::o;2152:135::-;;2234:6;2221:20;2212:29;;2250:31;2275:5;2250:31;:::i;:::-;2202:85;;;;:::o;2293:262::-;;2401:2;2389:9;2380:7;2376:23;2372:32;2369:2;;;2417:1;2414;2407:12;2369:2;2460:1;2485:53;2530:7;2521:6;2510:9;2506:22;2485:53;:::i;:::-;2475:63;;2431:117;2359:196;;;;:::o;2561:407::-;;;2686:2;2674:9;2665:7;2661:23;2657:32;2654:2;;;2702:1;2699;2692:12;2654:2;2745:1;2770:53;2815:7;2806:6;2795:9;2791:22;2770:53;:::i;:::-;2760:63;;2716:117;2872:2;2898:53;2943:7;2934:6;2923:9;2919:22;2898:53;:::i;:::-;2888:63;;2843:118;2644:324;;;;;:::o;2974:552::-;;;;3116:2;3104:9;3095:7;3091:23;3087:32;3084:2;;;3132:1;3129;3122:12;3084:2;3175:1;3200:53;3245:7;3236:6;3225:9;3221:22;3200:53;:::i;:::-;3190:63;;3146:117;3302:2;3328:53;3373:7;3364:6;3353:9;3349:22;3328:53;:::i;:::-;3318:63;;3273:118;3430:2;3456:53;3501:7;3492:6;3481:9;3477:22;3456:53;:::i;:::-;3446:63;;3401:118;3074:452;;;;;:::o;3532:809::-;;;;;3700:3;3688:9;3679:7;3675:23;3671:33;3668:2;;;3717:1;3714;3707:12;3668:2;3760:1;3785:53;3830:7;3821:6;3810:9;3806:22;3785:53;:::i;:::-;3775:63;;3731:117;3887:2;3913:53;3958:7;3949:6;3938:9;3934:22;3913:53;:::i;:::-;3903:63;;3858:118;4015:2;4041:53;4086:7;4077:6;4066:9;4062:22;4041:53;:::i;:::-;4031:63;;3986:118;4171:2;4160:9;4156:18;4143:32;4202:18;4194:6;4191:30;4188:2;;;4234:1;4231;4224:12;4188:2;4262:62;4316:7;4307:6;4296:9;4292:22;4262:62;:::i;:::-;4252:72;;4114:220;3658:683;;;;;;;:::o;4347:401::-;;;4469:2;4457:9;4448:7;4444:23;4440:32;4437:2;;;4485:1;4482;4475:12;4437:2;4528:1;4553:53;4598:7;4589:6;4578:9;4574:22;4553:53;:::i;:::-;4543:63;;4499:117;4655:2;4681:50;4723:7;4714:6;4703:9;4699:22;4681:50;:::i;:::-;4671:60;;4626:115;4427:321;;;;;:::o;4754:951::-;;;;;;4937:3;4925:9;4916:7;4912:23;4908:33;4905:2;;;4954:1;4951;4944:12;4905:2;4997:1;5022:53;5067:7;5058:6;5047:9;5043:22;5022:53;:::i;:::-;5012:63;;4968:117;5152:2;5141:9;5137:18;5124:32;5183:18;5175:6;5172:30;5169:2;;;5215:1;5212;5205:12;5169:2;5243:62;5297:7;5288:6;5277:9;5273:22;5243:62;:::i;:::-;5233:72;;5095:220;5354:2;5380:53;5425:7;5416:6;5405:9;5401:22;5380:53;:::i;:::-;5370:63;;5325:118;5482:2;5508:53;5553:7;5544:6;5533:9;5529:22;5508:53;:::i;:::-;5498:63;;5453:118;5610:3;5637:51;5680:7;5671:6;5660:9;5656:22;5637:51;:::i;:::-;5627:61;;5581:117;4895:810;;;;;;;;:::o;5711:407::-;;;5836:2;5824:9;5815:7;5811:23;5807:32;5804:2;;;5852:1;5849;5842:12;5804:2;5895:1;5920:53;5965:7;5956:6;5945:9;5941:22;5920:53;:::i;:::-;5910:63;;5866:117;6022:2;6048:53;6093:7;6084:6;6073:9;6069:22;6048:53;:::i;:::-;6038:63;;5993:118;5794:324;;;;;:::o;6124:665::-;;;;6276:2;6264:9;6255:7;6251:23;6247:32;6244:2;;;6292:1;6289;6282:12;6244:2;6335:1;6360:53;6405:7;6396:6;6385:9;6381:22;6360:53;:::i;:::-;6350:63;;6306:117;6462:2;6488:53;6533:7;6524:6;6513:9;6509:22;6488:53;:::i;:::-;6478:63;;6433:118;6618:2;6607:9;6603:18;6590:32;6649:18;6641:6;6638:30;6635:2;;;6681:1;6678;6671:12;6635:2;6709:63;6764:7;6755:6;6744:9;6740:22;6709:63;:::i;:::-;6699:73;;6561:221;6234:555;;;;;:::o;6795:260::-;;6902:2;6890:9;6881:7;6877:23;6873:32;6870:2;;;6918:1;6915;6908:12;6870:2;6961:1;6986:52;7030:7;7021:6;7010:9;7006:22;6986:52;:::i;:::-;6976:62;;6932:116;6860:195;;;;:::o;7061:282::-;;7179:2;7167:9;7158:7;7154:23;7150:32;7147:2;;;7195:1;7192;7185:12;7147:2;7238:1;7263:63;7318:7;7309:6;7298:9;7294:22;7263:63;:::i;:::-;7253:73;;7209:127;7137:206;;;;:::o;7349:375::-;;7467:2;7455:9;7446:7;7442:23;7438:32;7435:2;;;7483:1;7480;7473:12;7435:2;7554:1;7543:9;7539:17;7526:31;7584:18;7576:6;7573:30;7570:2;;;7616:1;7613;7606:12;7570:2;7644:63;7699:7;7690:6;7679:9;7675:22;7644:63;:::i;:::-;7634:73;;7497:220;7425:299;;;;:::o;7730:262::-;;7838:2;7826:9;7817:7;7813:23;7809:32;7806:2;;;7854:1;7851;7844:12;7806:2;7897:1;7922:53;7967:7;7958:6;7947:9;7943:22;7922:53;:::i;:::-;7912:63;;7868:117;7796:196;;;;:::o;7998:118::-;8085:24;8103:5;8085:24;:::i;:::-;8080:3;8073:37;8063:53;;:::o;8122:157::-;8227:45;8247:24;8265:5;8247:24;:::i;:::-;8227:45;:::i;:::-;8222:3;8215:58;8205:74;;:::o;8285:109::-;8366:21;8381:5;8366:21;:::i;:::-;8361:3;8354:34;8344:50;;:::o;8400:118::-;8487:24;8505:5;8487:24;:::i;:::-;8482:3;8475:37;8465:53;;:::o;8524:157::-;8629:45;8649:24;8667:5;8649:24;:::i;:::-;8629:45;:::i;:::-;8624:3;8617:58;8607:74;;:::o;8687:360::-;;8801:38;8833:5;8801:38;:::i;:::-;8855:70;8918:6;8913:3;8855:70;:::i;:::-;8848:77;;8934:52;8979:6;8974:3;8967:4;8960:5;8956:16;8934:52;:::i;:::-;9011:29;9033:6;9011:29;:::i;:::-;9006:3;9002:39;8995:46;;8777:270;;;;;:::o;9053:373::-;;9185:38;9217:5;9185:38;:::i;:::-;9239:88;9320:6;9315:3;9239:88;:::i;:::-;9232:95;;9336:52;9381:6;9376:3;9369:4;9362:5;9358:16;9336:52;:::i;:::-;9413:6;9408:3;9404:16;9397:23;;9161:265;;;;;:::o;9432:364::-;;9548:39;9581:5;9548:39;:::i;:::-;9603:71;9667:6;9662:3;9603:71;:::i;:::-;9596:78;;9683:52;9728:6;9723:3;9716:4;9709:5;9705:16;9683:52;:::i;:::-;9760:29;9782:6;9760:29;:::i;:::-;9755:3;9751:39;9744:46;;9524:272;;;;;:::o;9802:377::-;;9936:39;9969:5;9936:39;:::i;:::-;9991:89;10073:6;10068:3;9991:89;:::i;:::-;9984:96;;10089:52;10134:6;10129:3;10122:4;10115:5;10111:16;10089:52;:::i;:::-;10166:6;10161:3;10157:16;10150:23;;9912:267;;;;;:::o;10209:845::-;;10349:5;10343:12;10378:36;10404:9;10378:36;:::i;:::-;10430:89;10512:6;10507:3;10430:89;:::i;:::-;10423:96;;10550:1;10539:9;10535:17;10566:1;10561:137;;;;10712:1;10707:341;;;;10528:520;;10561:137;10645:4;10641:9;10630;10626:25;10621:3;10614:38;10681:6;10676:3;10672:16;10665:23;;10561:137;;10707:341;10774:38;10806:5;10774:38;:::i;:::-;10834:1;10848:154;10862:6;10859:1;10856:13;10848:154;;;10936:7;10930:14;10926:1;10921:3;10917:11;10910:35;10986:1;10977:7;10973:15;10962:26;;10884:4;10881:1;10877:12;10872:17;;10848:154;;;11031:6;11026:3;11022:16;11015:23;;10714:334;;10528:520;;10316:738;;;;;;:::o;11060:375::-;;11223:67;11287:2;11282:3;11223:67;:::i;:::-;11216:74;;11320:34;11316:1;11311:3;11307:11;11300:55;11386:13;11381:2;11376:3;11372:12;11365:35;11426:2;11421:3;11417:12;11410:19;;11206:229;;;:::o;11441:382::-;;11604:67;11668:2;11663:3;11604:67;:::i;:::-;11597:74;;11701:34;11697:1;11692:3;11688:11;11681:55;11767:20;11762:2;11757:3;11753:12;11746:42;11814:2;11809:3;11805:12;11798:19;;11587:236;;;:::o;11829:370::-;;11992:67;12056:2;12051:3;11992:67;:::i;:::-;11985:74;;12089:34;12085:1;12080:3;12076:11;12069:55;12155:8;12150:2;12145:3;12141:12;12134:30;12190:2;12185:3;12181:12;12174:19;;11975:224;;;:::o;12205:326::-;;12368:67;12432:2;12427:3;12368:67;:::i;:::-;12361:74;;12465:30;12461:1;12456:3;12452:11;12445:51;12522:2;12517:3;12513:12;12506:19;;12351:180;;;:::o;12537:326::-;;12700:67;12764:2;12759:3;12700:67;:::i;:::-;12693:74;;12797:30;12793:1;12788:3;12784:11;12777:51;12854:2;12849:3;12845:12;12838:19;;12683:180;;;:::o;12869:396::-;;13050:84;13132:1;13127:3;13050:84;:::i;:::-;13043:91;;13164:66;13160:1;13155:3;13151:11;13144:87;13257:1;13252:3;13248:11;13241:18;;13033:232;;;:::o;13271:368::-;;13434:67;13498:2;13493:3;13434:67;:::i;:::-;13427:74;;13531:34;13527:1;13522:3;13518:11;13511:55;13597:6;13592:2;13587:3;13583:12;13576:28;13630:2;13625:3;13621:12;13614:19;;13417:222;;;:::o;13645:323::-;;13808:67;13872:2;13867:3;13808:67;:::i;:::-;13801:74;;13905:27;13901:1;13896:3;13892:11;13885:48;13959:2;13954:3;13950:12;13943:19;;13791:177;;;:::o;13974:376::-;;14137:67;14201:2;14196:3;14137:67;:::i;:::-;14130:74;;14234:34;14230:1;14225:3;14221:11;14214:55;14300:14;14295:2;14290:3;14286:12;14279:36;14341:2;14336:3;14332:12;14325:19;;14120:230;;;:::o;14356:369::-;;14519:67;14583:2;14578:3;14519:67;:::i;:::-;14512:74;;14616:34;14612:1;14607:3;14603:11;14596:55;14682:7;14677:2;14672:3;14668:12;14661:29;14716:2;14711:3;14707:12;14700:19;;14502:223;;;:::o;14731:388::-;;14894:67;14958:2;14953:3;14894:67;:::i;:::-;14887:74;;14991:34;14987:1;14982:3;14978:11;14971:55;15057:26;15052:2;15047:3;15043:12;15036:48;15110:2;15105:3;15101:12;15094:19;;14877:242;;;:::o;15125:374::-;;15288:67;15352:2;15347:3;15288:67;:::i;:::-;15281:74;;15385:34;15381:1;15376:3;15372:11;15365:55;15451:12;15446:2;15441:3;15437:12;15430:34;15490:2;15485:3;15481:12;15474:19;;15271:228;;;:::o;15505:373::-;;15668:67;15732:2;15727:3;15668:67;:::i;:::-;15661:74;;15765:34;15761:1;15756:3;15752:11;15745:55;15831:11;15826:2;15821:3;15817:12;15810:33;15869:2;15864:3;15860:12;15853:19;;15651:227;;;:::o;15884:378::-;;16047:67;16111:2;16106:3;16047:67;:::i;:::-;16040:74;;16144:34;16140:1;16135:3;16131:11;16124:55;16210:16;16205:2;16200:3;16196:12;16189:38;16253:2;16248:3;16244:12;16237:19;;16030:232;;;:::o;16268:330::-;;16431:67;16495:2;16490:3;16431:67;:::i;:::-;16424:74;;16528:34;16524:1;16519:3;16515:11;16508:55;16589:2;16584:3;16580:12;16573:19;;16414:184;;;:::o;16604:381::-;;16767:67;16831:2;16826:3;16767:67;:::i;:::-;16760:74;;16864:34;16860:1;16855:3;16851:11;16844:55;16930:19;16925:2;16920:3;16916:12;16909:41;16976:2;16971:3;16967:12;16960:19;;16750:235;;;:::o;16991:376::-;;17154:67;17218:2;17213:3;17154:67;:::i;:::-;17147:74;;17251:34;17247:1;17242:3;17238:11;17231:55;17317:14;17312:2;17307:3;17303:12;17296:36;17358:2;17353:3;17349:12;17342:19;;17137:230;;;:::o;17373:330::-;;17536:67;17600:2;17595:3;17536:67;:::i;:::-;17529:74;;17633:34;17629:1;17624:3;17620:11;17613:55;17694:2;17689:3;17685:12;17678:19;;17519:184;;;:::o;17709:373::-;;17872:67;17936:2;17931:3;17872:67;:::i;:::-;17865:74;;17969:34;17965:1;17960:3;17956:11;17949:55;18035:11;18030:2;18025:3;18021:12;18014:33;18073:2;18068:3;18064:12;18057:19;;17855:227;;;:::o;18088:365::-;;18251:67;18315:2;18310:3;18251:67;:::i;:::-;18244:74;;18348:34;18344:1;18339:3;18335:11;18328:55;18414:3;18409:2;18404:3;18400:12;18393:25;18444:2;18439:3;18435:12;18428:19;;18234:219;;;:::o;18459:379::-;;18622:67;18686:2;18681:3;18622:67;:::i;:::-;18615:74;;18719:34;18715:1;18710:3;18706:11;18699:55;18785:17;18780:2;18775:3;18771:12;18764:39;18829:2;18824:3;18820:12;18813:19;;18605:233;;;:::o;18844:341::-;;19025:84;19107:1;19102:3;19025:84;:::i;:::-;19018:91;;19139:11;19135:1;19130:3;19126:11;19119:32;19177:1;19172:3;19168:11;19161:18;;19008:177;;;:::o;19191:365::-;;19354:67;19418:2;19413:3;19354:67;:::i;:::-;19347:74;;19451:34;19447:1;19442:3;19438:11;19431:55;19517:3;19512:2;19507:3;19503:12;19496:25;19547:2;19542:3;19538:12;19531:19;;19337:219;;;:::o;19562:381::-;;19725:67;19789:2;19784:3;19725:67;:::i;:::-;19718:74;;19822:34;19818:1;19813:3;19809:11;19802:55;19888:19;19883:2;19878:3;19874:12;19867:41;19934:2;19929:3;19925:12;19918:19;;19708:235;;;:::o;19949:376::-;;20112:67;20176:2;20171:3;20112:67;:::i;:::-;20105:74;;20209:34;20205:1;20200:3;20196:11;20189:55;20275:14;20270:2;20265:3;20261:12;20254:36;20316:2;20311:3;20307:12;20300:19;;20095:230;;;:::o;20331:333::-;;20512:84;20594:1;20589:3;20512:84;:::i;:::-;20505:91;;20626:3;20622:1;20617:3;20613:11;20606:24;20656:1;20651:3;20647:11;20640:18;;20495:169;;;:::o;20670:118::-;20757:24;20775:5;20757:24;:::i;:::-;20752:3;20745:37;20735:53;;:::o;20794:112::-;20877:22;20893:5;20877:22;:::i;:::-;20872:3;20865:35;20855:51;;:::o;20912:271::-;;21064:93;21153:3;21144:6;21064:93;:::i;:::-;21057:100;;21174:3;21167:10;;21046:137;;;;:::o;21189:412::-;;21369:93;21458:3;21449:6;21369:93;:::i;:::-;21362:100;;21472:75;21543:3;21534:6;21472:75;:::i;:::-;21572:2;21567:3;21563:12;21556:19;;21592:3;21585:10;;21351:250;;;;;:::o;21607:435::-;;21809:95;21900:3;21891:6;21809:95;:::i;:::-;21802:102;;21921:95;22012:3;22003:6;21921:95;:::i;:::-;21914:102;;22033:3;22026:10;;21791:251;;;;;:::o;22048:541::-;;22303:95;22394:3;22385:6;22303:95;:::i;:::-;22296:102;;22415:148;22559:3;22415:148;:::i;:::-;22408:155;;22580:3;22573:10;;22285:304;;;;:::o;22595:689::-;;22892:92;22980:3;22971:6;22892:92;:::i;:::-;22885:99;;23001:92;23089:3;23080:6;23001:92;:::i;:::-;22994:99;;23110:148;23254:3;23110:148;:::i;:::-;23103:155;;23275:3;23268:10;;22874:410;;;;;:::o;23290:663::-;;23553:148;23697:3;23553:148;:::i;:::-;23546:155;;23711:75;23782:3;23773:6;23711:75;:::i;:::-;23811:2;23806:3;23802:12;23795:19;;23824:75;23895:3;23886:6;23824:75;:::i;:::-;23924:2;23919:3;23915:12;23908:19;;23944:3;23937:10;;23535:418;;;;;:::o;23959:222::-;;24090:2;24079:9;24075:18;24067:26;;24103:71;24171:1;24160:9;24156:17;24147:6;24103:71;:::i;:::-;24057:124;;;;:::o;24187:529::-;;24392:2;24381:9;24377:18;24369:26;;24405:71;24473:1;24462:9;24458:17;24449:6;24405:71;:::i;:::-;24486:72;24554:2;24543:9;24539:18;24530:6;24486:72;:::i;:::-;24605:9;24599:4;24595:20;24590:2;24579:9;24575:18;24568:48;24633:76;24704:4;24695:6;24633:76;:::i;:::-;24625:84;;24359:357;;;;;;:::o;24722:640::-;;24955:3;24944:9;24940:19;24932:27;;24969:71;25037:1;25026:9;25022:17;25013:6;24969:71;:::i;:::-;25050:72;25118:2;25107:9;25103:18;25094:6;25050:72;:::i;:::-;25132;25200:2;25189:9;25185:18;25176:6;25132:72;:::i;:::-;25251:9;25245:4;25241:20;25236:2;25225:9;25221:18;25214:48;25279:76;25350:4;25341:6;25279:76;:::i;:::-;25271:84;;24922:440;;;;;;;:::o;25368:210::-;;25493:2;25482:9;25478:18;25470:26;;25506:65;25568:1;25557:9;25553:17;25544:6;25506:65;:::i;:::-;25460:118;;;;:::o;25584:222::-;;25715:2;25704:9;25700:18;25692:26;;25728:71;25796:1;25785:9;25781:17;25772:6;25728:71;:::i;:::-;25682:124;;;;:::o;25812:553::-;;26027:3;26016:9;26012:19;26004:27;;26041:71;26109:1;26098:9;26094:17;26085:6;26041:71;:::i;:::-;26122:72;26190:2;26179:9;26175:18;26166:6;26122:72;:::i;:::-;26204;26272:2;26261:9;26257:18;26248:6;26204:72;:::i;:::-;26286;26354:2;26343:9;26339:18;26330:6;26286:72;:::i;:::-;25994:371;;;;;;;:::o;26371:545::-;;26582:3;26571:9;26567:19;26559:27;;26596:71;26664:1;26653:9;26649:17;26640:6;26596:71;:::i;:::-;26677:68;26741:2;26730:9;26726:18;26717:6;26677:68;:::i;:::-;26755:72;26823:2;26812:9;26808:18;26799:6;26755:72;:::i;:::-;26837;26905:2;26894:9;26890:18;26881:6;26837:72;:::i;:::-;26549:367;;;;;;;:::o;26922:309::-;;27071:2;27060:9;27056:18;27048:26;;27120:9;27114:4;27110:20;27106:1;27095:9;27091:17;27084:47;27148:76;27219:4;27210:6;27148:76;:::i;:::-;27140:84;;27038:193;;;;:::o;27237:313::-;;27388:2;27377:9;27373:18;27365:26;;27437:9;27431:4;27427:20;27423:1;27412:9;27408:17;27401:47;27465:78;27538:4;27529:6;27465:78;:::i;:::-;27457:86;;27355:195;;;;:::o;27556:419::-;;27760:2;27749:9;27745:18;27737:26;;27809:9;27803:4;27799:20;27795:1;27784:9;27780:17;27773:47;27837:131;27963:4;27837:131;:::i;:::-;27829:139;;27727:248;;;:::o;27981:419::-;;28185:2;28174:9;28170:18;28162:26;;28234:9;28228:4;28224:20;28220:1;28209:9;28205:17;28198:47;28262:131;28388:4;28262:131;:::i;:::-;28254:139;;28152:248;;;:::o;28406:419::-;;28610:2;28599:9;28595:18;28587:26;;28659:9;28653:4;28649:20;28645:1;28634:9;28630:17;28623:47;28687:131;28813:4;28687:131;:::i;:::-;28679:139;;28577:248;;;:::o;28831:419::-;;29035:2;29024:9;29020:18;29012:26;;29084:9;29078:4;29074:20;29070:1;29059:9;29055:17;29048:47;29112:131;29238:4;29112:131;:::i;:::-;29104:139;;29002:248;;;:::o;29256:419::-;;29460:2;29449:9;29445:18;29437:26;;29509:9;29503:4;29499:20;29495:1;29484:9;29480:17;29473:47;29537:131;29663:4;29537:131;:::i;:::-;29529:139;;29427:248;;;:::o;29681:419::-;;29885:2;29874:9;29870:18;29862:26;;29934:9;29928:4;29924:20;29920:1;29909:9;29905:17;29898:47;29962:131;30088:4;29962:131;:::i;:::-;29954:139;;29852:248;;;:::o;30106:419::-;;30310:2;30299:9;30295:18;30287:26;;30359:9;30353:4;30349:20;30345:1;30334:9;30330:17;30323:47;30387:131;30513:4;30387:131;:::i;:::-;30379:139;;30277:248;;;:::o;30531:419::-;;30735:2;30724:9;30720:18;30712:26;;30784:9;30778:4;30774:20;30770:1;30759:9;30755:17;30748:47;30812:131;30938:4;30812:131;:::i;:::-;30804:139;;30702:248;;;:::o;30956:419::-;;31160:2;31149:9;31145:18;31137:26;;31209:9;31203:4;31199:20;31195:1;31184:9;31180:17;31173:47;31237:131;31363:4;31237:131;:::i;:::-;31229:139;;31127:248;;;:::o;31381:419::-;;31585:2;31574:9;31570:18;31562:26;;31634:9;31628:4;31624:20;31620:1;31609:9;31605:17;31598:47;31662:131;31788:4;31662:131;:::i;:::-;31654:139;;31552:248;;;:::o;31806:419::-;;32010:2;31999:9;31995:18;31987:26;;32059:9;32053:4;32049:20;32045:1;32034:9;32030:17;32023:47;32087:131;32213:4;32087:131;:::i;:::-;32079:139;;31977:248;;;:::o;32231:419::-;;32435:2;32424:9;32420:18;32412:26;;32484:9;32478:4;32474:20;32470:1;32459:9;32455:17;32448:47;32512:131;32638:4;32512:131;:::i;:::-;32504:139;;32402:248;;;:::o;32656:419::-;;32860:2;32849:9;32845:18;32837:26;;32909:9;32903:4;32899:20;32895:1;32884:9;32880:17;32873:47;32937:131;33063:4;32937:131;:::i;:::-;32929:139;;32827:248;;;:::o;33081:419::-;;33285:2;33274:9;33270:18;33262:26;;33334:9;33328:4;33324:20;33320:1;33309:9;33305:17;33298:47;33362:131;33488:4;33362:131;:::i;:::-;33354:139;;33252:248;;;:::o;33506:419::-;;33710:2;33699:9;33695:18;33687:26;;33759:9;33753:4;33749:20;33745:1;33734:9;33730:17;33723:47;33787:131;33913:4;33787:131;:::i;:::-;33779:139;;33677:248;;;:::o;33931:419::-;;34135:2;34124:9;34120:18;34112:26;;34184:9;34178:4;34174:20;34170:1;34159:9;34155:17;34148:47;34212:131;34338:4;34212:131;:::i;:::-;34204:139;;34102:248;;;:::o;34356:419::-;;34560:2;34549:9;34545:18;34537:26;;34609:9;34603:4;34599:20;34595:1;34584:9;34580:17;34573:47;34637:131;34763:4;34637:131;:::i;:::-;34629:139;;34527:248;;;:::o;34781:419::-;;34985:2;34974:9;34970:18;34962:26;;35034:9;35028:4;35024:20;35020:1;35009:9;35005:17;34998:47;35062:131;35188:4;35062:131;:::i;:::-;35054:139;;34952:248;;;:::o;35206:419::-;;35410:2;35399:9;35395:18;35387:26;;35459:9;35453:4;35449:20;35445:1;35434:9;35430:17;35423:47;35487:131;35613:4;35487:131;:::i;:::-;35479:139;;35377:248;;;:::o;35631:419::-;;35835:2;35824:9;35820:18;35812:26;;35884:9;35878:4;35874:20;35870:1;35859:9;35855:17;35848:47;35912:131;36038:4;35912:131;:::i;:::-;35904:139;;35802:248;;;:::o;36056:419::-;;36260:2;36249:9;36245:18;36237:26;;36309:9;36303:4;36299:20;36295:1;36284:9;36280:17;36273:47;36337:131;36463:4;36337:131;:::i;:::-;36329:139;;36227:248;;;:::o;36481:419::-;;36685:2;36674:9;36670:18;36662:26;;36734:9;36728:4;36724:20;36720:1;36709:9;36705:17;36698:47;36762:131;36888:4;36762:131;:::i;:::-;36754:139;;36652:248;;;:::o;36906:419::-;;37110:2;37099:9;37095:18;37087:26;;37159:9;37153:4;37149:20;37145:1;37134:9;37130:17;37123:47;37187:131;37313:4;37187:131;:::i;:::-;37179:139;;37077:248;;;:::o;37331:222::-;;37462:2;37451:9;37447:18;37439:26;;37475:71;37543:1;37532:9;37528:17;37519:6;37475:71;:::i;:::-;37429:124;;;;:::o;37559:283::-;;37625:2;37619:9;37609:19;;37667:4;37659:6;37655:17;37774:6;37762:10;37759:22;37738:18;37726:10;37723:34;37720:62;37717:2;;;37785:18;;:::i;:::-;37717:2;37825:10;37821:2;37814:22;37599:243;;;;:::o;37848:331::-;;37999:18;37991:6;37988:30;37985:2;;;38021:18;;:::i;:::-;37985:2;38106:4;38102:9;38095:4;38087:6;38083:17;38079:33;38071:41;;38167:4;38161;38157:15;38149:23;;37914:265;;;:::o;38185:332::-;;38337:18;38329:6;38326:30;38323:2;;;38359:18;;:::i;:::-;38323:2;38444:4;38440:9;38433:4;38425:6;38421:17;38417:33;38409:41;;38505:4;38499;38495:15;38487:23;;38252:265;;;:::o;38523:141::-;;38595:3;38587:11;;38618:3;38615:1;38608:14;38652:4;38649:1;38639:18;38631:26;;38577:87;;;:::o;38670:98::-;;38755:5;38749:12;38739:22;;38728:40;;;:::o;38774:99::-;;38860:5;38854:12;38844:22;;38833:40;;;:::o;38879:168::-;;38996:6;38991:3;38984:19;39036:4;39031:3;39027:14;39012:29;;38974:73;;;;:::o;39053:147::-;;39191:3;39176:18;;39166:34;;;;:::o;39206:169::-;;39324:6;39319:3;39312:19;39364:4;39359:3;39355:14;39340:29;;39302:73;;;;:::o;39381:148::-;;39520:3;39505:18;;39495:34;;;;:::o;39535:305::-;;39594:20;39612:1;39594:20;:::i;:::-;39589:25;;39628:20;39646:1;39628:20;:::i;:::-;39623:25;;39782:1;39714:66;39710:74;39707:1;39704:81;39701:2;;;39788:18;;:::i;:::-;39701:2;39832:1;39829;39825:9;39818:16;;39579:261;;;;:::o;39846:185::-;;39903:20;39921:1;39903:20;:::i;:::-;39898:25;;39937:20;39955:1;39937:20;:::i;:::-;39932:25;;39976:1;39966:2;;39981:18;;:::i;:::-;39966:2;40023:1;40020;40016:9;40011:14;;39888:143;;;;:::o;40037:191::-;;40097:20;40115:1;40097:20;:::i;:::-;40092:25;;40131:20;40149:1;40131:20;:::i;:::-;40126:25;;40170:1;40167;40164:8;40161:2;;;40175:18;;:::i;:::-;40161:2;40220:1;40217;40213:9;40205:17;;40082:146;;;;:::o;40234:96::-;;40300:24;40318:5;40300:24;:::i;:::-;40289:35;;40279:51;;;:::o;40336:90::-;;40413:5;40406:13;40399:21;40388:32;;40378:48;;;:::o;40432:77::-;;40498:5;40487:16;;40477:32;;;:::o;40515:149::-;;40591:66;40584:5;40580:78;40569:89;;40559:105;;;:::o;40670:126::-;;40747:42;40740:5;40736:54;40725:65;;40715:81;;;:::o;40802:77::-;;40868:5;40857:16;;40847:32;;;:::o;40885:86::-;;40960:4;40953:5;40949:16;40938:27;;40928:43;;;:::o;40977:154::-;41061:6;41056:3;41051;41038:30;41123:1;41114:6;41109:3;41105:16;41098:27;41028:103;;;:::o;41137:307::-;41205:1;41215:113;41229:6;41226:1;41223:13;41215:113;;;41314:1;41309:3;41305:11;41299:18;41295:1;41290:3;41286:11;41279:39;41251:2;41248:1;41244:10;41239:15;;41215:113;;;41346:6;41343:1;41340:13;41337:2;;;41426:1;41417:6;41412:3;41408:16;41401:27;41337:2;41186:258;;;;:::o;41450:320::-;;41531:1;41525:4;41521:12;41511:22;;41578:1;41572:4;41568:12;41599:18;41589:2;;41655:4;41647:6;41643:17;41633:27;;41589:2;41717;41709:6;41706:14;41686:18;41683:38;41680:2;;;41736:18;;:::i;:::-;41680:2;41501:269;;;;:::o;41776:233::-;;41838:24;41856:5;41838:24;:::i;:::-;41829:33;;41884:66;41877:5;41874:77;41871:2;;;41954:18;;:::i;:::-;41871:2;42001:1;41994:5;41990:13;41983:20;;41819:190;;;:::o;42015:100::-;;42083:26;42103:5;42083:26;:::i;:::-;42072:37;;42062:53;;;:::o;42121:79::-;;42189:5;42178:16;;42168:32;;;:::o;42206:94::-;;42274:20;42288:5;42274:20;:::i;:::-;42263:31;;42253:47;;;:::o;42306:176::-;;42355:20;42373:1;42355:20;:::i;:::-;42350:25;;42389:20;42407:1;42389:20;:::i;:::-;42384:25;;42428:1;42418:2;;42433:18;;:::i;:::-;42418:2;42474:1;42471;42467:9;42462:14;;42340:142;;;;:::o;42488:180::-;42536:77;42533:1;42526:88;42633:4;42630:1;42623:15;42657:4;42654:1;42647:15;42674:180;42722:77;42719:1;42712:88;42819:4;42816:1;42809:15;42843:4;42840:1;42833:15;42860:180;42908:77;42905:1;42898:88;43005:4;43002:1;42995:15;43029:4;43026:1;43019:15;43046:180;43094:77;43091:1;43084:88;43191:4;43188:1;43181:15;43215:4;43212:1;43205:15;43232:102;;43324:2;43320:7;43315:2;43308:5;43304:14;43300:28;43290:38;;43280:54;;;:::o;43340:94::-;;43421:5;43417:2;43413:14;43392:35;;43382:52;;;:::o;43440:122::-;43513:24;43531:5;43513:24;:::i;:::-;43506:5;43503:35;43493:2;;43552:1;43549;43542:12;43493:2;43483:79;:::o;43568:116::-;43638:21;43653:5;43638:21;:::i;:::-;43631:5;43628:32;43618:2;;43674:1;43671;43664:12;43618:2;43608:76;:::o;43690:122::-;43763:24;43781:5;43763:24;:::i;:::-;43756:5;43753:35;43743:2;;43802:1;43799;43792:12;43743:2;43733:79;:::o;43818:120::-;43890:23;43907:5;43890:23;:::i;:::-;43883:5;43880:34;43870:2;;43928:1;43925;43918:12;43870:2;43860:78;:::o;43944:122::-;44017:24;44035:5;44017:24;:::i;:::-;44010:5;44007:35;43997:2;;44056:1;44053;44046:12;43997:2;43987:79;:::o;44072:118::-;44143:22;44159:5;44143:22;:::i;:::-;44136:5;44133:33;44123:2;;44180:1;44177;44170:12;44123:2;44113:77;:::o
Swarm Source
ipfs://970fb0d378e8943b229dc615ed4302bd052c46584d3abca32764d0750b67bfa4
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.