Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
100 SCISSORS
Holders
52
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 SCISSORSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EtherScissors
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-22 */ // 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 pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @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 pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { 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 pragma solidity ^0.8.0; /** * @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 pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. 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 pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 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 pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { 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/EtherScissors.sol pragma solidity ^0.8.0; contract EtherScissors is ERC721Enumerable, Ownable { uint256 public constant MAX_NFT_SUPPLY = 100; uint public constant MAX_PURCHASABLE = 3; uint256 public SCISSORS_PRICE = 50000000000000000; // 0.05 ETH string public PROVENANCE_HASH = ""; bool public saleStarted = false; constructor() ERC721("EtherScissors", "SCISSORS") { } function _baseURI() internal view virtual override returns (string memory) { return "https://api.etherscissors.io/"; } function getTokenURI(uint256 tokenId) public view returns (string memory) { return tokenURI(tokenId); } function mint(uint256 amountToMint) public payable { require(saleStarted == true, "This sale has not started."); require(totalSupply() < MAX_NFT_SUPPLY, "All NFTs have been minted."); require(amountToMint > 0, "You must mint at least one Scissors."); require(amountToMint <= MAX_PURCHASABLE, "You cannot mint more than 3 Scissors."); require(totalSupply() + amountToMint <= MAX_NFT_SUPPLY, "The amount of Scissors you are trying to mint exceeds the MAX_NFT_SUPPLY."); require(SCISSORS_PRICE * amountToMint == msg.value, "Incorrect Ether value."); for (uint256 i = 0; i < amountToMint; i++) { uint256 mintIndex = totalSupply(); _safeMint(msg.sender, mintIndex); } } function startSale() public onlyOwner { saleStarted = true; } function pauseSale() public onlyOwner { saleStarted = false; } function setProvenanceHash(string memory _hash) public onlyOwner { PROVENANCE_HASH = _hash; } function withdraw() public payable onlyOwner { require(payable(msg.sender).send(address(this).balance)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"MAX_NFT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PURCHASABLE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCISSORS_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenURI","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":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToMint","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405266b1a2bc2ec50000600b5560405180602001604052806000815250600c908051906020019062000036929190620001bf565b506000600d60006101000a81548160ff0219169083151502179055503480156200005f57600080fd5b506040518060400160405280600d81526020017f457468657253636973736f7273000000000000000000000000000000000000008152506040518060400160405280600881526020017f53434953534f52530000000000000000000000000000000000000000000000008152508160009080519060200190620000e4929190620001bf565b508060019080519060200190620000fd929190620001bf565b505050600062000112620001b760201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002d4565b600033905090565b828054620001cd906200026f565b90600052602060002090601f016020900481019282620001f157600085556200023d565b82601f106200020c57805160ff19168380011785556200023d565b828001600101855582156200023d579182015b828111156200023c5782518255916020019190600101906200021f565b5b5090506200024c919062000250565b5090565b5b808211156200026b57600081600090555060010162000251565b5090565b600060028204905060018216806200028857607f821691505b602082108114156200029f576200029e620002a5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613fb280620002e46000396000f3fe6080604052600436106101cd5760003560e01c80636352211e116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610636578063e985e9c514610673578063f2fde38b146106b0578063ff1b6556146106d9576101cd565b8063a22cb465146105a2578063b5077f44146105cb578063b66a0e5d146105f6578063b88d4fde1461060d576101cd565b806389b1db34116100d157806389b1db34146105055780638da5cb5b1461053057806395d89b411461055b578063a0712d6814610586576101cd565b80636352211e1461047457806370a08231146104b1578063715018a6146104ee576101cd565b806323b872dd1161016f57806342842e0e1161013e57806342842e0e146103cc5780634f6ccce7146103f557806355367ba9146104325780635c474f9e14610449576101cd565b806323b872dd1461031f5780632f745c59146103485780633bb3a24d146103855780633ccfd60b146103c2576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806310969523146102a0578063119e4398146102c957806318160ddd146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612ced565b610704565b60405161020691906137b0565b60405180910390f35b34801561021b57600080fd5b5061022461077e565b60405161023191906137cb565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612d80565b610810565b60405161026e9190613749565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612cb1565b610895565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190612d3f565b6109ad565b005b3480156102d557600080fd5b506102de610a43565b6040516102eb9190613aed565b60405180910390f35b34801561030057600080fd5b50610309610a48565b6040516103169190613aed565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190612bab565b610a55565b005b34801561035457600080fd5b5061036f600480360381019061036a9190612cb1565b610ab5565b60405161037c9190613aed565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a79190612d80565b610b5a565b6040516103b991906137cb565b60405180910390f35b6103ca610b6c565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190612bab565b610c28565b005b34801561040157600080fd5b5061041c60048036038101906104179190612d80565b610c48565b6040516104299190613aed565b60405180910390f35b34801561043e57600080fd5b50610447610cdf565b005b34801561045557600080fd5b5061045e610d78565b60405161046b91906137b0565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190612d80565b610d8b565b6040516104a89190613749565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190612b46565b610e3d565b6040516104e59190613aed565b60405180910390f35b3480156104fa57600080fd5b50610503610ef5565b005b34801561051157600080fd5b5061051a611032565b6040516105279190613aed565b60405180910390f35b34801561053c57600080fd5b50610545611038565b6040516105529190613749565b60405180910390f35b34801561056757600080fd5b50610570611062565b60405161057d91906137cb565b60405180910390f35b6105a0600480360381019061059b9190612d80565b6110f4565b005b3480156105ae57600080fd5b506105c960048036038101906105c49190612c75565b6112f9565b005b3480156105d757600080fd5b506105e061147a565b6040516105ed9190613aed565b60405180910390f35b34801561060257600080fd5b5061060b61147f565b005b34801561061957600080fd5b50610634600480360381019061062f9190612bfa565b611518565b005b34801561064257600080fd5b5061065d60048036038101906106589190612d80565b61157a565b60405161066a91906137cb565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190612b6f565b611621565b6040516106a791906137b0565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190612b46565b6116b5565b005b3480156106e557600080fd5b506106ee611861565b6040516106fb91906137cb565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107775750610776826118ef565b5b9050919050565b60606000805461078d90613da7565b80601f01602080910402602001604051908101604052809291908181526020018280546107b990613da7565b80156108065780601f106107db57610100808354040283529160200191610806565b820191906000526020600020905b8154815290600101906020018083116107e957829003601f168201915b5050505050905090565b600061081b826119d1565b61085a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610851906139ed565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108a082610d8b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090890613a6d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610930611a3d565b73ffffffffffffffffffffffffffffffffffffffff16148061095f575061095e81610959611a3d565b611621565b5b61099e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109959061392d565b60405180910390fd5b6109a88383611a45565b505050565b6109b5611a3d565b73ffffffffffffffffffffffffffffffffffffffff166109d3611038565b73ffffffffffffffffffffffffffffffffffffffff1614610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2090613a0d565b60405180910390fd5b80600c9080519060200190610a3f92919061296a565b5050565b600381565b6000600880549050905090565b610a66610a60611a3d565b82611afe565b610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90613a8d565b60405180910390fd5b610ab0838383611bdc565b505050565b6000610ac083610e3d565b8210610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af89061380d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610b658261157a565b9050919050565b610b74611a3d565b73ffffffffffffffffffffffffffffffffffffffff16610b92611038565b73ffffffffffffffffffffffffffffffffffffffff1614610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90613a0d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610c2657600080fd5b565b610c4383838360405180602001604052806000815250611518565b505050565b6000610c52610a48565b8210610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8a90613aad565b60405180910390fd5b60088281548110610ccd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610ce7611a3d565b73ffffffffffffffffffffffffffffffffffffffff16610d05611038565b73ffffffffffffffffffffffffffffffffffffffff1614610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5290613a0d565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b600d60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b9061396d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea59061394d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610efd611a3d565b73ffffffffffffffffffffffffffffffffffffffff16610f1b611038565b73ffffffffffffffffffffffffffffffffffffffff1614610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613a0d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461107190613da7565b80601f016020809104026020016040519081016040528092919081815260200182805461109d90613da7565b80156110ea5780601f106110bf576101008083540402835291602001916110ea565b820191906000526020600020905b8154815290600101906020018083116110cd57829003601f168201915b5050505050905090565b60011515600d60009054906101000a900460ff1615151461114a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611141906137ed565b60405180910390fd5b6064611154610a48565b10611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b906138cd565b60405180910390fd5b600081116111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90613acd565b60405180910390fd5b600381111561121b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112129061390d565b60405180910390fd5b606481611226610a48565b6112309190613bdc565b1115611271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611268906139ad565b60405180910390fd5b3481600b546112809190613c63565b146112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b79061398d565b60405180910390fd5b60005b818110156112f55760006112d5610a48565b90506112e13382611e38565b5080806112ed90613dd9565b9150506112c3565b5050565b611301611a3d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561136f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611366906138ad565b60405180910390fd5b806005600061137c611a3d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611429611a3d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161146e91906137b0565b60405180910390a35050565b606481565b611487611a3d565b73ffffffffffffffffffffffffffffffffffffffff166114a5611038565b73ffffffffffffffffffffffffffffffffffffffff16146114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f290613a0d565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b611529611523611a3d565b83611afe565b611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f90613a8d565b60405180910390fd5b61157484848484611e56565b50505050565b6060611585826119d1565b6115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bb90613a4d565b60405180910390fd5b60006115ce611eb2565b905060008151116115ee5760405180602001604052806000815250611619565b806115f884611eef565b604051602001611609929190613725565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116bd611a3d565b73ffffffffffffffffffffffffffffffffffffffff166116db611038565b73ffffffffffffffffffffffffffffffffffffffff1614611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890613a0d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117989061384d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c805461186e90613da7565b80601f016020809104026020016040519081016040528092919081815260200182805461189a90613da7565b80156118e75780601f106118bc576101008083540402835291602001916118e7565b820191906000526020600020905b8154815290600101906020018083116118ca57829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119ba57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119ca57506119c98261209c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ab883610d8b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b09826119d1565b611b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3f906138ed565b60405180910390fd5b6000611b5383610d8b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bc257508373ffffffffffffffffffffffffffffffffffffffff16611baa84610810565b73ffffffffffffffffffffffffffffffffffffffff16145b80611bd35750611bd28185611621565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611bfc82610d8b565b73ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990613a2d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb99061388d565b60405180910390fd5b611ccd838383612106565b611cd8600082611a45565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d289190613cbd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d7f9190613bdc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e5282826040518060200160405280600081525061221a565b5050565b611e61848484611bdc565b611e6d84848484612275565b611eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea39061382d565b60405180910390fd5b50505050565b60606040518060400160405280601d81526020017f68747470733a2f2f6170692e657468657273636973736f72732e696f2f000000815250905090565b60606000821415611f37576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612097565b600082905060005b60008214611f69578080611f5290613dd9565b915050600a82611f629190613c32565b9150611f3f565b60008167ffffffffffffffff811115611fab577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fdd5781602001600182028036833780820191505090505b5090505b6000851461209057600182611ff69190613cbd565b9150600a856120059190613e22565b60306120119190613bdc565b60f81b81838151811061204d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120899190613c32565b9450611fe1565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61211183838361240c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121545761214f81612411565b612193565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461219257612191838261245a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121d6576121d1816125c7565b612215565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461221457612213828261270a565b5b5b505050565b6122248383612789565b6122316000848484612275565b612270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122679061382d565b60405180910390fd5b505050565b60006122968473ffffffffffffffffffffffffffffffffffffffff16612957565b156123ff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122bf611a3d565b8786866040518563ffffffff1660e01b81526004016122e19493929190613764565b602060405180830381600087803b1580156122fb57600080fd5b505af192505050801561232c57506040513d601f19601f820116820180604052508101906123299190612d16565b60015b6123af573d806000811461235c576040519150601f19603f3d011682016040523d82523d6000602084013e612361565b606091505b506000815114156123a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239e9061382d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612404565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161246784610e3d565b6124719190613cbd565b9050600060076000848152602001908152602001600020549050818114612556576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125db9190613cbd565b9050600060096000848152602001908152602001600020549050600060088381548110612631577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612679577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061271583610e3d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f0906139cd565b60405180910390fd5b612802816119d1565b15612842576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128399061386d565b60405180910390fd5b61284e60008383612106565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461289e9190613bdc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461297690613da7565b90600052602060002090601f01602090048101928261299857600085556129df565b82601f106129b157805160ff19168380011785556129df565b828001600101855582156129df579182015b828111156129de5782518255916020019190600101906129c3565b5b5090506129ec91906129f0565b5090565b5b80821115612a095760008160009055506001016129f1565b5090565b6000612a20612a1b84613b39565b613b08565b905082815260208101848484011115612a3857600080fd5b612a43848285613d65565b509392505050565b6000612a5e612a5984613b69565b613b08565b905082815260208101848484011115612a7657600080fd5b612a81848285613d65565b509392505050565b600081359050612a9881613f20565b92915050565b600081359050612aad81613f37565b92915050565b600081359050612ac281613f4e565b92915050565b600081519050612ad781613f4e565b92915050565b600082601f830112612aee57600080fd5b8135612afe848260208601612a0d565b91505092915050565b600082601f830112612b1857600080fd5b8135612b28848260208601612a4b565b91505092915050565b600081359050612b4081613f65565b92915050565b600060208284031215612b5857600080fd5b6000612b6684828501612a89565b91505092915050565b60008060408385031215612b8257600080fd5b6000612b9085828601612a89565b9250506020612ba185828601612a89565b9150509250929050565b600080600060608486031215612bc057600080fd5b6000612bce86828701612a89565b9350506020612bdf86828701612a89565b9250506040612bf086828701612b31565b9150509250925092565b60008060008060808587031215612c1057600080fd5b6000612c1e87828801612a89565b9450506020612c2f87828801612a89565b9350506040612c4087828801612b31565b925050606085013567ffffffffffffffff811115612c5d57600080fd5b612c6987828801612add565b91505092959194509250565b60008060408385031215612c8857600080fd5b6000612c9685828601612a89565b9250506020612ca785828601612a9e565b9150509250929050565b60008060408385031215612cc457600080fd5b6000612cd285828601612a89565b9250506020612ce385828601612b31565b9150509250929050565b600060208284031215612cff57600080fd5b6000612d0d84828501612ab3565b91505092915050565b600060208284031215612d2857600080fd5b6000612d3684828501612ac8565b91505092915050565b600060208284031215612d5157600080fd5b600082013567ffffffffffffffff811115612d6b57600080fd5b612d7784828501612b07565b91505092915050565b600060208284031215612d9257600080fd5b6000612da084828501612b31565b91505092915050565b612db281613cf1565b82525050565b612dc181613d03565b82525050565b6000612dd282613b99565b612ddc8185613baf565b9350612dec818560208601613d74565b612df581613f0f565b840191505092915050565b6000612e0b82613ba4565b612e158185613bc0565b9350612e25818560208601613d74565b612e2e81613f0f565b840191505092915050565b6000612e4482613ba4565b612e4e8185613bd1565b9350612e5e818560208601613d74565b80840191505092915050565b6000612e77601a83613bc0565b91507f546869732073616c6520686173206e6f7420737461727465642e0000000000006000830152602082019050919050565b6000612eb7602b83613bc0565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612f1d603283613bc0565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f83602683613bc0565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fe9601c83613bc0565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613029602483613bc0565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061308f601983613bc0565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130cf601a83613bc0565b91507f416c6c204e4654732068617665206265656e206d696e7465642e0000000000006000830152602082019050919050565b600061310f602c83613bc0565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613175602583613bc0565b91507f596f752063616e6e6f74206d696e74206d6f7265207468616e2033205363697360008301527f736f72732e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131db603883613bc0565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613241602a83613bc0565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006132a7602983613bc0565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061330d601683613bc0565b91507f496e636f72726563742045746865722076616c75652e000000000000000000006000830152602082019050919050565b600061334d604983613bc0565b91507f54686520616d6f756e74206f662053636973736f727320796f7520617265207460008301527f7279696e6720746f206d696e74206578636565647320746865204d41585f4e4660208301527f545f535550504c592e00000000000000000000000000000000000000000000006040830152606082019050919050565b60006133d9602083613bc0565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613419602c83613bc0565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061347f602083613bc0565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006134bf602983613bc0565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613525602f83613bc0565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061358b602183613bc0565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135f1603183613bc0565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613657602c83613bc0565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006136bd602483613bc0565b91507f596f75206d757374206d696e74206174206c65617374206f6e6520536369737360008301527f6f72732e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61371f81613d5b565b82525050565b60006137318285612e39565b915061373d8284612e39565b91508190509392505050565b600060208201905061375e6000830184612da9565b92915050565b60006080820190506137796000830187612da9565b6137866020830186612da9565b6137936040830185613716565b81810360608301526137a58184612dc7565b905095945050505050565b60006020820190506137c56000830184612db8565b92915050565b600060208201905081810360008301526137e58184612e00565b905092915050565b6000602082019050818103600083015261380681612e6a565b9050919050565b6000602082019050818103600083015261382681612eaa565b9050919050565b6000602082019050818103600083015261384681612f10565b9050919050565b6000602082019050818103600083015261386681612f76565b9050919050565b6000602082019050818103600083015261388681612fdc565b9050919050565b600060208201905081810360008301526138a68161301c565b9050919050565b600060208201905081810360008301526138c681613082565b9050919050565b600060208201905081810360008301526138e6816130c2565b9050919050565b6000602082019050818103600083015261390681613102565b9050919050565b6000602082019050818103600083015261392681613168565b9050919050565b60006020820190508181036000830152613946816131ce565b9050919050565b6000602082019050818103600083015261396681613234565b9050919050565b600060208201905081810360008301526139868161329a565b9050919050565b600060208201905081810360008301526139a681613300565b9050919050565b600060208201905081810360008301526139c681613340565b9050919050565b600060208201905081810360008301526139e6816133cc565b9050919050565b60006020820190508181036000830152613a068161340c565b9050919050565b60006020820190508181036000830152613a2681613472565b9050919050565b60006020820190508181036000830152613a46816134b2565b9050919050565b60006020820190508181036000830152613a6681613518565b9050919050565b60006020820190508181036000830152613a868161357e565b9050919050565b60006020820190508181036000830152613aa6816135e4565b9050919050565b60006020820190508181036000830152613ac68161364a565b9050919050565b60006020820190508181036000830152613ae6816136b0565b9050919050565b6000602082019050613b026000830184613716565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613b2f57613b2e613ee0565b5b8060405250919050565b600067ffffffffffffffff821115613b5457613b53613ee0565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b8457613b83613ee0565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613be782613d5b565b9150613bf283613d5b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c2757613c26613e53565b5b828201905092915050565b6000613c3d82613d5b565b9150613c4883613d5b565b925082613c5857613c57613e82565b5b828204905092915050565b6000613c6e82613d5b565b9150613c7983613d5b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cb257613cb1613e53565b5b828202905092915050565b6000613cc882613d5b565b9150613cd383613d5b565b925082821015613ce657613ce5613e53565b5b828203905092915050565b6000613cfc82613d3b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d92578082015181840152602081019050613d77565b83811115613da1576000848401525b50505050565b60006002820490506001821680613dbf57607f821691505b60208210811415613dd357613dd2613eb1565b5b50919050565b6000613de482613d5b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e1757613e16613e53565b5b600182019050919050565b6000613e2d82613d5b565b9150613e3883613d5b565b925082613e4857613e47613e82565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613f2981613cf1565b8114613f3457600080fd5b50565b613f4081613d03565b8114613f4b57600080fd5b50565b613f5781613d0f565b8114613f6257600080fd5b50565b613f6e81613d5b565b8114613f7957600080fd5b5056fea264697066735822122012901437f0eb0fd0927cb583f649ef5555e303662ec06170017901339bca1af264736f6c63430008000033
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c80636352211e116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610636578063e985e9c514610673578063f2fde38b146106b0578063ff1b6556146106d9576101cd565b8063a22cb465146105a2578063b5077f44146105cb578063b66a0e5d146105f6578063b88d4fde1461060d576101cd565b806389b1db34116100d157806389b1db34146105055780638da5cb5b1461053057806395d89b411461055b578063a0712d6814610586576101cd565b80636352211e1461047457806370a08231146104b1578063715018a6146104ee576101cd565b806323b872dd1161016f57806342842e0e1161013e57806342842e0e146103cc5780634f6ccce7146103f557806355367ba9146104325780635c474f9e14610449576101cd565b806323b872dd1461031f5780632f745c59146103485780633bb3a24d146103855780633ccfd60b146103c2576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806310969523146102a0578063119e4398146102c957806318160ddd146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612ced565b610704565b60405161020691906137b0565b60405180910390f35b34801561021b57600080fd5b5061022461077e565b60405161023191906137cb565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612d80565b610810565b60405161026e9190613749565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612cb1565b610895565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190612d3f565b6109ad565b005b3480156102d557600080fd5b506102de610a43565b6040516102eb9190613aed565b60405180910390f35b34801561030057600080fd5b50610309610a48565b6040516103169190613aed565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190612bab565b610a55565b005b34801561035457600080fd5b5061036f600480360381019061036a9190612cb1565b610ab5565b60405161037c9190613aed565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a79190612d80565b610b5a565b6040516103b991906137cb565b60405180910390f35b6103ca610b6c565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190612bab565b610c28565b005b34801561040157600080fd5b5061041c60048036038101906104179190612d80565b610c48565b6040516104299190613aed565b60405180910390f35b34801561043e57600080fd5b50610447610cdf565b005b34801561045557600080fd5b5061045e610d78565b60405161046b91906137b0565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190612d80565b610d8b565b6040516104a89190613749565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190612b46565b610e3d565b6040516104e59190613aed565b60405180910390f35b3480156104fa57600080fd5b50610503610ef5565b005b34801561051157600080fd5b5061051a611032565b6040516105279190613aed565b60405180910390f35b34801561053c57600080fd5b50610545611038565b6040516105529190613749565b60405180910390f35b34801561056757600080fd5b50610570611062565b60405161057d91906137cb565b60405180910390f35b6105a0600480360381019061059b9190612d80565b6110f4565b005b3480156105ae57600080fd5b506105c960048036038101906105c49190612c75565b6112f9565b005b3480156105d757600080fd5b506105e061147a565b6040516105ed9190613aed565b60405180910390f35b34801561060257600080fd5b5061060b61147f565b005b34801561061957600080fd5b50610634600480360381019061062f9190612bfa565b611518565b005b34801561064257600080fd5b5061065d60048036038101906106589190612d80565b61157a565b60405161066a91906137cb565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190612b6f565b611621565b6040516106a791906137b0565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190612b46565b6116b5565b005b3480156106e557600080fd5b506106ee611861565b6040516106fb91906137cb565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107775750610776826118ef565b5b9050919050565b60606000805461078d90613da7565b80601f01602080910402602001604051908101604052809291908181526020018280546107b990613da7565b80156108065780601f106107db57610100808354040283529160200191610806565b820191906000526020600020905b8154815290600101906020018083116107e957829003601f168201915b5050505050905090565b600061081b826119d1565b61085a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610851906139ed565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108a082610d8b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090890613a6d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610930611a3d565b73ffffffffffffffffffffffffffffffffffffffff16148061095f575061095e81610959611a3d565b611621565b5b61099e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109959061392d565b60405180910390fd5b6109a88383611a45565b505050565b6109b5611a3d565b73ffffffffffffffffffffffffffffffffffffffff166109d3611038565b73ffffffffffffffffffffffffffffffffffffffff1614610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2090613a0d565b60405180910390fd5b80600c9080519060200190610a3f92919061296a565b5050565b600381565b6000600880549050905090565b610a66610a60611a3d565b82611afe565b610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90613a8d565b60405180910390fd5b610ab0838383611bdc565b505050565b6000610ac083610e3d565b8210610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af89061380d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610b658261157a565b9050919050565b610b74611a3d565b73ffffffffffffffffffffffffffffffffffffffff16610b92611038565b73ffffffffffffffffffffffffffffffffffffffff1614610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90613a0d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610c2657600080fd5b565b610c4383838360405180602001604052806000815250611518565b505050565b6000610c52610a48565b8210610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8a90613aad565b60405180910390fd5b60088281548110610ccd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610ce7611a3d565b73ffffffffffffffffffffffffffffffffffffffff16610d05611038565b73ffffffffffffffffffffffffffffffffffffffff1614610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5290613a0d565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b600d60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b9061396d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea59061394d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610efd611a3d565b73ffffffffffffffffffffffffffffffffffffffff16610f1b611038565b73ffffffffffffffffffffffffffffffffffffffff1614610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613a0d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461107190613da7565b80601f016020809104026020016040519081016040528092919081815260200182805461109d90613da7565b80156110ea5780601f106110bf576101008083540402835291602001916110ea565b820191906000526020600020905b8154815290600101906020018083116110cd57829003601f168201915b5050505050905090565b60011515600d60009054906101000a900460ff1615151461114a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611141906137ed565b60405180910390fd5b6064611154610a48565b10611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b906138cd565b60405180910390fd5b600081116111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90613acd565b60405180910390fd5b600381111561121b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112129061390d565b60405180910390fd5b606481611226610a48565b6112309190613bdc565b1115611271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611268906139ad565b60405180910390fd5b3481600b546112809190613c63565b146112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b79061398d565b60405180910390fd5b60005b818110156112f55760006112d5610a48565b90506112e13382611e38565b5080806112ed90613dd9565b9150506112c3565b5050565b611301611a3d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561136f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611366906138ad565b60405180910390fd5b806005600061137c611a3d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611429611a3d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161146e91906137b0565b60405180910390a35050565b606481565b611487611a3d565b73ffffffffffffffffffffffffffffffffffffffff166114a5611038565b73ffffffffffffffffffffffffffffffffffffffff16146114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f290613a0d565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b611529611523611a3d565b83611afe565b611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f90613a8d565b60405180910390fd5b61157484848484611e56565b50505050565b6060611585826119d1565b6115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bb90613a4d565b60405180910390fd5b60006115ce611eb2565b905060008151116115ee5760405180602001604052806000815250611619565b806115f884611eef565b604051602001611609929190613725565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116bd611a3d565b73ffffffffffffffffffffffffffffffffffffffff166116db611038565b73ffffffffffffffffffffffffffffffffffffffff1614611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890613a0d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117989061384d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c805461186e90613da7565b80601f016020809104026020016040519081016040528092919081815260200182805461189a90613da7565b80156118e75780601f106118bc576101008083540402835291602001916118e7565b820191906000526020600020905b8154815290600101906020018083116118ca57829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119ba57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119ca57506119c98261209c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ab883610d8b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b09826119d1565b611b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3f906138ed565b60405180910390fd5b6000611b5383610d8b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bc257508373ffffffffffffffffffffffffffffffffffffffff16611baa84610810565b73ffffffffffffffffffffffffffffffffffffffff16145b80611bd35750611bd28185611621565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611bfc82610d8b565b73ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990613a2d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb99061388d565b60405180910390fd5b611ccd838383612106565b611cd8600082611a45565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d289190613cbd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d7f9190613bdc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e5282826040518060200160405280600081525061221a565b5050565b611e61848484611bdc565b611e6d84848484612275565b611eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea39061382d565b60405180910390fd5b50505050565b60606040518060400160405280601d81526020017f68747470733a2f2f6170692e657468657273636973736f72732e696f2f000000815250905090565b60606000821415611f37576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612097565b600082905060005b60008214611f69578080611f5290613dd9565b915050600a82611f629190613c32565b9150611f3f565b60008167ffffffffffffffff811115611fab577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fdd5781602001600182028036833780820191505090505b5090505b6000851461209057600182611ff69190613cbd565b9150600a856120059190613e22565b60306120119190613bdc565b60f81b81838151811061204d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120899190613c32565b9450611fe1565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61211183838361240c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121545761214f81612411565b612193565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461219257612191838261245a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121d6576121d1816125c7565b612215565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461221457612213828261270a565b5b5b505050565b6122248383612789565b6122316000848484612275565b612270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122679061382d565b60405180910390fd5b505050565b60006122968473ffffffffffffffffffffffffffffffffffffffff16612957565b156123ff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122bf611a3d565b8786866040518563ffffffff1660e01b81526004016122e19493929190613764565b602060405180830381600087803b1580156122fb57600080fd5b505af192505050801561232c57506040513d601f19601f820116820180604052508101906123299190612d16565b60015b6123af573d806000811461235c576040519150601f19603f3d011682016040523d82523d6000602084013e612361565b606091505b506000815114156123a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239e9061382d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612404565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161246784610e3d565b6124719190613cbd565b9050600060076000848152602001908152602001600020549050818114612556576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125db9190613cbd565b9050600060096000848152602001908152602001600020549050600060088381548110612631577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612679577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061271583610e3d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f0906139cd565b60405180910390fd5b612802816119d1565b15612842576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128399061386d565b60405180910390fd5b61284e60008383612106565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461289e9190613bdc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461297690613da7565b90600052602060002090601f01602090048101928261299857600085556129df565b82601f106129b157805160ff19168380011785556129df565b828001600101855582156129df579182015b828111156129de5782518255916020019190600101906129c3565b5b5090506129ec91906129f0565b5090565b5b80821115612a095760008160009055506001016129f1565b5090565b6000612a20612a1b84613b39565b613b08565b905082815260208101848484011115612a3857600080fd5b612a43848285613d65565b509392505050565b6000612a5e612a5984613b69565b613b08565b905082815260208101848484011115612a7657600080fd5b612a81848285613d65565b509392505050565b600081359050612a9881613f20565b92915050565b600081359050612aad81613f37565b92915050565b600081359050612ac281613f4e565b92915050565b600081519050612ad781613f4e565b92915050565b600082601f830112612aee57600080fd5b8135612afe848260208601612a0d565b91505092915050565b600082601f830112612b1857600080fd5b8135612b28848260208601612a4b565b91505092915050565b600081359050612b4081613f65565b92915050565b600060208284031215612b5857600080fd5b6000612b6684828501612a89565b91505092915050565b60008060408385031215612b8257600080fd5b6000612b9085828601612a89565b9250506020612ba185828601612a89565b9150509250929050565b600080600060608486031215612bc057600080fd5b6000612bce86828701612a89565b9350506020612bdf86828701612a89565b9250506040612bf086828701612b31565b9150509250925092565b60008060008060808587031215612c1057600080fd5b6000612c1e87828801612a89565b9450506020612c2f87828801612a89565b9350506040612c4087828801612b31565b925050606085013567ffffffffffffffff811115612c5d57600080fd5b612c6987828801612add565b91505092959194509250565b60008060408385031215612c8857600080fd5b6000612c9685828601612a89565b9250506020612ca785828601612a9e565b9150509250929050565b60008060408385031215612cc457600080fd5b6000612cd285828601612a89565b9250506020612ce385828601612b31565b9150509250929050565b600060208284031215612cff57600080fd5b6000612d0d84828501612ab3565b91505092915050565b600060208284031215612d2857600080fd5b6000612d3684828501612ac8565b91505092915050565b600060208284031215612d5157600080fd5b600082013567ffffffffffffffff811115612d6b57600080fd5b612d7784828501612b07565b91505092915050565b600060208284031215612d9257600080fd5b6000612da084828501612b31565b91505092915050565b612db281613cf1565b82525050565b612dc181613d03565b82525050565b6000612dd282613b99565b612ddc8185613baf565b9350612dec818560208601613d74565b612df581613f0f565b840191505092915050565b6000612e0b82613ba4565b612e158185613bc0565b9350612e25818560208601613d74565b612e2e81613f0f565b840191505092915050565b6000612e4482613ba4565b612e4e8185613bd1565b9350612e5e818560208601613d74565b80840191505092915050565b6000612e77601a83613bc0565b91507f546869732073616c6520686173206e6f7420737461727465642e0000000000006000830152602082019050919050565b6000612eb7602b83613bc0565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612f1d603283613bc0565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f83602683613bc0565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fe9601c83613bc0565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613029602483613bc0565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061308f601983613bc0565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130cf601a83613bc0565b91507f416c6c204e4654732068617665206265656e206d696e7465642e0000000000006000830152602082019050919050565b600061310f602c83613bc0565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613175602583613bc0565b91507f596f752063616e6e6f74206d696e74206d6f7265207468616e2033205363697360008301527f736f72732e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131db603883613bc0565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613241602a83613bc0565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006132a7602983613bc0565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061330d601683613bc0565b91507f496e636f72726563742045746865722076616c75652e000000000000000000006000830152602082019050919050565b600061334d604983613bc0565b91507f54686520616d6f756e74206f662053636973736f727320796f7520617265207460008301527f7279696e6720746f206d696e74206578636565647320746865204d41585f4e4660208301527f545f535550504c592e00000000000000000000000000000000000000000000006040830152606082019050919050565b60006133d9602083613bc0565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613419602c83613bc0565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061347f602083613bc0565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006134bf602983613bc0565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613525602f83613bc0565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061358b602183613bc0565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135f1603183613bc0565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613657602c83613bc0565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006136bd602483613bc0565b91507f596f75206d757374206d696e74206174206c65617374206f6e6520536369737360008301527f6f72732e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61371f81613d5b565b82525050565b60006137318285612e39565b915061373d8284612e39565b91508190509392505050565b600060208201905061375e6000830184612da9565b92915050565b60006080820190506137796000830187612da9565b6137866020830186612da9565b6137936040830185613716565b81810360608301526137a58184612dc7565b905095945050505050565b60006020820190506137c56000830184612db8565b92915050565b600060208201905081810360008301526137e58184612e00565b905092915050565b6000602082019050818103600083015261380681612e6a565b9050919050565b6000602082019050818103600083015261382681612eaa565b9050919050565b6000602082019050818103600083015261384681612f10565b9050919050565b6000602082019050818103600083015261386681612f76565b9050919050565b6000602082019050818103600083015261388681612fdc565b9050919050565b600060208201905081810360008301526138a68161301c565b9050919050565b600060208201905081810360008301526138c681613082565b9050919050565b600060208201905081810360008301526138e6816130c2565b9050919050565b6000602082019050818103600083015261390681613102565b9050919050565b6000602082019050818103600083015261392681613168565b9050919050565b60006020820190508181036000830152613946816131ce565b9050919050565b6000602082019050818103600083015261396681613234565b9050919050565b600060208201905081810360008301526139868161329a565b9050919050565b600060208201905081810360008301526139a681613300565b9050919050565b600060208201905081810360008301526139c681613340565b9050919050565b600060208201905081810360008301526139e6816133cc565b9050919050565b60006020820190508181036000830152613a068161340c565b9050919050565b60006020820190508181036000830152613a2681613472565b9050919050565b60006020820190508181036000830152613a46816134b2565b9050919050565b60006020820190508181036000830152613a6681613518565b9050919050565b60006020820190508181036000830152613a868161357e565b9050919050565b60006020820190508181036000830152613aa6816135e4565b9050919050565b60006020820190508181036000830152613ac68161364a565b9050919050565b60006020820190508181036000830152613ae6816136b0565b9050919050565b6000602082019050613b026000830184613716565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613b2f57613b2e613ee0565b5b8060405250919050565b600067ffffffffffffffff821115613b5457613b53613ee0565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b8457613b83613ee0565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613be782613d5b565b9150613bf283613d5b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c2757613c26613e53565b5b828201905092915050565b6000613c3d82613d5b565b9150613c4883613d5b565b925082613c5857613c57613e82565b5b828204905092915050565b6000613c6e82613d5b565b9150613c7983613d5b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cb257613cb1613e53565b5b828202905092915050565b6000613cc882613d5b565b9150613cd383613d5b565b925082821015613ce657613ce5613e53565b5b828203905092915050565b6000613cfc82613d3b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d92578082015181840152602081019050613d77565b83811115613da1576000848401525b50505050565b60006002820490506001821680613dbf57607f821691505b60208210811415613dd357613dd2613eb1565b5b50919050565b6000613de482613d5b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e1757613e16613e53565b5b600182019050919050565b6000613e2d82613d5b565b9150613e3883613d5b565b925082613e4857613e47613e82565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613f2981613cf1565b8114613f3457600080fd5b50565b613f4081613d03565b8114613f4b57600080fd5b50565b613f5781613d0f565b8114613f6257600080fd5b50565b613f6e81613d5b565b8114613f7957600080fd5b5056fea264697066735822122012901437f0eb0fd0927cb583f649ef5555e303662ec06170017901339bca1af264736f6c63430008000033
Deployed Bytecode Sourcemap
42821:1819:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34324:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21529:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22989:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22526:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44402:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42931:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34977:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23879:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34645:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43335:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44517:120;;;:::i;:::-;;24255:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35167:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44318:76;;;;;;;;;;;;;:::i;:::-;;43089:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21223:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20953:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42196:148;;;;;;;;;;;;;:::i;:::-;;42978:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41545:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21698:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43459:768;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23282:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42880:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44235:75;;;;;;;;;;;;;:::i;:::-;;24477:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21873:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23648:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42499:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43046:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34324:237;34426:4;34465:35;34450:50;;;:11;:50;;;;:103;;;;34517:36;34541:11;34517:23;:36::i;:::-;34450:103;34443:110;;34324:237;;;:::o;21529:100::-;21583:13;21616:5;21609:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21529:100;:::o;22989:221::-;23065:7;23093:16;23101:7;23093;:16::i;:::-;23085:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23178:15;:24;23194:7;23178:24;;;;;;;;;;;;;;;;;;;;;23171:31;;22989:221;;;:::o;22526:397::-;22607:13;22623:23;22638:7;22623:14;:23::i;:::-;22607:39;;22671:5;22665:11;;:2;:11;;;;22657:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22751:5;22735:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22760:37;22777:5;22784:12;:10;:12::i;:::-;22760:16;:37::i;:::-;22735:62;22727:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22894:21;22903:2;22907:7;22894:8;:21::i;:::-;22526:397;;;:::o;44402:107::-;41776:12;:10;:12::i;:::-;41765:23;;:7;:5;:7::i;:::-;:23;;;41757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44496:5:::1;44478:15;:23;;;;;;;;;;;;:::i;:::-;;44402:107:::0;:::o;42931:40::-;42970:1;42931:40;:::o;34977:113::-;35038:7;35065:10;:17;;;;35058:24;;34977:113;:::o;23879:305::-;24040:41;24059:12;:10;:12::i;:::-;24073:7;24040:18;:41::i;:::-;24032:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24148:28;24158:4;24164:2;24168:7;24148:9;:28::i;:::-;23879:305;;;:::o;34645:256::-;34742:7;34778:23;34795:5;34778:16;:23::i;:::-;34770:5;:31;34762:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34867:12;:19;34880:5;34867:19;;;;;;;;;;;;;;;:26;34887:5;34867:26;;;;;;;;;;;;34860:33;;34645:256;;;;:::o;43335:117::-;43394:13;43427:17;43436:7;43427:8;:17::i;:::-;43420:24;;43335:117;;;:::o;44517:120::-;41776:12;:10;:12::i;:::-;41765:23;;:7;:5;:7::i;:::-;:23;;;41757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44589:10:::1;44581:24;;:47;44606:21;44581:47;;;;;;;;;;;;;;;;;;;;;;;44573:56;;;::::0;::::1;;44517:120::o:0;24255:151::-;24359:39;24376:4;24382:2;24386:7;24359:39;;;;;;;;;;;;:16;:39::i;:::-;24255:151;;;:::o;35167:233::-;35242:7;35278:30;:28;:30::i;:::-;35270:5;:38;35262:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35375:10;35386:5;35375:17;;;;;;;;;;;;;;;;;;;;;;;;35368:24;;35167:233;;;:::o;44318:76::-;41776:12;:10;:12::i;:::-;41765:23;;:7;:5;:7::i;:::-;:23;;;41757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44381:5:::1;44367:11;;:19;;;;;;;;;;;;;;;;;;44318:76::o:0;43089:31::-;;;;;;;;;;;;;:::o;21223:239::-;21295:7;21315:13;21331:7;:16;21339:7;21331:16;;;;;;;;;;;;;;;;;;;;;21315:32;;21383:1;21366:19;;:5;:19;;;;21358:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21449:5;21442:12;;;21223:239;;;:::o;20953:208::-;21025:7;21070:1;21053:19;;:5;:19;;;;21045:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21137:9;:16;21147:5;21137:16;;;;;;;;;;;;;;;;21130:23;;20953:208;;;:::o;42196:148::-;41776:12;:10;:12::i;:::-;41765:23;;:7;:5;:7::i;:::-;:23;;;41757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42303:1:::1;42266:40;;42287:6;;;;;;;;;;;42266:40;;;;;;;;;;;;42334:1;42317:6;;:19;;;;;;;;;;;;;;;;;;42196:148::o:0;42978:49::-;;;;:::o;41545:87::-;41591:7;41618:6;;;;;;;;;;;41611:13;;41545:87;:::o;21698:104::-;21754:13;21787:7;21780:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21698:104;:::o;43459:768::-;43544:4;43529:19;;:11;;;;;;;;;;;:19;;;43521:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42921:3;43598:13;:11;:13::i;:::-;:30;43590:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43693:1;43678:12;:16;43670:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42970:1;43754:12;:31;;43746:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42921:3;43862:12;43846:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:46;;43838:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;44022:9;44006:12;43989:14;;:29;;;;:::i;:::-;:42;43981:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;44076:9;44071:150;44095:12;44091:1;:16;44071:150;;;44129:17;44149:13;:11;:13::i;:::-;44129:33;;44177:32;44187:10;44199:9;44177;:32::i;:::-;44071:150;44109:3;;;;;:::i;:::-;;;;44071:150;;;;43459:768;:::o;23282:295::-;23397:12;:10;:12::i;:::-;23385:24;;:8;:24;;;;23377:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23497:8;23452:18;:32;23471:12;:10;:12::i;:::-;23452:32;;;;;;;;;;;;;;;:42;23485:8;23452:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23550:8;23521:48;;23536:12;:10;:12::i;:::-;23521:48;;;23560:8;23521:48;;;;;;:::i;:::-;;;;;;;;23282:295;;:::o;42880:44::-;42921:3;42880:44;:::o;44235:75::-;41776:12;:10;:12::i;:::-;41765:23;;:7;:5;:7::i;:::-;:23;;;41757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44298:4:::1;44284:11;;:18;;;;;;;;;;;;;;;;;;44235:75::o:0;24477:285::-;24609:41;24628:12;:10;:12::i;:::-;24642:7;24609:18;:41::i;:::-;24601:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24715:39;24729:4;24735:2;24739:7;24748:5;24715:13;:39::i;:::-;24477:285;;;;:::o;21873:360::-;21946:13;21980:16;21988:7;21980;:16::i;:::-;21972:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22061:21;22085:10;:8;:10::i;:::-;22061:34;;22137:1;22119:7;22113:21;:25;:112;;;;;;;;;;;;;;;;;22178:7;22187:18;:7;:16;:18::i;:::-;22161:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22113:112;22106:119;;;21873:360;;;:::o;23648:164::-;23745:4;23769:18;:25;23788:5;23769:25;;;;;;;;;;;;;;;:35;23795:8;23769:35;;;;;;;;;;;;;;;;;;;;;;;;;23762:42;;23648:164;;;;:::o;42499:244::-;41776:12;:10;:12::i;:::-;41765:23;;:7;:5;:7::i;:::-;:23;;;41757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42608:1:::1;42588:22;;:8;:22;;;;42580:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42698:8;42669:38;;42690:6;;;;;;;;;;;42669:38;;;;;;;;;;;;42727:8;42718:6;;:17;;;;;;;;;;;;;;;;;;42499:244:::0;:::o;43046:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20597:292::-;20699:4;20738:25;20723:40;;;:11;:40;;;;:105;;;;20795:33;20780:48;;;:11;:48;;;;20723:105;:158;;;;20845:36;20869:11;20845:23;:36::i;:::-;20723:158;20716:165;;20597:292;;;:::o;26229:127::-;26294:4;26346:1;26318:30;;:7;:16;26326:7;26318:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26311:37;;26229:127;;;:::o;15885:98::-;15938:7;15965:10;15958:17;;15885:98;:::o;30106:174::-;30208:2;30181:15;:24;30197:7;30181:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30264:7;30260:2;30226:46;;30235:23;30250:7;30235:14;:23::i;:::-;30226:46;;;;;;;;;;;;30106:174;;:::o;26523:348::-;26616:4;26641:16;26649:7;26641;:16::i;:::-;26633:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26717:13;26733:23;26748:7;26733:14;:23::i;:::-;26717:39;;26786:5;26775:16;;:7;:16;;;:51;;;;26819:7;26795:31;;:20;26807:7;26795:11;:20::i;:::-;:31;;;26775:51;:87;;;;26830:32;26847:5;26854:7;26830:16;:32::i;:::-;26775:87;26767:96;;;26523:348;;;;:::o;29444:544::-;29569:4;29542:31;;:23;29557:7;29542:14;:23::i;:::-;:31;;;29534:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29652:1;29638:16;;:2;:16;;;;29630:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29708:39;29729:4;29735:2;29739:7;29708:20;:39::i;:::-;29812:29;29829:1;29833:7;29812:8;:29::i;:::-;29873:1;29854:9;:15;29864:4;29854:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29902:1;29885:9;:13;29895:2;29885:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29933:2;29914:7;:16;29922:7;29914:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29972:7;29968:2;29953:27;;29962:4;29953:27;;;;;;;;;;;;29444:544;;;:::o;27213:110::-;27289:26;27299:2;27303:7;27289:26;;;;;;;;;;;;:9;:26::i;:::-;27213:110;;:::o;25644:272::-;25758:28;25768:4;25774:2;25778:7;25758:9;:28::i;:::-;25805:48;25828:4;25834:2;25838:7;25847:5;25805:22;:48::i;:::-;25797:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25644:272;;;;:::o;43195:132::-;43255:13;43281:38;;;;;;;;;;;;;;;;;;;43195:132;:::o;16540:723::-;16596:13;16826:1;16817:5;:10;16813:53;;;16844:10;;;;;;;;;;;;;;;;;;;;;16813:53;16876:12;16891:5;16876:20;;16907:14;16932:78;16947:1;16939:4;:9;16932:78;;16965:8;;;;;:::i;:::-;;;;16996:2;16988:10;;;;;:::i;:::-;;;16932:78;;;17020:19;17052:6;17042:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17020:39;;17070:154;17086:1;17077:5;:10;17070:154;;17114:1;17104:11;;;;;:::i;:::-;;;17181:2;17173:5;:10;;;;:::i;:::-;17160:2;:24;;;;:::i;:::-;17147:39;;17130:6;17137;17130:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17210:2;17201:11;;;;;:::i;:::-;;;17070:154;;;17248:6;17234:21;;;;;16540:723;;;;:::o;19095:157::-;19180:4;19219:25;19204:40;;;:11;:40;;;;19197:47;;19095:157;;;:::o;36013:555::-;36123:45;36150:4;36156:2;36160:7;36123:26;:45::i;:::-;36201:1;36185:18;;:4;:18;;;36181:187;;;36220:40;36252:7;36220:31;:40::i;:::-;36181:187;;;36290:2;36282:10;;:4;:10;;;36278:90;;36309:47;36342:4;36348:7;36309:32;:47::i;:::-;36278:90;36181:187;36396:1;36382:16;;:2;:16;;;36378:183;;;36415:45;36452:7;36415:36;:45::i;:::-;36378:183;;;36488:4;36482:10;;:2;:10;;;36478:83;;36509:40;36537:2;36541:7;36509:27;:40::i;:::-;36478:83;36378:183;36013:555;;;:::o;27550:250::-;27646:18;27652:2;27656:7;27646:5;:18::i;:::-;27683:54;27714:1;27718:2;27722:7;27731:5;27683:22;:54::i;:::-;27675:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27550:250;;;:::o;30845:843::-;30966:4;30992:15;:2;:13;;;:15::i;:::-;30988:693;;;31044:2;31028:36;;;31065:12;:10;:12::i;:::-;31079:4;31085:7;31094:5;31028:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31024:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31291:1;31274:6;:13;:18;31270:341;;;31317:60;;;;;;;;;;:::i;:::-;;;;;;;;31270:341;31561:6;31555:13;31546:6;31542:2;31538:15;31531:38;31024:602;31161:45;;;31151:55;;;:6;:55;;;;31144:62;;;;;30988:693;31665:4;31658:11;;30845:843;;;;;;;:::o;32301:93::-;;;;:::o;37291:164::-;37395:10;:17;;;;37368:15;:24;37384:7;37368:24;;;;;;;;;;;:44;;;;37423:10;37439:7;37423:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37291:164;:::o;38082:988::-;38348:22;38398:1;38373:22;38390:4;38373:16;:22::i;:::-;:26;;;;:::i;:::-;38348:51;;38410:18;38431:17;:26;38449:7;38431:26;;;;;;;;;;;;38410:47;;38578:14;38564:10;:28;38560:328;;38609:19;38631:12;:18;38644:4;38631:18;;;;;;;;;;;;;;;:34;38650:14;38631:34;;;;;;;;;;;;38609:56;;38715:11;38682:12;:18;38695:4;38682:18;;;;;;;;;;;;;;;:30;38701:10;38682:30;;;;;;;;;;;:44;;;;38832:10;38799:17;:30;38817:11;38799:30;;;;;;;;;;;:43;;;;38560:328;;38984:17;:26;39002:7;38984:26;;;;;;;;;;;38977:33;;;39028:12;:18;39041:4;39028:18;;;;;;;;;;;;;;;:34;39047:14;39028:34;;;;;;;;;;;39021:41;;;38082:988;;;;:::o;39365:1079::-;39618:22;39663:1;39643:10;:17;;;;:21;;;;:::i;:::-;39618:46;;39675:18;39696:15;:24;39712:7;39696:24;;;;;;;;;;;;39675:45;;40047:19;40069:10;40080:14;40069:26;;;;;;;;;;;;;;;;;;;;;;;;40047:48;;40133:11;40108:10;40119;40108:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40244:10;40213:15;:28;40229:11;40213:28;;;;;;;;;;;:41;;;;40385:15;:24;40401:7;40385:24;;;;;;;;;;;40378:31;;;40420:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39365:1079;;;;:::o;36869:221::-;36954:14;36971:20;36988:2;36971:16;:20::i;:::-;36954:37;;37029:7;37002:12;:16;37015:2;37002:16;;;;;;;;;;;;;;;:24;37019:6;37002:24;;;;;;;;;;;:34;;;;37076:6;37047:17;:26;37065:7;37047:26;;;;;;;;;;;:35;;;;36869:221;;;:::o;28136:382::-;28230:1;28216:16;;:2;:16;;;;28208:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28289:16;28297:7;28289;:16::i;:::-;28288:17;28280:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28351:45;28380:1;28384:2;28388:7;28351:20;:45::i;:::-;28426:1;28409:9;:13;28419:2;28409:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28457:2;28438:7;:16;28446:7;28438:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28502:7;28498:2;28477:33;;28494:1;28477:33;;;;;;;;;;;;28136:382;;:::o;8002:422::-;8062:4;8270:12;8381:7;8369:20;8361:28;;8415:1;8408:4;:8;8401:15;;;8002:422;;;:::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:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7442:324::-;;7605:67;7669:2;7664:3;7605:67;:::i;:::-;7598:74;;7702:28;7698:1;7693:3;7689:11;7682:49;7757:2;7752:3;7748:12;7741:19;;7588:178;;;:::o;7772:375::-;;7935:67;7999:2;7994:3;7935:67;:::i;:::-;7928:74;;8032:34;8028:1;8023:3;8019:11;8012:55;8098:13;8093:2;8088:3;8084:12;8077:35;8138:2;8133:3;8129:12;8122:19;;7918:229;;;:::o;8153:382::-;;8316:67;8380:2;8375:3;8316:67;:::i;:::-;8309:74;;8413:34;8409:1;8404:3;8400:11;8393:55;8479:20;8474:2;8469:3;8465:12;8458:42;8526:2;8521:3;8517:12;8510:19;;8299:236;;;:::o;8541:370::-;;8704:67;8768:2;8763:3;8704:67;:::i;:::-;8697:74;;8801:34;8797:1;8792:3;8788:11;8781:55;8867:8;8862:2;8857:3;8853:12;8846:30;8902:2;8897:3;8893:12;8886:19;;8687:224;;;:::o;8917:326::-;;9080:67;9144:2;9139:3;9080:67;:::i;:::-;9073:74;;9177:30;9173:1;9168:3;9164:11;9157:51;9234:2;9229:3;9225:12;9218:19;;9063:180;;;:::o;9249:368::-;;9412:67;9476:2;9471:3;9412:67;:::i;:::-;9405:74;;9509:34;9505:1;9500:3;9496:11;9489:55;9575:6;9570:2;9565:3;9561:12;9554:28;9608:2;9603:3;9599:12;9592:19;;9395:222;;;:::o;9623:323::-;;9786:67;9850:2;9845:3;9786:67;:::i;:::-;9779:74;;9883:27;9879:1;9874:3;9870:11;9863:48;9937:2;9932:3;9928:12;9921:19;;9769:177;;;:::o;9952:324::-;;10115:67;10179:2;10174:3;10115:67;:::i;:::-;10108:74;;10212:28;10208:1;10203:3;10199:11;10192:49;10267:2;10262:3;10258:12;10251:19;;10098:178;;;:::o;10282:376::-;;10445:67;10509:2;10504:3;10445:67;:::i;:::-;10438:74;;10542:34;10538:1;10533:3;10529:11;10522:55;10608:14;10603:2;10598:3;10594:12;10587:36;10649:2;10644:3;10640:12;10633:19;;10428:230;;;:::o;10664:369::-;;10827:67;10891:2;10886:3;10827:67;:::i;:::-;10820:74;;10924:34;10920:1;10915:3;10911:11;10904:55;10990:7;10985:2;10980:3;10976:12;10969:29;11024:2;11019:3;11015:12;11008:19;;10810:223;;;:::o;11039:388::-;;11202:67;11266:2;11261:3;11202:67;:::i;:::-;11195:74;;11299:34;11295:1;11290:3;11286:11;11279:55;11365:26;11360:2;11355:3;11351:12;11344:48;11418:2;11413:3;11409:12;11402:19;;11185:242;;;:::o;11433:374::-;;11596:67;11660:2;11655:3;11596:67;:::i;:::-;11589:74;;11693:34;11689:1;11684:3;11680:11;11673:55;11759:12;11754:2;11749:3;11745:12;11738:34;11798:2;11793:3;11789:12;11782:19;;11579:228;;;:::o;11813:373::-;;11976:67;12040:2;12035:3;11976:67;:::i;:::-;11969:74;;12073:34;12069:1;12064:3;12060:11;12053:55;12139:11;12134:2;12129:3;12125:12;12118:33;12177:2;12172:3;12168:12;12161:19;;11959:227;;;:::o;12192:320::-;;12355:67;12419:2;12414:3;12355:67;:::i;:::-;12348:74;;12452:24;12448:1;12443:3;12439:11;12432:45;12503:2;12498:3;12494:12;12487:19;;12338:174;;;:::o;12518:439::-;;12681:67;12745:2;12740:3;12681:67;:::i;:::-;12674:74;;12778:34;12774:1;12769:3;12765:11;12758:55;12844:34;12839:2;12834:3;12830:12;12823:56;12910:11;12905:2;12900:3;12896:12;12889:33;12948:2;12943:3;12939:12;12932:19;;12664:293;;;:::o;12963:330::-;;13126:67;13190:2;13185:3;13126:67;:::i;:::-;13119:74;;13223:34;13219:1;13214:3;13210:11;13203:55;13284:2;13279:3;13275:12;13268:19;;13109:184;;;:::o;13299:376::-;;13462:67;13526:2;13521:3;13462:67;:::i;:::-;13455:74;;13559:34;13555:1;13550:3;13546:11;13539:55;13625:14;13620:2;13615:3;13611:12;13604:36;13666:2;13661:3;13657:12;13650:19;;13445:230;;;:::o;13681:330::-;;13844:67;13908:2;13903:3;13844:67;:::i;:::-;13837:74;;13941:34;13937:1;13932:3;13928:11;13921:55;14002:2;13997:3;13993:12;13986:19;;13827:184;;;:::o;14017:373::-;;14180:67;14244:2;14239:3;14180:67;:::i;:::-;14173:74;;14277:34;14273:1;14268:3;14264:11;14257:55;14343:11;14338:2;14333:3;14329:12;14322:33;14381:2;14376:3;14372:12;14365:19;;14163:227;;;:::o;14396:379::-;;14559:67;14623:2;14618:3;14559:67;:::i;:::-;14552:74;;14656:34;14652:1;14647:3;14643:11;14636:55;14722:17;14717:2;14712:3;14708:12;14701:39;14766:2;14761:3;14757:12;14750:19;;14542:233;;;:::o;14781:365::-;;14944:67;15008:2;15003:3;14944:67;:::i;:::-;14937:74;;15041:34;15037:1;15032:3;15028:11;15021:55;15107:3;15102:2;15097:3;15093:12;15086:25;15137:2;15132:3;15128:12;15121:19;;14927:219;;;:::o;15152:381::-;;15315:67;15379:2;15374:3;15315:67;:::i;:::-;15308:74;;15412:34;15408:1;15403:3;15399:11;15392:55;15478:19;15473:2;15468:3;15464:12;15457:41;15524:2;15519:3;15515:12;15508:19;;15298:235;;;:::o;15539:376::-;;15702:67;15766:2;15761:3;15702:67;:::i;:::-;15695:74;;15799:34;15795:1;15790:3;15786:11;15779:55;15865:14;15860:2;15855:3;15851:12;15844:36;15906:2;15901:3;15897:12;15890:19;;15685:230;;;:::o;15921:368::-;;16084:67;16148:2;16143:3;16084:67;:::i;:::-;16077:74;;16181:34;16177:1;16172:3;16168:11;16161:55;16247:6;16242:2;16237:3;16233:12;16226:28;16280:2;16275:3;16271:12;16264:19;;16067:222;;;:::o;16295:118::-;16382:24;16400:5;16382:24;:::i;:::-;16377:3;16370:37;16360:53;;:::o;16419:435::-;;16621:95;16712:3;16703:6;16621:95;:::i;:::-;16614:102;;16733:95;16824:3;16815:6;16733:95;:::i;:::-;16726:102;;16845:3;16838:10;;16603:251;;;;;:::o;16860:222::-;;16991:2;16980:9;16976:18;16968:26;;17004:71;17072:1;17061:9;17057:17;17048:6;17004:71;:::i;:::-;16958:124;;;;:::o;17088:640::-;;17321:3;17310:9;17306:19;17298:27;;17335:71;17403:1;17392:9;17388:17;17379:6;17335:71;:::i;:::-;17416:72;17484:2;17473:9;17469:18;17460:6;17416:72;:::i;:::-;17498;17566:2;17555:9;17551:18;17542:6;17498:72;:::i;:::-;17617:9;17611:4;17607:20;17602:2;17591:9;17587:18;17580:48;17645:76;17716:4;17707:6;17645:76;:::i;:::-;17637:84;;17288:440;;;;;;;:::o;17734:210::-;;17859:2;17848:9;17844:18;17836:26;;17872:65;17934:1;17923:9;17919:17;17910:6;17872:65;:::i;:::-;17826:118;;;;:::o;17950:313::-;;18101:2;18090:9;18086:18;18078:26;;18150:9;18144:4;18140:20;18136:1;18125:9;18121:17;18114:47;18178:78;18251:4;18242:6;18178:78;:::i;:::-;18170:86;;18068:195;;;;:::o;18269:419::-;;18473:2;18462:9;18458:18;18450:26;;18522:9;18516:4;18512:20;18508:1;18497:9;18493:17;18486:47;18550:131;18676:4;18550:131;:::i;:::-;18542:139;;18440:248;;;:::o;18694:419::-;;18898:2;18887:9;18883:18;18875:26;;18947:9;18941:4;18937:20;18933:1;18922:9;18918:17;18911:47;18975:131;19101:4;18975:131;:::i;:::-;18967:139;;18865:248;;;:::o;19119:419::-;;19323:2;19312:9;19308:18;19300:26;;19372:9;19366:4;19362:20;19358:1;19347:9;19343:17;19336:47;19400:131;19526:4;19400:131;:::i;:::-;19392:139;;19290:248;;;:::o;19544:419::-;;19748:2;19737:9;19733:18;19725:26;;19797:9;19791:4;19787:20;19783:1;19772:9;19768:17;19761:47;19825:131;19951:4;19825:131;:::i;:::-;19817:139;;19715:248;;;:::o;19969:419::-;;20173:2;20162:9;20158:18;20150:26;;20222:9;20216:4;20212:20;20208:1;20197:9;20193:17;20186:47;20250:131;20376:4;20250:131;:::i;:::-;20242:139;;20140:248;;;:::o;20394:419::-;;20598:2;20587:9;20583:18;20575:26;;20647:9;20641:4;20637:20;20633:1;20622:9;20618:17;20611:47;20675:131;20801:4;20675:131;:::i;:::-;20667:139;;20565:248;;;:::o;20819:419::-;;21023:2;21012:9;21008:18;21000:26;;21072:9;21066:4;21062:20;21058:1;21047:9;21043:17;21036:47;21100:131;21226:4;21100:131;:::i;:::-;21092:139;;20990:248;;;:::o;21244:419::-;;21448:2;21437:9;21433:18;21425:26;;21497:9;21491:4;21487:20;21483:1;21472:9;21468:17;21461:47;21525:131;21651:4;21525:131;:::i;:::-;21517:139;;21415:248;;;:::o;21669:419::-;;21873:2;21862:9;21858:18;21850:26;;21922:9;21916:4;21912:20;21908:1;21897:9;21893:17;21886:47;21950:131;22076:4;21950:131;:::i;:::-;21942:139;;21840:248;;;:::o;22094:419::-;;22298:2;22287:9;22283:18;22275:26;;22347:9;22341:4;22337:20;22333:1;22322:9;22318:17;22311:47;22375:131;22501:4;22375:131;:::i;:::-;22367:139;;22265:248;;;:::o;22519:419::-;;22723:2;22712:9;22708:18;22700:26;;22772:9;22766:4;22762:20;22758:1;22747:9;22743:17;22736:47;22800:131;22926:4;22800:131;:::i;:::-;22792:139;;22690:248;;;:::o;22944:419::-;;23148:2;23137:9;23133:18;23125:26;;23197:9;23191:4;23187:20;23183:1;23172:9;23168:17;23161:47;23225:131;23351:4;23225:131;:::i;:::-;23217:139;;23115:248;;;:::o;23369:419::-;;23573:2;23562:9;23558:18;23550:26;;23622:9;23616:4;23612:20;23608:1;23597:9;23593:17;23586:47;23650:131;23776:4;23650:131;:::i;:::-;23642:139;;23540:248;;;:::o;23794:419::-;;23998:2;23987:9;23983:18;23975:26;;24047:9;24041:4;24037:20;24033:1;24022:9;24018:17;24011:47;24075:131;24201:4;24075:131;:::i;:::-;24067:139;;23965:248;;;:::o;24219:419::-;;24423:2;24412:9;24408:18;24400:26;;24472:9;24466:4;24462:20;24458:1;24447:9;24443:17;24436:47;24500:131;24626:4;24500:131;:::i;:::-;24492:139;;24390:248;;;:::o;24644:419::-;;24848:2;24837:9;24833:18;24825:26;;24897:9;24891:4;24887:20;24883:1;24872:9;24868:17;24861:47;24925:131;25051:4;24925:131;:::i;:::-;24917:139;;24815:248;;;:::o;25069:419::-;;25273:2;25262:9;25258:18;25250:26;;25322:9;25316:4;25312:20;25308:1;25297:9;25293:17;25286:47;25350:131;25476:4;25350:131;:::i;:::-;25342:139;;25240:248;;;:::o;25494:419::-;;25698:2;25687:9;25683:18;25675:26;;25747:9;25741:4;25737:20;25733:1;25722:9;25718:17;25711:47;25775:131;25901:4;25775:131;:::i;:::-;25767:139;;25665:248;;;:::o;25919:419::-;;26123:2;26112:9;26108:18;26100:26;;26172:9;26166:4;26162:20;26158:1;26147:9;26143:17;26136:47;26200:131;26326:4;26200:131;:::i;:::-;26192:139;;26090:248;;;:::o;26344:419::-;;26548:2;26537:9;26533:18;26525:26;;26597:9;26591:4;26587:20;26583:1;26572:9;26568:17;26561:47;26625:131;26751:4;26625:131;:::i;:::-;26617:139;;26515:248;;;:::o;26769:419::-;;26973:2;26962:9;26958:18;26950:26;;27022:9;27016:4;27012:20;27008:1;26997:9;26993:17;26986:47;27050:131;27176:4;27050:131;:::i;:::-;27042:139;;26940:248;;;:::o;27194:419::-;;27398:2;27387:9;27383:18;27375:26;;27447:9;27441:4;27437:20;27433:1;27422:9;27418:17;27411:47;27475:131;27601:4;27475:131;:::i;:::-;27467:139;;27365:248;;;:::o;27619:419::-;;27823:2;27812:9;27808:18;27800:26;;27872:9;27866:4;27862:20;27858:1;27847:9;27843:17;27836:47;27900:131;28026:4;27900:131;:::i;:::-;27892:139;;27790:248;;;:::o;28044:419::-;;28248:2;28237:9;28233:18;28225:26;;28297:9;28291:4;28287:20;28283:1;28272:9;28268:17;28261:47;28325:131;28451:4;28325:131;:::i;:::-;28317:139;;28215:248;;;:::o;28469:222::-;;28600:2;28589:9;28585:18;28577:26;;28613:71;28681:1;28670:9;28666:17;28657:6;28613:71;:::i;:::-;28567:124;;;;:::o;28697:283::-;;28763:2;28757:9;28747:19;;28805:4;28797:6;28793:17;28912:6;28900:10;28897:22;28876:18;28864:10;28861:34;28858:62;28855:2;;;28923:18;;:::i;:::-;28855:2;28963:10;28959:2;28952:22;28737:243;;;;:::o;28986:331::-;;29137:18;29129:6;29126:30;29123:2;;;29159:18;;:::i;:::-;29123:2;29244:4;29240:9;29233:4;29225:6;29221:17;29217:33;29209:41;;29305:4;29299;29295:15;29287:23;;29052:265;;;:::o;29323:332::-;;29475:18;29467:6;29464:30;29461:2;;;29497:18;;:::i;:::-;29461:2;29582:4;29578:9;29571:4;29563:6;29559:17;29555:33;29547:41;;29643:4;29637;29633:15;29625:23;;29390:265;;;:::o;29661:98::-;;29746:5;29740:12;29730:22;;29719:40;;;:::o;29765:99::-;;29851:5;29845:12;29835:22;;29824:40;;;:::o;29870:168::-;;29987:6;29982:3;29975:19;30027:4;30022:3;30018:14;30003:29;;29965:73;;;;:::o;30044:169::-;;30162:6;30157:3;30150:19;30202:4;30197:3;30193:14;30178:29;;30140:73;;;;:::o;30219:148::-;;30358:3;30343:18;;30333:34;;;;:::o;30373:305::-;;30432:20;30450:1;30432:20;:::i;:::-;30427:25;;30466:20;30484:1;30466:20;:::i;:::-;30461:25;;30620:1;30552:66;30548:74;30545:1;30542:81;30539:2;;;30626:18;;:::i;:::-;30539:2;30670:1;30667;30663:9;30656:16;;30417:261;;;;:::o;30684:185::-;;30741:20;30759:1;30741:20;:::i;:::-;30736:25;;30775:20;30793:1;30775:20;:::i;:::-;30770:25;;30814:1;30804:2;;30819:18;;:::i;:::-;30804:2;30861:1;30858;30854:9;30849:14;;30726:143;;;;:::o;30875:348::-;;30938:20;30956:1;30938:20;:::i;:::-;30933:25;;30972:20;30990:1;30972:20;:::i;:::-;30967:25;;31160:1;31092:66;31088:74;31085:1;31082:81;31077:1;31070:9;31063:17;31059:105;31056:2;;;31167:18;;:::i;:::-;31056:2;31215:1;31212;31208:9;31197:20;;30923:300;;;;:::o;31229:191::-;;31289:20;31307:1;31289:20;:::i;:::-;31284:25;;31323:20;31341:1;31323:20;:::i;:::-;31318:25;;31362:1;31359;31356:8;31353:2;;;31367:18;;:::i;:::-;31353:2;31412:1;31409;31405:9;31397:17;;31274:146;;;;:::o;31426:96::-;;31492:24;31510:5;31492:24;:::i;:::-;31481:35;;31471:51;;;:::o;31528:90::-;;31605:5;31598:13;31591:21;31580:32;;31570:48;;;:::o;31624:149::-;;31700:66;31693:5;31689:78;31678:89;;31668:105;;;:::o;31779:126::-;;31856:42;31849:5;31845:54;31834:65;;31824:81;;;:::o;31911:77::-;;31977:5;31966:16;;31956:32;;;:::o;31994:154::-;32078:6;32073:3;32068;32055:30;32140:1;32131:6;32126:3;32122:16;32115:27;32045:103;;;:::o;32154:307::-;32222:1;32232:113;32246:6;32243:1;32240:13;32232:113;;;32331:1;32326:3;32322:11;32316:18;32312:1;32307:3;32303:11;32296:39;32268:2;32265:1;32261:10;32256:15;;32232:113;;;32363:6;32360:1;32357:13;32354:2;;;32443:1;32434:6;32429:3;32425:16;32418:27;32354:2;32203:258;;;;:::o;32467:320::-;;32548:1;32542:4;32538:12;32528:22;;32595:1;32589:4;32585:12;32616:18;32606:2;;32672:4;32664:6;32660:17;32650:27;;32606:2;32734;32726:6;32723:14;32703:18;32700:38;32697:2;;;32753:18;;:::i;:::-;32697:2;32518:269;;;;:::o;32793:233::-;;32855:24;32873:5;32855:24;:::i;:::-;32846:33;;32901:66;32894:5;32891:77;32888:2;;;32971:18;;:::i;:::-;32888:2;33018:1;33011:5;33007:13;33000:20;;32836:190;;;:::o;33032:176::-;;33081:20;33099:1;33081:20;:::i;:::-;33076:25;;33115:20;33133:1;33115:20;:::i;:::-;33110:25;;33154:1;33144:2;;33159:18;;:::i;:::-;33144:2;33200:1;33197;33193:9;33188:14;;33066:142;;;;:::o;33214:180::-;33262:77;33259:1;33252:88;33359:4;33356:1;33349:15;33383:4;33380:1;33373:15;33400:180;33448:77;33445:1;33438:88;33545:4;33542:1;33535:15;33569:4;33566:1;33559:15;33586:180;33634:77;33631:1;33624:88;33731:4;33728:1;33721:15;33755:4;33752:1;33745:15;33772:180;33820:77;33817:1;33810:88;33917:4;33914:1;33907:15;33941:4;33938:1;33931:15;33958:102;;34050:2;34046:7;34041:2;34034:5;34030:14;34026:28;34016:38;;34006:54;;;:::o;34066:122::-;34139:24;34157:5;34139:24;:::i;:::-;34132:5;34129:35;34119:2;;34178:1;34175;34168:12;34119:2;34109:79;:::o;34194:116::-;34264:21;34279:5;34264:21;:::i;:::-;34257:5;34254:32;34244:2;;34300:1;34297;34290:12;34244:2;34234:76;:::o;34316:120::-;34388:23;34405:5;34388:23;:::i;:::-;34381:5;34378:34;34368:2;;34426:1;34423;34416:12;34368:2;34358:78;:::o;34442:122::-;34515:24;34533:5;34515:24;:::i;:::-;34508:5;34505:35;34495:2;;34554:1;34551;34544:12;34495:2;34485:79;:::o
Swarm Source
ipfs://12901437f0eb0fd0927cb583f649ef5555e303662ec06170017901339bca1af2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.