Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
10,000 SRLS
Holders
4,793
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 SRLSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Surreals
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-01 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/introspection/IERC165.sol /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; 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"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/utils/Strings.sol /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public 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.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: contracts/Surreals.sol contract Surreals is ERC721("The Surreals", "SRLS"), Ownable { using ECDSA for bytes32; uint256 public constant MAX_PER_CALL = 7; uint256 public constant MAX_PER_WHITELIST = 3; uint256 public constant MAX_SUPPLY = 10000; uint256 public constant MINT_PRICE = 0.06e18; uint256 public constant WHITELIST_RESERVED = 2772; address internal constant _signer = 0x0190501d46a402020c75C2bD626c9b104DcC89a7; address internal constant _artist = 0xe20A4f1E92DC89C17388886d37B2ed58f07e2F29; string internal _baseUri; uint256 public whitelistStartTimestamp; uint256 public saleStartTimestamp; uint256 public totalSupply; uint256 public whitelistMinted; mapping(bytes32 => bool) internal _usedNonces; mapping(address => bool) public isWhitelisted; mapping(address => uint256) public whitelistMintedAmounts; function mint(bytes32 hash, bytes memory signature, bytes32 nonce, uint256 amount) external payable { require(amount != 0, "INVALID_AMOUNT"); require(isSaleOpen(), "SALE_CLOSED"); require(hash.recover(signature) == _signer, "INVALID_SIGNATURE"); require(!_usedNonces[nonce], "NONCE_USED"); require(_hashMatches(hash, msg.sender, nonce, amount), "INVALID_HASH"); require(amount <= MAX_PER_CALL, "AMOUNT_EXCEEDS_MAX_PER_CALL"); require(amount * MINT_PRICE == msg.value, "WRONG_ETH_AMOUNT"); uint256 newSupply = totalSupply + amount; require(newSupply <= MAX_SUPPLY, "MAX_SUPPLY_EXCEEDED"); for (uint256 i = 0; i < amount; i++) { _mint(msg.sender, totalSupply + i); } totalSupply = newSupply; _usedNonces[nonce] = true; } function mintWhitelist(uint256 amount) external payable { require(amount != 0, "INVALID_AMOUNT"); require(isWhitelistOpen(), "WHITELIST_DISABLED"); require(isWhitelisted[msg.sender], "NOT_WHITELISTED"); require(amount * MINT_PRICE == msg.value, "WRONG_ETH_AMOUNT"); uint256 userMintedAmount = whitelistMintedAmounts[msg.sender] + amount; require(userMintedAmount <= MAX_PER_WHITELIST, "MAX_EXCEEDED"); uint256 newSupply = whitelistMinted + amount; require(newSupply <= WHITELIST_RESERVED, "NAX_WHITELIST_EXCEEDED"); for (uint256 i = 0; i < amount; i++) { _mint(msg.sender, totalSupply + i); } totalSupply += amount; whitelistMinted = newSupply; whitelistMintedAmounts[msg.sender] = userMintedAmount; } function isSaleOpen() public view returns (bool) { return block.timestamp >= saleStartTimestamp && saleStartTimestamp != 0; } function isWhitelistOpen() public view returns (bool) { return !isSaleOpen() && block.timestamp >= whitelistStartTimestamp && whitelistStartTimestamp != 0; } function mintOwner(address to, uint256 amount) external onlyOwner { uint256 newSupply = totalSupply + amount; require(newSupply <= MAX_SUPPLY, "MAX_SUPPLY_EXCEEDED"); for (uint256 i = 0; i < amount; i++) { _mint(to, totalSupply + i); } totalSupply = newSupply; } function addToWhitelist(address[] memory toWhitelist) external onlyOwner { for (uint256 i = 0; i < toWhitelist.length; i++) { isWhitelisted[toWhitelist[i]] = true; } } function removeFromWhitelist(address[] memory toRemove) external onlyOwner { for (uint256 i = 0; i < toRemove.length; i++) { isWhitelisted[toRemove[i]] = false; } } function setSaleTimestamp(uint256 timestamp) external onlyOwner { saleStartTimestamp = timestamp; } function setWhitelistTimestamp(uint256 timestamp) external onlyOwner { whitelistStartTimestamp = timestamp; } function setBaseURI(string memory uri) external onlyOwner { _baseUri = uri; } function withdrawETH() external onlyOwner { uint256 ownerShare = address(this).balance * 35 / 100; payable(owner()).transfer(ownerShare); payable(_artist).transfer(address(this).balance); } function _hashMatches(bytes32 hash, address sender, bytes32 nonce, uint256 amount) internal pure returns (bool) { return hash == keccak256(abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(sender, amount, nonce))) ); } function _baseURI() internal override view returns (string memory) { return _baseUri; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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_PER_CALL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WHITELIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"toWhitelist","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintWhitelist","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":[{"internalType":"address[]","name":"toRemove","type":"address[]"}],"name":"removeFromWhitelist","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":"saleStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setSaleTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setWhitelistTimestamp","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":"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":"whitelistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintedAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252600c81526b546865205375727265616c7360a01b60208083019182528351808501909452600484526353524c5360e01b9084015281519192916200006291600091620000f1565b50805162000078906001906020840190620000f1565b505050620000956200008f6200009b60201b60201c565b6200009f565b620001d4565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000ff9062000197565b90600052602060002090601f0160209004810192826200012357600085556200016e565b82601f106200013e57805160ff19168380011785556200016e565b828001600101855582156200016e579182015b828111156200016e57825182559160200191906001019062000151565b506200017c92915062000180565b5090565b5b808211156200017c576000815560010162000181565b600181811c90821680620001ac57607f821691505b60208210811415620001ce57634e487b7160e01b600052602260045260246000fd5b50919050565b61377080620001e46000396000f3fe6080604052600436106102855760003560e01c80637a1cbd3f11610153578063b88d4fde116100cb578063dad95f921161007f578063e985e9c511610064578063e985e9c5146106c1578063ea156a9b14610717578063f2fde38b1461072c57600080fd5b8063dad95f921461067f578063e086e5ec146106ac57600080fd5b8063c002d23d116100b0578063c002d23d1461062e578063c2e8953a14610649578063c87b56dd1461065f57600080fd5b8063b88d4fde146105ee578063ba98cadb1461060e57600080fd5b80638da5cb5b1161012257806395d89b411161010757806395d89b41146105a35780639ecfab9b146105b8578063a22cb465146105ce57600080fd5b80638da5cb5b1461056357806394f4504d1461058e57600080fd5b80637a1cbd3f146104fa5780637f6497831461051a578063820951fe1461053a5780638990694f1461054d57600080fd5b80633af32abf11610201578063548db174116101b55780636352211e1161019a5780636352211e146104a557806370a08231146104c5578063715018a6146104e557600080fd5b8063548db1741461046557806355f804b31461048557600080fd5b8063408cbf94116101e6578063408cbf941461041257806342842e0e146104325780634618163e1461045257600080fd5b80633af32abf146103cc5780633c276d86146103fc57600080fd5b806318160ddd1161025857806323b872dd1161023d57806323b872dd146103815780632e036768146103a157806332cb6b0c146103b657600080fd5b806318160ddd146103485780631a0813301461036c57600080fd5b806301ffc9a71461028a57806306fdde03146102bf578063081812fc146102e1578063095ea7b314610326575b600080fd5b34801561029657600080fd5b506102aa6102a5366004613314565b61074c565b60405190151581526020015b60405180910390f35b3480156102cb57600080fd5b506102d4610831565b6040516102b69190613472565b3480156102ed57600080fd5b506103016102fc366004613397565b6108c3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102b6565b34801561033257600080fd5b506103466103413660046131df565b6109a2565b005b34801561035457600080fd5b5061035e600a5481565b6040519081526020016102b6565b34801561037857600080fd5b506102aa610b2f565b34801561038d57600080fd5b5061034661039c3660046130ff565b610b49565b3480156103ad57600080fd5b5061035e600381565b3480156103c257600080fd5b5061035e61271081565b3480156103d857600080fd5b506102aa6103e73660046130b1565b600d6020526000908152604090205460ff1681565b34801561040857600080fd5b5061035e60095481565b34801561041e57600080fd5b5061034661042d3660046131df565b610bea565b34801561043e57600080fd5b5061034661044d3660046130ff565b610d25565b610346610460366004613397565b610d40565b34801561047157600080fd5b50610346610480366004613209565b61106a565b34801561049157600080fd5b506103466104a036600461334e565b611182565b3480156104b157600080fd5b506103016104c0366004613397565b611216565b3480156104d157600080fd5b5061035e6104e03660046130b1565b6112c8565b3480156104f157600080fd5b50610346611396565b34801561050657600080fd5b50610346610515366004613397565b611423565b34801561052657600080fd5b50610346610535366004613209565b6114a9565b6103466105483660046132bd565b6115bd565b34801561055957600080fd5b5061035e600b5481565b34801561056f57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff16610301565b34801561059a57600080fd5b506102aa611a7e565b3480156105af57600080fd5b506102d4611aa7565b3480156105c457600080fd5b5061035e60085481565b3480156105da57600080fd5b506103466105e93660046131a3565b611ab6565b3480156105fa57600080fd5b5061034661060936600461313b565b611bcd565b34801561061a57600080fd5b50610346610629366004613397565b611c75565b34801561063a57600080fd5b5061035e66d529ae9e86000081565b34801561065557600080fd5b5061035e610ad481565b34801561066b57600080fd5b506102d461067a366004613397565b611cfb565b34801561068b57600080fd5b5061035e61069a3660046130b1565b600e6020526000908152604090205481565b3480156106b857600080fd5b50610346611e0b565b3480156106cd57600080fd5b506102aa6106dc3660046130cc565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561072357600080fd5b5061035e600781565b34801561073857600080fd5b506103466107473660046130b1565b611f4c565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806107df57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061082b57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606000805461084090613580565b80601f016020809104026020016040519081016040528092919081815260200182805461086c90613580565b80156108b95780601f1061088e576101008083540402835291602001916108b9565b820191906000526020600020905b81548152906001019060200180831161089c57829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16610979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006109ad82611216565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610970565b3373ffffffffffffffffffffffffffffffffffffffff82161480610a945750610a9481336106dc565b610b20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610970565b610b2a838361207c565b505050565b60006009544210158015610b44575060095415155b905090565b610b53338261211c565b610bdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610970565b610b2a83838361228c565b60065473ffffffffffffffffffffffffffffffffffffffff163314610c6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b600081600a54610c7b91906134d4565b9050612710811115610ce9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4d41585f535550504c595f4558434545444544000000000000000000000000006044820152606401610970565b60005b82811015610d1d57610d0b8482600a54610d0691906134d4565b6124f3565b80610d15816135d4565b915050610cec565b50600a555050565b610b2a83838360405180602001604052806000815250611bcd565b80610da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f414d4f554e540000000000000000000000000000000000006044820152606401610970565b610daf611a7e565b610e15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f57484954454c4953545f44495341424c454400000000000000000000000000006044820152606401610970565b336000908152600d602052604090205460ff16610e8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e4f545f57484954454c495354454400000000000000000000000000000000006044820152606401610970565b34610ea066d529ae9e86000083613500565b14610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f57524f4e475f4554485f414d4f554e54000000000000000000000000000000006044820152606401610970565b336000908152600e6020526040812054610f229083906134d4565b90506003811115610f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4d41585f455843454544454400000000000000000000000000000000000000006044820152606401610970565b600082600b54610f9f91906134d4565b9050610ad481111561100d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e41585f57484954454c4953545f4558434545444544000000000000000000006044820152606401610970565b60005b8381101561103c5761102a3382600a54610d0691906134d4565b80611034816135d4565b915050611010565b5082600a600082825461104f91906134d4565b9091555050600b55336000908152600e602052604090205550565b60065473ffffffffffffffffffffffffffffffffffffffff1633146110eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b60005b815181101561117e576000600d600084848151811061110f5761110f6136ae565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905580611176816135d4565b9150506110ee565b5050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b805161117e906007906020840190612f59565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff168061082b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610970565b600073ffffffffffffffffffffffffffffffffffffffff821661136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610970565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60065473ffffffffffffffffffffffffffffffffffffffff163314611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b61142160006126b5565b565b60065473ffffffffffffffffffffffffffffffffffffffff1633146114a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b600955565b60065473ffffffffffffffffffffffffffffffffffffffff16331461152a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b60005b815181101561117e576001600d600084848151811061154e5761154e6136ae565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806115b5816135d4565b91505061152d565b80611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f414d4f554e540000000000000000000000000000000000006044820152606401610970565b61162c610b2f565b611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f53414c455f434c4f5345440000000000000000000000000000000000000000006044820152606401610970565b730190501d46a402020c75c2bd626c9b104dcc89a76116b1858561272c565b73ffffffffffffffffffffffffffffffffffffffff161461172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f5349474e41545552450000000000000000000000000000006044820152606401610970565b6000828152600c602052604090205460ff16156117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e4f4e43455f55534544000000000000000000000000000000000000000000006044820152606401610970565b604080513360601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602080830191909152603482018490526054808301869052835180840390910181526074830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a333200000000609484015260b0808401919091528351808403909101815260d0909201909252805191012084146118ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f494e56414c49445f4841534800000000000000000000000000000000000000006044820152606401610970565b6007811115611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f414d4f554e545f455843454544535f4d41585f5045525f43414c4c00000000006044820152606401610970565b3461192a66d529ae9e86000083613500565b14611991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f57524f4e475f4554485f414d4f554e54000000000000000000000000000000006044820152606401610970565b600081600a546119a191906134d4565b9050612710811115611a0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4d41585f535550504c595f4558434545444544000000000000000000000000006044820152606401610970565b60005b82811015611a3e57611a2c3382600a54610d0691906134d4565b80611a36816135d4565b915050611a12565b50600a55506000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050565b6000611a88610b2f565b158015611a9757506008544210155b8015610b44575050600854151590565b60606001805461084090613580565b73ffffffffffffffffffffffffffffffffffffffff8216331415611b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610970565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611bd7338361211c565b611c63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610970565b611c6f84848484612750565b50505050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611cf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b600855565b60008181526002602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16611daf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610970565b6000611db96127f3565b90506000815111611dd95760405180602001604052806000815250611e04565b80611de384612802565b604051602001611df49291906133fa565b6040516020818303038152906040525b9392505050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611e8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b60006064611e9b476023613500565b611ea591906134ec565b9050611ec660065473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611f0b573d6000803e3d6000fd5b5060405173e20a4f1e92dc89c17388886d37b2ed58f07e2f29904780156108fc02916000818181858888f1935050505015801561117e573d6000803e3d6000fd5b60065473ffffffffffffffffffffffffffffffffffffffff163314611fcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b73ffffffffffffffffffffffffffffffffffffffff8116612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610970565b612079816126b5565b50565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906120d682611216565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166121cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610970565b60006121d883611216565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061224757508373ffffffffffffffffffffffffffffffffffffffff1661222f846108c3565b73ffffffffffffffffffffffffffffffffffffffff16145b80612284575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff166122ac82611216565b73ffffffffffffffffffffffffffffffffffffffff161461234f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610970565b73ffffffffffffffffffffffffffffffffffffffff82166123f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610970565b6123fc60008261207c565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546001929061243290849061353d565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080546001929061246d9084906134d4565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b73ffffffffffffffffffffffffffffffffffffffff8216612570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610970565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156125fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610970565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906126329084906134d4565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6006805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080600061273b8585612934565b91509150612748816129a4565b509392505050565b61275b84848461228c565b61276784848484612bfd565b611c6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610970565b60606007805461084090613580565b60608161284257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561286c5780612856816135d4565b91506128659050600a836134ec565b9150612846565b60008167ffffffffffffffff811115612887576128876136dd565b6040519080825280601f01601f1916602001820160405280156128b1576020820181803683370190505b5090505b8415612284576128c660018361353d565b91506128d3600a8661360d565b6128de9060306134d4565b60f81b8183815181106128f3576128f36136ae565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061292d600a866134ec565b94506128b5565b60008082516041141561296b5760208301516040840151606085015160001a61295f87828585612df9565b9450945050505061299d565b825160401415612995576020830151604084015161298a868383612f11565b93509350505061299d565b506000905060025b9250929050565b60008160048111156129b8576129b861367f565b14156129c15750565b60018160048111156129d5576129d561367f565b1415612a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610970565b6002816004811115612a5157612a5161367f565b1415612ab9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610970565b6003816004811115612acd57612acd61367f565b1415612b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610970565b6004816004811115612b6f57612b6f61367f565b1415612079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610970565b600073ffffffffffffffffffffffffffffffffffffffff84163b15612df1576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612c74903390899088908890600401613429565b602060405180830381600087803b158015612c8e57600080fd5b505af1925050508015612cdc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612cd991810190613331565b60015b612da6573d808015612d0a576040519150601f19603f3d011682016040523d82523d6000602084013e612d0f565b606091505b508051612d9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610970565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612284565b506001612284565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612e305750600090506003612f08565b8460ff16601b14158015612e4857508460ff16601c14155b15612e595750600090506004612f08565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612ead573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612f0157600060019250925050612f08565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b01612f4b87828885612df9565b935093505050935093915050565b828054612f6590613580565b90600052602060002090601f016020900481019282612f875760008555612fcd565b82601f10612fa057805160ff1916838001178555612fcd565b82800160010185558215612fcd579182015b82811115612fcd578251825591602001919060010190612fb2565b50612fd9929150612fdd565b5090565b5b80821115612fd95760008155600101612fde565b600067ffffffffffffffff83111561300c5761300c6136dd565b61303d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613485565b905082815283838301111561305157600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461308c57600080fd5b919050565b600082601f8301126130a257600080fd5b611e0483833560208501612ff2565b6000602082840312156130c357600080fd5b611e0482613068565b600080604083850312156130df57600080fd5b6130e883613068565b91506130f660208401613068565b90509250929050565b60008060006060848603121561311457600080fd5b61311d84613068565b925061312b60208501613068565b9150604084013590509250925092565b6000806000806080858703121561315157600080fd5b61315a85613068565b935061316860208601613068565b925060408501359150606085013567ffffffffffffffff81111561318b57600080fd5b61319787828801613091565b91505092959194509250565b600080604083850312156131b657600080fd5b6131bf83613068565b9150602083013580151581146131d457600080fd5b809150509250929050565b600080604083850312156131f257600080fd5b6131fb83613068565b946020939093013593505050565b6000602080838503121561321c57600080fd5b823567ffffffffffffffff8082111561323457600080fd5b818501915085601f83011261324857600080fd5b81358181111561325a5761325a6136dd565b8060051b915061326b848301613485565b8181528481019084860184860187018a101561328657600080fd5b600095505b838610156132b05761329c81613068565b83526001959095019491860191860161328b565b5098975050505050505050565b600080600080608085870312156132d357600080fd5b84359350602085013567ffffffffffffffff8111156132f157600080fd5b6132fd87828801613091565b949794965050505060408301359260600135919050565b60006020828403121561332657600080fd5b8135611e048161370c565b60006020828403121561334357600080fd5b8151611e048161370c565b60006020828403121561336057600080fd5b813567ffffffffffffffff81111561337757600080fd5b8201601f8101841361338857600080fd5b61228484823560208401612ff2565b6000602082840312156133a957600080fd5b5035919050565b600081518084526133c8816020860160208601613554565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000835161340c818460208801613554565b835190830190613420818360208801613554565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261346860808301846133b0565b9695505050505050565b602081526000611e0460208301846133b0565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134cc576134cc6136dd565b604052919050565b600082198211156134e7576134e7613621565b500190565b6000826134fb576134fb613650565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561353857613538613621565b500290565b60008282101561354f5761354f613621565b500390565b60005b8381101561356f578181015183820152602001613557565b83811115611c6f5750506000910152565b600181811c9082168061359457607f821691505b602082108114156135ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561360657613606613621565b5060010190565b60008261361c5761361c613650565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461207957600080fdfea2646970667358221220fc6900cd32448a2ca07f33d000553eb8226453762f848c63b00d5d42633ab37c64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102855760003560e01c80637a1cbd3f11610153578063b88d4fde116100cb578063dad95f921161007f578063e985e9c511610064578063e985e9c5146106c1578063ea156a9b14610717578063f2fde38b1461072c57600080fd5b8063dad95f921461067f578063e086e5ec146106ac57600080fd5b8063c002d23d116100b0578063c002d23d1461062e578063c2e8953a14610649578063c87b56dd1461065f57600080fd5b8063b88d4fde146105ee578063ba98cadb1461060e57600080fd5b80638da5cb5b1161012257806395d89b411161010757806395d89b41146105a35780639ecfab9b146105b8578063a22cb465146105ce57600080fd5b80638da5cb5b1461056357806394f4504d1461058e57600080fd5b80637a1cbd3f146104fa5780637f6497831461051a578063820951fe1461053a5780638990694f1461054d57600080fd5b80633af32abf11610201578063548db174116101b55780636352211e1161019a5780636352211e146104a557806370a08231146104c5578063715018a6146104e557600080fd5b8063548db1741461046557806355f804b31461048557600080fd5b8063408cbf94116101e6578063408cbf941461041257806342842e0e146104325780634618163e1461045257600080fd5b80633af32abf146103cc5780633c276d86146103fc57600080fd5b806318160ddd1161025857806323b872dd1161023d57806323b872dd146103815780632e036768146103a157806332cb6b0c146103b657600080fd5b806318160ddd146103485780631a0813301461036c57600080fd5b806301ffc9a71461028a57806306fdde03146102bf578063081812fc146102e1578063095ea7b314610326575b600080fd5b34801561029657600080fd5b506102aa6102a5366004613314565b61074c565b60405190151581526020015b60405180910390f35b3480156102cb57600080fd5b506102d4610831565b6040516102b69190613472565b3480156102ed57600080fd5b506103016102fc366004613397565b6108c3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102b6565b34801561033257600080fd5b506103466103413660046131df565b6109a2565b005b34801561035457600080fd5b5061035e600a5481565b6040519081526020016102b6565b34801561037857600080fd5b506102aa610b2f565b34801561038d57600080fd5b5061034661039c3660046130ff565b610b49565b3480156103ad57600080fd5b5061035e600381565b3480156103c257600080fd5b5061035e61271081565b3480156103d857600080fd5b506102aa6103e73660046130b1565b600d6020526000908152604090205460ff1681565b34801561040857600080fd5b5061035e60095481565b34801561041e57600080fd5b5061034661042d3660046131df565b610bea565b34801561043e57600080fd5b5061034661044d3660046130ff565b610d25565b610346610460366004613397565b610d40565b34801561047157600080fd5b50610346610480366004613209565b61106a565b34801561049157600080fd5b506103466104a036600461334e565b611182565b3480156104b157600080fd5b506103016104c0366004613397565b611216565b3480156104d157600080fd5b5061035e6104e03660046130b1565b6112c8565b3480156104f157600080fd5b50610346611396565b34801561050657600080fd5b50610346610515366004613397565b611423565b34801561052657600080fd5b50610346610535366004613209565b6114a9565b6103466105483660046132bd565b6115bd565b34801561055957600080fd5b5061035e600b5481565b34801561056f57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff16610301565b34801561059a57600080fd5b506102aa611a7e565b3480156105af57600080fd5b506102d4611aa7565b3480156105c457600080fd5b5061035e60085481565b3480156105da57600080fd5b506103466105e93660046131a3565b611ab6565b3480156105fa57600080fd5b5061034661060936600461313b565b611bcd565b34801561061a57600080fd5b50610346610629366004613397565b611c75565b34801561063a57600080fd5b5061035e66d529ae9e86000081565b34801561065557600080fd5b5061035e610ad481565b34801561066b57600080fd5b506102d461067a366004613397565b611cfb565b34801561068b57600080fd5b5061035e61069a3660046130b1565b600e6020526000908152604090205481565b3480156106b857600080fd5b50610346611e0b565b3480156106cd57600080fd5b506102aa6106dc3660046130cc565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561072357600080fd5b5061035e600781565b34801561073857600080fd5b506103466107473660046130b1565b611f4c565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806107df57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061082b57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606000805461084090613580565b80601f016020809104026020016040519081016040528092919081815260200182805461086c90613580565b80156108b95780601f1061088e576101008083540402835291602001916108b9565b820191906000526020600020905b81548152906001019060200180831161089c57829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16610979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006109ad82611216565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610970565b3373ffffffffffffffffffffffffffffffffffffffff82161480610a945750610a9481336106dc565b610b20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610970565b610b2a838361207c565b505050565b60006009544210158015610b44575060095415155b905090565b610b53338261211c565b610bdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610970565b610b2a83838361228c565b60065473ffffffffffffffffffffffffffffffffffffffff163314610c6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b600081600a54610c7b91906134d4565b9050612710811115610ce9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4d41585f535550504c595f4558434545444544000000000000000000000000006044820152606401610970565b60005b82811015610d1d57610d0b8482600a54610d0691906134d4565b6124f3565b80610d15816135d4565b915050610cec565b50600a555050565b610b2a83838360405180602001604052806000815250611bcd565b80610da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f414d4f554e540000000000000000000000000000000000006044820152606401610970565b610daf611a7e565b610e15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f57484954454c4953545f44495341424c454400000000000000000000000000006044820152606401610970565b336000908152600d602052604090205460ff16610e8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e4f545f57484954454c495354454400000000000000000000000000000000006044820152606401610970565b34610ea066d529ae9e86000083613500565b14610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f57524f4e475f4554485f414d4f554e54000000000000000000000000000000006044820152606401610970565b336000908152600e6020526040812054610f229083906134d4565b90506003811115610f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4d41585f455843454544454400000000000000000000000000000000000000006044820152606401610970565b600082600b54610f9f91906134d4565b9050610ad481111561100d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e41585f57484954454c4953545f4558434545444544000000000000000000006044820152606401610970565b60005b8381101561103c5761102a3382600a54610d0691906134d4565b80611034816135d4565b915050611010565b5082600a600082825461104f91906134d4565b9091555050600b55336000908152600e602052604090205550565b60065473ffffffffffffffffffffffffffffffffffffffff1633146110eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b60005b815181101561117e576000600d600084848151811061110f5761110f6136ae565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905580611176816135d4565b9150506110ee565b5050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b805161117e906007906020840190612f59565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff168061082b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610970565b600073ffffffffffffffffffffffffffffffffffffffff821661136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610970565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60065473ffffffffffffffffffffffffffffffffffffffff163314611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b61142160006126b5565b565b60065473ffffffffffffffffffffffffffffffffffffffff1633146114a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b600955565b60065473ffffffffffffffffffffffffffffffffffffffff16331461152a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b60005b815181101561117e576001600d600084848151811061154e5761154e6136ae565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806115b5816135d4565b91505061152d565b80611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f414d4f554e540000000000000000000000000000000000006044820152606401610970565b61162c610b2f565b611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f53414c455f434c4f5345440000000000000000000000000000000000000000006044820152606401610970565b730190501d46a402020c75c2bd626c9b104dcc89a76116b1858561272c565b73ffffffffffffffffffffffffffffffffffffffff161461172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f5349474e41545552450000000000000000000000000000006044820152606401610970565b6000828152600c602052604090205460ff16156117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e4f4e43455f55534544000000000000000000000000000000000000000000006044820152606401610970565b604080513360601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602080830191909152603482018490526054808301869052835180840390910181526074830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a333200000000609484015260b0808401919091528351808403909101815260d0909201909252805191012084146118ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f494e56414c49445f4841534800000000000000000000000000000000000000006044820152606401610970565b6007811115611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f414d4f554e545f455843454544535f4d41585f5045525f43414c4c00000000006044820152606401610970565b3461192a66d529ae9e86000083613500565b14611991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f57524f4e475f4554485f414d4f554e54000000000000000000000000000000006044820152606401610970565b600081600a546119a191906134d4565b9050612710811115611a0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4d41585f535550504c595f4558434545444544000000000000000000000000006044820152606401610970565b60005b82811015611a3e57611a2c3382600a54610d0691906134d4565b80611a36816135d4565b915050611a12565b50600a55506000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050565b6000611a88610b2f565b158015611a9757506008544210155b8015610b44575050600854151590565b60606001805461084090613580565b73ffffffffffffffffffffffffffffffffffffffff8216331415611b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610970565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611bd7338361211c565b611c63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610970565b611c6f84848484612750565b50505050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611cf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b600855565b60008181526002602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16611daf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610970565b6000611db96127f3565b90506000815111611dd95760405180602001604052806000815250611e04565b80611de384612802565b604051602001611df49291906133fa565b6040516020818303038152906040525b9392505050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611e8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b60006064611e9b476023613500565b611ea591906134ec565b9050611ec660065473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611f0b573d6000803e3d6000fd5b5060405173e20a4f1e92dc89c17388886d37b2ed58f07e2f29904780156108fc02916000818181858888f1935050505015801561117e573d6000803e3d6000fd5b60065473ffffffffffffffffffffffffffffffffffffffff163314611fcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610970565b73ffffffffffffffffffffffffffffffffffffffff8116612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610970565b612079816126b5565b50565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906120d682611216565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166121cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610970565b60006121d883611216565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061224757508373ffffffffffffffffffffffffffffffffffffffff1661222f846108c3565b73ffffffffffffffffffffffffffffffffffffffff16145b80612284575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff166122ac82611216565b73ffffffffffffffffffffffffffffffffffffffff161461234f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610970565b73ffffffffffffffffffffffffffffffffffffffff82166123f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610970565b6123fc60008261207c565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546001929061243290849061353d565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080546001929061246d9084906134d4565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b73ffffffffffffffffffffffffffffffffffffffff8216612570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610970565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156125fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610970565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906126329084906134d4565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6006805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080600061273b8585612934565b91509150612748816129a4565b509392505050565b61275b84848461228c565b61276784848484612bfd565b611c6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610970565b60606007805461084090613580565b60608161284257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561286c5780612856816135d4565b91506128659050600a836134ec565b9150612846565b60008167ffffffffffffffff811115612887576128876136dd565b6040519080825280601f01601f1916602001820160405280156128b1576020820181803683370190505b5090505b8415612284576128c660018361353d565b91506128d3600a8661360d565b6128de9060306134d4565b60f81b8183815181106128f3576128f36136ae565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061292d600a866134ec565b94506128b5565b60008082516041141561296b5760208301516040840151606085015160001a61295f87828585612df9565b9450945050505061299d565b825160401415612995576020830151604084015161298a868383612f11565b93509350505061299d565b506000905060025b9250929050565b60008160048111156129b8576129b861367f565b14156129c15750565b60018160048111156129d5576129d561367f565b1415612a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610970565b6002816004811115612a5157612a5161367f565b1415612ab9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610970565b6003816004811115612acd57612acd61367f565b1415612b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610970565b6004816004811115612b6f57612b6f61367f565b1415612079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610970565b600073ffffffffffffffffffffffffffffffffffffffff84163b15612df1576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612c74903390899088908890600401613429565b602060405180830381600087803b158015612c8e57600080fd5b505af1925050508015612cdc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612cd991810190613331565b60015b612da6573d808015612d0a576040519150601f19603f3d011682016040523d82523d6000602084013e612d0f565b606091505b508051612d9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610970565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612284565b506001612284565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612e305750600090506003612f08565b8460ff16601b14158015612e4857508460ff16601c14155b15612e595750600090506004612f08565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612ead573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612f0157600060019250925050612f08565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b01612f4b87828885612df9565b935093505050935093915050565b828054612f6590613580565b90600052602060002090601f016020900481019282612f875760008555612fcd565b82601f10612fa057805160ff1916838001178555612fcd565b82800160010185558215612fcd579182015b82811115612fcd578251825591602001919060010190612fb2565b50612fd9929150612fdd565b5090565b5b80821115612fd95760008155600101612fde565b600067ffffffffffffffff83111561300c5761300c6136dd565b61303d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613485565b905082815283838301111561305157600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461308c57600080fd5b919050565b600082601f8301126130a257600080fd5b611e0483833560208501612ff2565b6000602082840312156130c357600080fd5b611e0482613068565b600080604083850312156130df57600080fd5b6130e883613068565b91506130f660208401613068565b90509250929050565b60008060006060848603121561311457600080fd5b61311d84613068565b925061312b60208501613068565b9150604084013590509250925092565b6000806000806080858703121561315157600080fd5b61315a85613068565b935061316860208601613068565b925060408501359150606085013567ffffffffffffffff81111561318b57600080fd5b61319787828801613091565b91505092959194509250565b600080604083850312156131b657600080fd5b6131bf83613068565b9150602083013580151581146131d457600080fd5b809150509250929050565b600080604083850312156131f257600080fd5b6131fb83613068565b946020939093013593505050565b6000602080838503121561321c57600080fd5b823567ffffffffffffffff8082111561323457600080fd5b818501915085601f83011261324857600080fd5b81358181111561325a5761325a6136dd565b8060051b915061326b848301613485565b8181528481019084860184860187018a101561328657600080fd5b600095505b838610156132b05761329c81613068565b83526001959095019491860191860161328b565b5098975050505050505050565b600080600080608085870312156132d357600080fd5b84359350602085013567ffffffffffffffff8111156132f157600080fd5b6132fd87828801613091565b949794965050505060408301359260600135919050565b60006020828403121561332657600080fd5b8135611e048161370c565b60006020828403121561334357600080fd5b8151611e048161370c565b60006020828403121561336057600080fd5b813567ffffffffffffffff81111561337757600080fd5b8201601f8101841361338857600080fd5b61228484823560208401612ff2565b6000602082840312156133a957600080fd5b5035919050565b600081518084526133c8816020860160208601613554565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000835161340c818460208801613554565b835190830190613420818360208801613554565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261346860808301846133b0565b9695505050505050565b602081526000611e0460208301846133b0565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134cc576134cc6136dd565b604052919050565b600082198211156134e7576134e7613621565b500190565b6000826134fb576134fb613650565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561353857613538613621565b500290565b60008282101561354f5761354f613621565b500390565b60005b8381101561356f578181015183820152602001613557565b83811115611c6f5750506000910152565b600181811c9082168061359457607f821691505b602082108114156135ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561360657613606613621565b5060010190565b60008261361c5761361c613650565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461207957600080fdfea2646970667358221220fc6900cd32448a2ca07f33d000553eb8226453762f848c63b00d5d42633ab37c64736f6c63430008070033
Deployed Bytecode Sourcemap
43802:4682:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20424:305;;;;;;;;;;-1:-1:-1;20424:305:0;;;;;:::i;:::-;;:::i;:::-;;;7986:14:1;;7979:22;7961:41;;7949:2;7934:18;20424:305:0;;;;;;;;21369:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22928:221::-;;;;;;;;;;-1:-1:-1;22928:221:0;;;;;:::i;:::-;;:::i;:::-;;;7250:42:1;7238:55;;;7220:74;;7208:2;7193:18;22928:221:0;7074:226:1;22451:411:0;;;;;;;;;;-1:-1:-1;22451:411:0;;;;;:::i;:::-;;:::i;:::-;;44449:26;;;;;;;;;;;;;;;;;;;20828:25:1;;;20816:2;20801:18;44449:26:0;20682:177:1;46412:139:0;;;;;;;;;;;;;:::i;23818:339::-;;;;;;;;;;-1:-1:-1;23818:339:0;;;;;:::i;:::-;;:::i;43949:45::-;;;;;;;;;;;;43993:1;43949:45;;44001:42;;;;;;;;;;;;44038:5;44001:42;;44575:45;;;;;;;;;;-1:-1:-1;44575:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44409:33;;;;;;;;;;;;;;;;46738:329;;;;;;;;;;-1:-1:-1;46738:329:0;;;;;:::i;:::-;;:::i;24228:185::-;;;;;;;;;;-1:-1:-1;24228:185:0;;;;;:::i;:::-;;:::i;45560:844::-;;;;;;:::i;:::-;;:::i;47286:200::-;;;;;;;;;;-1:-1:-1;47286:200:0;;;;;:::i;:::-;;:::i;47746:91::-;;;;;;;;;;-1:-1:-1;47746:91:0;;;;;:::i;:::-;;:::i;21063:239::-;;;;;;;;;;-1:-1:-1;21063:239:0;;;;;:::i;:::-;;:::i;20793:208::-;;;;;;;;;;-1:-1:-1;20793:208:0;;;;;:::i;:::-;;:::i;34165:94::-;;;;;;;;;;;;;:::i;47494:113::-;;;;;;;;;;-1:-1:-1;47494:113:0;;;;;:::i;:::-;;:::i;47075:203::-;;;;;;;;;;-1:-1:-1;47075:203:0;;;;;:::i;:::-;;:::i;44693:859::-;;;;;;:::i;:::-;;:::i;44482:30::-;;;;;;;;;;;;;;;;33514:87;;;;;;;;;;-1:-1:-1;33587:6:0;;;;33514:87;;46559:171;;;;;;;;;;;;;:::i;21538:104::-;;;;;;;;;;;;;:::i;44364:38::-;;;;;;;;;;;;;;;;23221:295;;;;;;;;;;-1:-1:-1;23221:295:0;;;;;:::i;:::-;;:::i;24484:328::-;;;;;;;;;;-1:-1:-1;24484:328:0;;;;;:::i;:::-;;:::i;47615:123::-;;;;;;;;;;-1:-1:-1;47615:123:0;;;;;:::i;:::-;;:::i;44050:44::-;;;;;;;;;;;;44087:7;44050:44;;44101:49;;;;;;;;;;;;44146:4;44101:49;;21713:334;;;;;;;;;;-1:-1:-1;21713:334:0;;;;;:::i;:::-;;:::i;44627:57::-;;;;;;;;;;-1:-1:-1;44627:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;47845:221;;;;;;;;;;;;;:::i;23587:164::-;;;;;;;;;;-1:-1:-1;23587:164:0;;;;;:::i;:::-;23708:25;;;;23684:4;23708:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23587:164;43902:40;;;;;;;;;;;;43941:1;43902:40;;34414:192;;;;;;;;;;-1:-1:-1;34414:192:0;;;;;:::i;:::-;;:::i;20424:305::-;20526:4;20563:40;;;20578:25;20563:40;;:105;;-1:-1:-1;20620:48:0;;;20635:33;20620:48;20563:105;:158;;;-1:-1:-1;19085:25:0;19070:40;;;;20685:36;20543:178;20424:305;-1:-1:-1;;20424:305:0:o;21369:100::-;21423:13;21456:5;21449:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21369:100;:::o;22928:221::-;23004:7;26411:16;;;:7;:16;;;;;;:30;:16;23024:73;;;;;;;15704:2:1;23024:73:0;;;15686:21:1;15743:2;15723:18;;;15716:30;15782:34;15762:18;;;15755:62;15853:14;15833:18;;;15826:42;15885:19;;23024:73:0;;;;;;;;;-1:-1:-1;23117:24:0;;;;:15;:24;;;;;;;;;22928:221::o;22451:411::-;22532:13;22548:23;22563:7;22548:14;:23::i;:::-;22532:39;;22596:5;22590:11;;:2;:11;;;;22582:57;;;;;;;18329:2:1;22582:57:0;;;18311:21:1;18368:2;18348:18;;;18341:30;18407:34;18387:18;;;18380:62;18478:3;18458:18;;;18451:31;18499:19;;22582:57:0;18127:397:1;22582:57:0;16019:10;22674:21;;;;;:62;;-1:-1:-1;22699:37:0;22716:5;16019:10;23587:164;:::i;22699:37::-;22652:168;;;;;;;13694:2:1;22652:168:0;;;13676:21:1;13733:2;13713:18;;;13706:30;13772:34;13752:18;;;13745:62;13843:26;13823:18;;;13816:54;13887:19;;22652:168:0;13492:420:1;22652:168:0;22833:21;22842:2;22846:7;22833:8;:21::i;:::-;22521:341;22451:411;;:::o;46412:139::-;46455:4;46498:18;;46479:15;:37;;:64;;;;-1:-1:-1;46520:18:0;;:23;;46479:64;46472:71;;46412:139;:::o;23818:339::-;24013:41;16019:10;24046:7;24013:18;:41::i;:::-;24005:103;;;;;;;18731:2:1;24005:103:0;;;18713:21:1;18770:2;18750:18;;;18743:30;18809:34;18789:18;;;18782:62;18880:19;18860:18;;;18853:47;18917:19;;24005:103:0;18529:413:1;24005:103:0;24121:28;24131:4;24137:2;24141:7;24121:9;:28::i;46738:329::-;33587:6;;33734:23;33587:6;16019:10;33734:23;33726:68;;;;;;;16117:2:1;33726:68:0;;;16099:21:1;;;16136:18;;;16129:30;16195:34;16175:18;;;16168:62;16247:18;;33726:68:0;15915:356:1;33726:68:0;46815:17:::1;46849:6;46835:11;;:20;;;;:::i;:::-;46815:40;;44038:5;46874:9;:23;;46866:55;;;::::0;::::1;::::0;;11844:2:1;46866:55:0::1;::::0;::::1;11826:21:1::0;11883:2;11863:18;;;11856:30;11922:21;11902:18;;;11895:49;11961:18;;46866:55:0::1;11642:343:1::0;46866:55:0::1;46939:9;46934:90;46958:6;46954:1;:10;46934:90;;;46986:26;46992:2;47010:1;46996:11;;:15;;;;:::i;:::-;46986:5;:26::i;:::-;46966:3:::0;::::1;::::0;::::1;:::i;:::-;;;;46934:90;;;-1:-1:-1::0;47036:11:0::1;:23:::0;-1:-1:-1;;46738:329:0:o;24228:185::-;24366:39;24383:4;24389:2;24393:7;24366:39;;;;;;;;;;;;:16;:39::i;45560:844::-;45635:11;45627:38;;;;;;;20197:2:1;45627:38:0;;;20179:21:1;20236:2;20216:18;;;20209:30;20275:16;20255:18;;;20248:44;20309:18;;45627:38:0;19995:338:1;45627:38:0;45684:17;:15;:17::i;:::-;45676:48;;;;;;;9195:2:1;45676:48:0;;;9177:21:1;9234:2;9214:18;;;9207:30;9273:20;9253:18;;;9246:48;9311:18;;45676:48:0;8993:342:1;45676:48:0;45757:10;45743:25;;;;:13;:25;;;;;;;;45735:53;;;;;;;20540:2:1;45735:53:0;;;20522:21:1;20579:2;20559:18;;;20552:30;20618:17;20598:18;;;20591:45;20653:18;;45735:53:0;20338:339:1;45735:53:0;45830:9;45807:19;44087:7;45807:6;:19;:::i;:::-;:32;45799:61;;;;;;;16888:2:1;45799:61:0;;;16870:21:1;16927:2;16907:18;;;16900:30;16966:18;16946;;;16939:46;17002:18;;45799:61:0;16686:340:1;45799:61:0;45923:10;45873:24;45900:34;;;:22;:34;;;;;;:43;;45937:6;;45900:43;:::i;:::-;45873:70;;43993:1;45962:16;:37;;45954:62;;;;;;;17988:2:1;45954:62:0;;;17970:21:1;18027:2;18007:18;;;18000:30;18066:14;18046:18;;;18039:42;18098:18;;45954:62:0;17786:336:1;45954:62:0;46029:17;46067:6;46049:15;;:24;;;;:::i;:::-;46029:44;;44146:4;46092:9;:31;;46084:66;;;;;;;19505:2:1;46084:66:0;;;19487:21:1;19544:2;19524:18;;;19517:30;19583:24;19563:18;;;19556:52;19625:18;;46084:66:0;19303:346:1;46084:66:0;46168:9;46163:98;46187:6;46183:1;:10;46163:98;;;46215:34;46221:10;46247:1;46233:11;;:15;;;;:::i;46215:34::-;46195:3;;;;:::i;:::-;;;;46163:98;;;;46288:6;46273:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;46305:15:0;:27;46366:10;46343:34;;;;:22;:34;;;;;:53;-1:-1:-1;45560:844:0:o;47286:200::-;33587:6;;33734:23;33587:6;16019:10;33734:23;33726:68;;;;;;;16117:2:1;33726:68:0;;;16099:21:1;;;16136:18;;;16129:30;16195:34;16175:18;;;16168:62;16247:18;;33726:68:0;15915:356:1;33726:68:0;47377:9:::1;47372:107;47396:8;:15;47392:1;:19;47372:107;;;47462:5;47433:13;:26;47447:8;47456:1;47447:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;47433:26:::1;;::::0;;;::::1;::::0;;;;;;-1:-1:-1;47433:26:0;:34;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;47413:3;::::1;::::0;::::1;:::i;:::-;;;;47372:107;;;;47286:200:::0;:::o;47746:91::-;33587:6;;33734:23;33587:6;16019:10;33734:23;33726:68;;;;;;;16117:2:1;33726:68:0;;;16099:21:1;;;16136:18;;;16129:30;16195:34;16175:18;;;16168:62;16247:18;;33726:68:0;15915:356:1;33726:68:0;47815:14;;::::1;::::0;:8:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;21063:239::-:0;21135:7;21171:16;;;:7;:16;;;;;;;;21206:19;21198:73;;;;;;;14530:2:1;21198:73:0;;;14512:21:1;14569:2;14549:18;;;14542:30;14608:34;14588:18;;;14581:62;14679:11;14659:18;;;14652:39;14708:19;;21198:73:0;14328:405:1;20793:208:0;20865:7;20893:19;;;20885:74;;;;;;;14119:2:1;20885:74:0;;;14101:21:1;14158:2;14138:18;;;14131:30;14197:34;14177:18;;;14170:62;14268:12;14248:18;;;14241:40;14298:19;;20885:74:0;13917:406:1;20885:74:0;-1:-1:-1;20977:16:0;;;;;;:9;:16;;;;;;;20793:208::o;34165:94::-;33587:6;;33734:23;33587:6;16019:10;33734:23;33726:68;;;;;;;16117:2:1;33726:68:0;;;16099:21:1;;;16136:18;;;16129:30;16195:34;16175:18;;;16168:62;16247:18;;33726:68:0;15915:356:1;33726:68:0;34230:21:::1;34248:1;34230:9;:21::i;:::-;34165:94::o:0;47494:113::-;33587:6;;33734:23;33587:6;16019:10;33734:23;33726:68;;;;;;;16117:2:1;33726:68:0;;;16099:21:1;;;16136:18;;;16129:30;16195:34;16175:18;;;16168:62;16247:18;;33726:68:0;15915:356:1;33726:68:0;47569:18:::1;:30:::0;47494:113::o;47075:203::-;33587:6;;33734:23;33587:6;16019:10;33734:23;33726:68;;;;;;;16117:2:1;33726:68:0;;;16099:21:1;;;16136:18;;;16129:30;16195:34;16175:18;;;16168:62;16247:18;;33726:68:0;15915:356:1;33726:68:0;47164:9:::1;47159:112;47183:11;:18;47179:1;:22;47159:112;;;47255:4;47223:13;:29;47237:11;47249:1;47237:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;47223:29:::1;;::::0;;;::::1;::::0;;;;;;-1:-1:-1;47223:29:0;:36;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;47203:3;::::1;::::0;::::1;:::i;:::-;;;;47159:112;;44693:859:::0;44812:11;44804:38;;;;;;;20197:2:1;44804:38:0;;;20179:21:1;20236:2;20216:18;;;20209:30;20275:16;20255:18;;;20248:44;20309:18;;44804:38:0;19995:338:1;44804:38:0;44861:12;:10;:12::i;:::-;44853:36;;;;;;;12595:2:1;44853:36:0;;;12577:21:1;12634:2;12614:18;;;12607:30;12673:13;12653:18;;;12646:41;12704:18;;44853:36:0;12393:335:1;44853:36:0;44195:42;44908:23;:4;44921:9;44908:12;:23::i;:::-;:34;;;44900:64;;;;;;;13348:2:1;44900:64:0;;;13330:21:1;13387:2;13367:18;;;13360:30;13426:19;13406:18;;;13399:47;13463:18;;44900:64:0;13146:341:1;44900:64:0;44984:18;;;;:11;:18;;;;;;;;44983:19;44975:42;;;;;;;17649:2:1;44975:42:0;;;17631:21:1;17688:2;17668:18;;;17661:30;17727:12;17707:18;;;17700:40;17757:18;;44975:42:0;17447:334:1;44975:42:0;48312:39;;;45055:10;6020:2:1;6016:15;6033:66;6012:88;48312:39:0;;;;6000:101:1;;;;6117:12;;;6110:28;;;6154:12;;;;6147:28;;;48312:39:0;;;;;;;;;;6191:12:1;;;48312:39:0;;48302:50;;;;;;6931:66:1;48222:131:0;;;6919:79:1;7014:12;;;;7007:28;;;;48222:131:0;;;;;;;;;;7051:12:1;;;;48222:131:0;;;48212:152;;;;;48204:160;;45028:70;;;;;;;19856:2:1;45028:70:0;;;19838:21:1;19895:2;19875:18;;;19868:30;19934:14;19914:18;;;19907:42;19966:18;;45028:70:0;19654:336:1;45028:70:0;43941:1;45117:6;:22;;45109:62;;;;;;;19149:2:1;45109:62:0;;;19131:21:1;19188:2;19168:18;;;19161:30;19227:29;19207:18;;;19200:57;19274:18;;45109:62:0;18947:351:1;45109:62:0;45213:9;45190:19;44087:7;45190:6;:19;:::i;:::-;:32;45182:61;;;;;;;16888:2:1;45182:61:0;;;16870:21:1;16927:2;16907:18;;;16900:30;16966:18;16946;;;16939:46;17002:18;;45182:61:0;16686:340:1;45182:61:0;45256:17;45290:6;45276:11;;:20;;;;:::i;:::-;45256:40;;44038:5;45315:9;:23;;45307:55;;;;;;;11844:2:1;45307:55:0;;;11826:21:1;11883:2;11863:18;;;11856:30;11922:21;11902:18;;;11895:49;11961:18;;45307:55:0;11642:343:1;45307:55:0;45380:9;45375:98;45399:6;45395:1;:10;45375:98;;;45427:34;45433:10;45459:1;45445:11;;:15;;;;:::i;45427:34::-;45407:3;;;;:::i;:::-;;;;45375:98;;;-1:-1:-1;45485:11:0;:23;-1:-1:-1;45519:18:0;;;;:11;:18;;;;;:25;;;;45540:4;45519:25;;;-1:-1:-1;;44693:859:0:o;46559:171::-;46607:4;46632:12;:10;:12::i;:::-;46631:13;:59;;;;;46667:23;;46648:15;:42;;46631:59;:91;;;;-1:-1:-1;;46694:23:0;;:28;;;46559:171::o;21538:104::-;21594:13;21627:7;21620:14;;;;;:::i;23221:295::-;23324:24;;;16019:10;23324:24;;23316:62;;;;;;;11490:2:1;23316:62:0;;;11472:21:1;11529:2;11509:18;;;11502:30;11568:27;11548:18;;;11541:55;11613:18;;23316:62:0;11288:349:1;23316:62:0;16019:10;23391:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;23460:48;;7961:41:1;;;23391:42:0;;16019:10;23460:48;;7934:18:1;23460:48:0;;;;;;;23221:295;;:::o;24484:328::-;24659:41;16019:10;24692:7;24659:18;:41::i;:::-;24651:103;;;;;;;18731:2:1;24651:103:0;;;18713:21:1;18770:2;18750:18;;;18743:30;18809:34;18789:18;;;18782:62;18880:19;18860:18;;;18853:47;18917:19;;24651:103:0;18529:413:1;24651:103:0;24765:39;24779:4;24785:2;24789:7;24798:5;24765:13;:39::i;:::-;24484:328;;;;:::o;47615:123::-;33587:6;;33734:23;33587:6;16019:10;33734:23;33726:68;;;;;;;16117:2:1;33726:68:0;;;16099:21:1;;;16136:18;;;16129:30;16195:34;16175:18;;;16168:62;16247:18;;33726:68:0;15915:356:1;33726:68:0;47695:23:::1;:35:::0;47615:123::o;21713:334::-;26387:4;26411:16;;;:7;:16;;;;;;21786:13;;26411:30;:16;21812:76;;;;;;;17233:2:1;21812:76:0;;;17215:21:1;17272:2;17252:18;;;17245:30;17311:34;17291:18;;;17284:62;17382:17;17362:18;;;17355:45;17417:19;;21812:76:0;17031:411:1;21812:76:0;21901:21;21925:10;:8;:10::i;:::-;21901:34;;21977:1;21959:7;21953:21;:25;:86;;;;;;;;;;;;;;;;;22005:7;22014:18;:7;:16;:18::i;:::-;21988:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21953:86;21946:93;21713:334;-1:-1:-1;;;21713:334:0:o;47845:221::-;33587:6;;33734:23;33587:6;16019:10;33734:23;33726:68;;;;;;;16117:2:1;33726:68:0;;;16099:21:1;;;16136:18;;;16129:30;16195:34;16175:18;;;16168:62;16247:18;;33726:68:0;15915:356:1;33726:68:0;47898:18:::1;47948:3;47919:26;:21;47943:2;47919:26;:::i;:::-;:32;;;;:::i;:::-;47898:53;;47970:7;33587:6:::0;;;;;33514:87;47970:7:::1;47962:25;;:37;47988:10;47962:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;48010:48:0::1;::::0;44280:42:::1;::::0;48036:21:::1;48010:48:::0;::::1;;;::::0;::::1;::::0;;;48036:21;44280:42;48010:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;34414:192:::0;33587:6;;33734:23;33587:6;16019:10;33734:23;33726:68;;;;;;;16117:2:1;33726:68:0;;;16099:21:1;;;16136:18;;;16129:30;16195:34;16175:18;;;16168:62;16247:18;;33726:68:0;15915:356:1;33726:68:0;34503:22:::1;::::0;::::1;34495:73;;;::::0;::::1;::::0;;10321:2:1;34495:73:0::1;::::0;::::1;10303:21:1::0;10360:2;10340:18;;;10333:30;10399:34;10379:18;;;10372:62;10470:8;10450:18;;;10443:36;10496:19;;34495:73:0::1;10119:402:1::0;34495:73:0::1;34579:19;34589:8;34579:9;:19::i;:::-;34414:192:::0;:::o;30304:174::-;30379:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;30433:23;30379:24;30433:14;:23::i;:::-;30424:46;;;;;;;;;;;;30304:174;;:::o;26616:348::-;26709:4;26411:16;;;:7;:16;;;;;;:30;:16;26726:73;;;;;;;12935:2:1;26726:73:0;;;12917:21:1;12974:2;12954:18;;;12947:30;13013:34;12993:18;;;12986:62;13084:14;13064:18;;;13057:42;13116:19;;26726:73:0;12733:408:1;26726:73:0;26810:13;26826:23;26841:7;26826:14;:23::i;:::-;26810:39;;26879:5;26868:16;;:7;:16;;;:51;;;;26912:7;26888:31;;:20;26900:7;26888:11;:20::i;:::-;:31;;;26868:51;:87;;;-1:-1:-1;23708:25:0;;;;23684:4;23708:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26923:32;26860:96;26616:348;-1:-1:-1;;;;26616:348:0:o;29608:578::-;29767:4;29740:31;;:23;29755:7;29740:14;:23::i;:::-;:31;;;29732:85;;;;;;;16478:2:1;29732:85:0;;;16460:21:1;16517:2;16497:18;;;16490:30;16556:34;16536:18;;;16529:62;16627:11;16607:18;;;16600:39;16656:19;;29732:85:0;16276:405:1;29732:85:0;29836:16;;;29828:65;;;;;;;11085:2:1;29828:65:0;;;11067:21:1;11124:2;11104:18;;;11097:30;11163:34;11143:18;;;11136:62;11234:6;11214:18;;;11207:34;11258:19;;29828:65:0;10883:400:1;29828:65:0;30010:29;30027:1;30031:7;30010:8;:29::i;:::-;30052:15;;;;;;;:9;:15;;;;;:20;;30071:1;;30052:15;:20;;30071:1;;30052:20;:::i;:::-;;;;-1:-1:-1;;30083:13:0;;;;;;;:9;:13;;;;;:18;;30100:1;;30083:13;:18;;30100:1;;30083:18;:::i;:::-;;;;-1:-1:-1;;30112:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;30151:27;;30112:16;;30151:27;;;;;;;29608:578;;;:::o;28300:382::-;28380:16;;;28372:61;;;;;;;15343:2:1;28372:61:0;;;15325:21:1;;;15362:18;;;15355:30;15421:34;15401:18;;;15394:62;15473:18;;28372:61:0;15141:356:1;28372:61:0;26387:4;26411:16;;;:7;:16;;;;;;:30;:16;:30;28444:58;;;;;;;10728:2:1;28444:58:0;;;10710:21:1;10767:2;10747:18;;;10740:30;10806;10786:18;;;10779:58;10854:18;;28444:58:0;10526:352:1;28444:58:0;28573:13;;;;;;;:9;:13;;;;;:18;;28590:1;;28573:13;:18;;28590:1;;28573:18;:::i;:::-;;;;-1:-1:-1;;28602:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;28641:33;;28602:16;;;28641:33;;28602:16;;28641:33;28300:382;;:::o;34614:173::-;34689:6;;;;34706:17;;;;;;;;;;;34739:40;;34689:6;;;34706:17;34689:6;;34739:40;;34670:16;;34739:40;34659:128;34614:173;:::o;39098:231::-;39176:7;39197:17;39216:18;39238:27;39249:4;39255:9;39238:10;:27::i;:::-;39196:69;;;;39276:18;39288:5;39276:11;:18::i;:::-;-1:-1:-1;39312:9:0;39098:231;-1:-1:-1;;;39098:231:0:o;25694:315::-;25851:28;25861:4;25867:2;25871:7;25851:9;:28::i;:::-;25898:48;25921:4;25927:2;25931:7;25940:5;25898:22;:48::i;:::-;25890:111;;;;;;;9902:2:1;25890:111:0;;;9884:21:1;9941:2;9921:18;;;9914:30;9980:34;9960:18;;;9953:62;10051:20;10031:18;;;10024:48;10089:19;;25890:111:0;9700:414:1;48380:101:0;48432:13;48465:8;48458:15;;;;;:::i;16435:723::-;16491:13;16712:10;16708:53;;-1:-1:-1;;16739:10:0;;;;;;;;;;;;;;;;;;16435:723::o;16708:53::-;16786:5;16771:12;16827:78;16834:9;;16827:78;;16860:8;;;;:::i;:::-;;-1:-1:-1;16883:10:0;;-1:-1:-1;16891:2:0;16883:10;;:::i;:::-;;;16827:78;;;16915:19;16947:6;16937:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16937:17:0;;16915:39;;16965:154;16972:10;;16965:154;;16999:11;17009:1;16999:11;;:::i;:::-;;-1:-1:-1;17068:10:0;17076:2;17068:5;:10;:::i;:::-;17055:24;;:2;:24;:::i;:::-;17042:39;;17025:6;17032;17025:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;17096:11:0;17105:2;17096:11;;:::i;:::-;;;16965:154;;36988:1308;37069:7;37078:12;37303:9;:16;37323:2;37303:22;37299:990;;;37599:4;37584:20;;37578:27;37649:4;37634:20;;37628:27;37707:4;37692:20;;37686:27;37342:9;37678:36;37750:25;37761:4;37678:36;37578:27;37628;37750:10;:25::i;:::-;37743:32;;;;;;;;;37299:990;37797:9;:16;37817:2;37797:22;37793:496;;;38072:4;38057:20;;38051:27;38123:4;38108:20;;38102:27;38165:23;38176:4;38051:27;38102;38165:10;:23::i;:::-;38158:30;;;;;;;;37793:496;-1:-1:-1;38237:1:0;;-1:-1:-1;38241:35:0;37793:496;36988:1308;;;;;:::o;35259:643::-;35337:20;35328:5;:29;;;;;;;;:::i;:::-;;35324:571;;;35259:643;:::o;35324:571::-;35435:29;35426:5;:38;;;;;;;;:::i;:::-;;35422:473;;;35481:34;;;;;8842:2:1;35481:34:0;;;8824:21:1;8881:2;8861:18;;;8854:30;8920:26;8900:18;;;8893:54;8964:18;;35481:34:0;8640:348:1;35422:473:0;35546:35;35537:5;:44;;;;;;;;:::i;:::-;;35533:362;;;35598:41;;;;;9542:2:1;35598:41:0;;;9524:21:1;9581:2;9561:18;;;9554:30;9620:33;9600:18;;;9593:61;9671:18;;35598:41:0;9340:355:1;35533:362:0;35670:30;35661:5;:39;;;;;;;;:::i;:::-;;35657:238;;;35717:44;;;;;12192:2:1;35717:44:0;;;12174:21:1;12231:2;12211:18;;;12204:30;12270:34;12250:18;;;12243:62;12341:4;12321:18;;;12314:32;12363:19;;35717:44:0;11990:398:1;35657:238:0;35792:30;35783:5;:39;;;;;;;;:::i;:::-;;35779:116;;;35839:44;;;;;14940:2:1;35839:44:0;;;14922:21:1;14979:2;14959:18;;;14952:30;15018:34;14998:18;;;14991:62;15089:4;15069:18;;;15062:32;15111:19;;35839:44:0;14738:398:1;31043:799:0;31198:4;31219:13;;;8337:20;8385:8;31215:620;;31255:72;;;;;:36;;;;;;:72;;16019:10;;31306:4;;31312:7;;31321:5;;31255:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31255:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31251:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31497:13:0;;31493:272;;31540:60;;;;;9902:2:1;31540:60:0;;;9884:21:1;9941:2;9921:18;;;9914:30;9980:34;9960:18;;;9953:62;10051:20;10031:18;;;10024:48;10089:19;;31540:60:0;9700:414:1;31493:272:0;31715:6;31709:13;31700:6;31696:2;31692:15;31685:38;31251:529;31378:51;;31388:41;31378:51;;-1:-1:-1;31371:58:0;;31215:620;-1:-1:-1;31819:4:0;31812:11;;40597:1632;40728:7;;41662:66;41649:79;;41645:163;;;-1:-1:-1;41761:1:0;;-1:-1:-1;41765:30:0;41745:51;;41645:163;41822:1;:7;;41827:2;41822:7;;:18;;;;;41833:1;:7;;41838:2;41833:7;;41822:18;41818:102;;;-1:-1:-1;41873:1:0;;-1:-1:-1;41877:30:0;41857:51;;41818:102;42034:24;;;42017:14;42034:24;;;;;;;;;8240:25:1;;;8313:4;8301:17;;8281:18;;;8274:45;;;;8335:18;;;8328:34;;;8378:18;;;8371:34;;;42034:24:0;;8212:19:1;;42034:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42034:24:0;;;;;;-1:-1:-1;;42073:20:0;;;42069:103;;42126:1;42130:29;42110:50;;;;;;;42069:103;42192:6;-1:-1:-1;42200:20:0;;-1:-1:-1;40597:1632:0;;;;;;;;:::o;39592:391::-;39706:7;;39815:66;39807:75;;39909:3;39905:12;;;39919:2;39901:21;39950:25;39961:4;39901:21;39970:1;39807:75;39950:10;:25::i;:::-;39943:32;;;;;;39592:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:465:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:116;282:4;213:66;208:2;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:45;;;368:1;365;358:12;327:45;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;14:465;;;;;:::o;484:196::-;552:20;;612:42;601:54;;591:65;;581:93;;670:1;667;660:12;581:93;484:196;;;:::o;685:220::-;727:5;780:3;773:4;765:6;761:17;757:27;747:55;;798:1;795;788:12;747:55;820:79;895:3;886:6;873:20;866:4;858:6;854:17;820:79;:::i;910:186::-;969:6;1022:2;1010:9;1001:7;997:23;993:32;990:52;;;1038:1;1035;1028:12;990:52;1061:29;1080:9;1061:29;:::i;1101:260::-;1169:6;1177;1230:2;1218:9;1209:7;1205:23;1201:32;1198:52;;;1246:1;1243;1236:12;1198:52;1269:29;1288:9;1269:29;:::i;:::-;1259:39;;1317:38;1351:2;1340:9;1336:18;1317:38;:::i;:::-;1307:48;;1101:260;;;;;:::o;1366:328::-;1443:6;1451;1459;1512:2;1500:9;1491:7;1487:23;1483:32;1480:52;;;1528:1;1525;1518:12;1480:52;1551:29;1570:9;1551:29;:::i;:::-;1541:39;;1599:38;1633:2;1622:9;1618:18;1599:38;:::i;:::-;1589:48;;1684:2;1673:9;1669:18;1656:32;1646:42;;1366:328;;;;;:::o;1699:537::-;1794:6;1802;1810;1818;1871:3;1859:9;1850:7;1846:23;1842:33;1839:53;;;1888:1;1885;1878:12;1839:53;1911:29;1930:9;1911:29;:::i;:::-;1901:39;;1959:38;1993:2;1982:9;1978:18;1959:38;:::i;:::-;1949:48;;2044:2;2033:9;2029:18;2016:32;2006:42;;2099:2;2088:9;2084:18;2071:32;2126:18;2118:6;2115:30;2112:50;;;2158:1;2155;2148:12;2112:50;2181:49;2222:7;2213:6;2202:9;2198:22;2181:49;:::i;:::-;2171:59;;;1699:537;;;;;;;:::o;2241:347::-;2306:6;2314;2367:2;2355:9;2346:7;2342:23;2338:32;2335:52;;;2383:1;2380;2373:12;2335:52;2406:29;2425:9;2406:29;:::i;:::-;2396:39;;2485:2;2474:9;2470:18;2457:32;2532:5;2525:13;2518:21;2511:5;2508:32;2498:60;;2554:1;2551;2544:12;2498:60;2577:5;2567:15;;;2241:347;;;;;:::o;2593:254::-;2661:6;2669;2722:2;2710:9;2701:7;2697:23;2693:32;2690:52;;;2738:1;2735;2728:12;2690:52;2761:29;2780:9;2761:29;:::i;:::-;2751:39;2837:2;2822:18;;;;2809:32;;-1:-1:-1;;;2593:254:1:o;2852:963::-;2936:6;2967:2;3010;2998:9;2989:7;2985:23;2981:32;2978:52;;;3026:1;3023;3016:12;2978:52;3066:9;3053:23;3095:18;3136:2;3128:6;3125:14;3122:34;;;3152:1;3149;3142:12;3122:34;3190:6;3179:9;3175:22;3165:32;;3235:7;3228:4;3224:2;3220:13;3216:27;3206:55;;3257:1;3254;3247:12;3206:55;3293:2;3280:16;3315:2;3311;3308:10;3305:36;;;3321:18;;:::i;:::-;3367:2;3364:1;3360:10;3350:20;;3390:28;3414:2;3410;3406:11;3390:28;:::i;:::-;3452:15;;;3483:12;;;;3515:11;;;3545;;;3541:20;;3538:33;-1:-1:-1;3535:53:1;;;3584:1;3581;3574:12;3535:53;3606:1;3597:10;;3616:169;3630:2;3627:1;3624:9;3616:169;;;3687:23;3706:3;3687:23;:::i;:::-;3675:36;;3648:1;3641:9;;;;;3731:12;;;;3763;;3616:169;;;-1:-1:-1;3804:5:1;2852:963;-1:-1:-1;;;;;;;;2852:963:1:o;3820:525::-;3915:6;3923;3931;3939;3992:3;3980:9;3971:7;3967:23;3963:33;3960:53;;;4009:1;4006;3999:12;3960:53;4045:9;4032:23;4022:33;;4106:2;4095:9;4091:18;4078:32;4133:18;4125:6;4122:30;4119:50;;;4165:1;4162;4155:12;4119:50;4188:49;4229:7;4220:6;4209:9;4205:22;4188:49;:::i;:::-;3820:525;;4178:59;;-1:-1:-1;;;;4284:2:1;4269:18;;4256:32;;4335:2;4320:18;4307:32;;3820:525;-1:-1:-1;3820:525:1:o;4350:245::-;4408:6;4461:2;4449:9;4440:7;4436:23;4432:32;4429:52;;;4477:1;4474;4467:12;4429:52;4516:9;4503:23;4535:30;4559:5;4535:30;:::i;4600:249::-;4669:6;4722:2;4710:9;4701:7;4697:23;4693:32;4690:52;;;4738:1;4735;4728:12;4690:52;4770:9;4764:16;4789:30;4813:5;4789:30;:::i;4854:450::-;4923:6;4976:2;4964:9;4955:7;4951:23;4947:32;4944:52;;;4992:1;4989;4982:12;4944:52;5032:9;5019:23;5065:18;5057:6;5054:30;5051:50;;;5097:1;5094;5087:12;5051:50;5120:22;;5173:4;5165:13;;5161:27;-1:-1:-1;5151:55:1;;5202:1;5199;5192:12;5151:55;5225:73;5290:7;5285:2;5272:16;5267:2;5263;5259:11;5225:73;:::i;5309:180::-;5368:6;5421:2;5409:9;5400:7;5396:23;5392:32;5389:52;;;5437:1;5434;5427:12;5389:52;-1:-1:-1;5460:23:1;;5309:180;-1:-1:-1;5309:180:1:o;5494:316::-;5535:3;5573:5;5567:12;5600:6;5595:3;5588:19;5616:63;5672:6;5665:4;5660:3;5656:14;5649:4;5642:5;5638:16;5616:63;:::i;:::-;5724:2;5712:15;5729:66;5708:88;5699:98;;;;5799:4;5695:109;;5494:316;-1:-1:-1;;5494:316:1:o;6214:470::-;6393:3;6431:6;6425:13;6447:53;6493:6;6488:3;6481:4;6473:6;6469:17;6447:53;:::i;:::-;6563:13;;6522:16;;;;6585:57;6563:13;6522:16;6619:4;6607:17;;6585:57;:::i;:::-;6658:20;;6214:470;-1:-1:-1;;;;6214:470:1:o;7305:511::-;7499:4;7528:42;7609:2;7601:6;7597:15;7586:9;7579:34;7661:2;7653:6;7649:15;7644:2;7633:9;7629:18;7622:43;;7701:6;7696:2;7685:9;7681:18;7674:34;7744:3;7739:2;7728:9;7724:18;7717:31;7765:45;7805:3;7794:9;7790:19;7782:6;7765:45;:::i;:::-;7757:53;7305:511;-1:-1:-1;;;;;;7305:511:1:o;8416:219::-;8565:2;8554:9;8547:21;8528:4;8585:44;8625:2;8614:9;8610:18;8602:6;8585:44;:::i;20864:334::-;20935:2;20929:9;20991:2;20981:13;;20996:66;20977:86;20965:99;;21094:18;21079:34;;21115:22;;;21076:62;21073:88;;;21141:18;;:::i;:::-;21177:2;21170:22;20864:334;;-1:-1:-1;20864:334:1:o;21203:128::-;21243:3;21274:1;21270:6;21267:1;21264:13;21261:39;;;21280:18;;:::i;:::-;-1:-1:-1;21316:9:1;;21203:128::o;21336:120::-;21376:1;21402;21392:35;;21407:18;;:::i;:::-;-1:-1:-1;21441:9:1;;21336:120::o;21461:228::-;21501:7;21627:1;21559:66;21555:74;21552:1;21549:81;21544:1;21537:9;21530:17;21526:105;21523:131;;;21634:18;;:::i;:::-;-1:-1:-1;21674:9:1;;21461:228::o;21694:125::-;21734:4;21762:1;21759;21756:8;21753:34;;;21767:18;;:::i;:::-;-1:-1:-1;21804:9:1;;21694:125::o;21824:258::-;21896:1;21906:113;21920:6;21917:1;21914:13;21906:113;;;21996:11;;;21990:18;21977:11;;;21970:39;21942:2;21935:10;21906:113;;;22037:6;22034:1;22031:13;22028:48;;;-1:-1:-1;;22072:1:1;22054:16;;22047:27;21824:258::o;22087:437::-;22166:1;22162:12;;;;22209;;;22230:61;;22284:4;22276:6;22272:17;22262:27;;22230:61;22337:2;22329:6;22326:14;22306:18;22303:38;22300:218;;;22374:77;22371:1;22364:88;22475:4;22472:1;22465:15;22503:4;22500:1;22493:15;22300:218;;22087:437;;;:::o;22529:195::-;22568:3;22599:66;22592:5;22589:77;22586:103;;;22669:18;;:::i;:::-;-1:-1:-1;22716:1:1;22705:13;;22529:195::o;22729:112::-;22761:1;22787;22777:35;;22792:18;;:::i;:::-;-1:-1:-1;22826:9:1;;22729:112::o;22846:184::-;22898:77;22895:1;22888:88;22995:4;22992:1;22985:15;23019:4;23016:1;23009:15;23035:184;23087:77;23084:1;23077:88;23184:4;23181:1;23174:15;23208:4;23205:1;23198:15;23224:184;23276:77;23273:1;23266:88;23373:4;23370:1;23363:15;23397:4;23394:1;23387:15;23413:184;23465:77;23462:1;23455:88;23562:4;23559:1;23552:15;23586:4;23583:1;23576:15;23602:184;23654:77;23651:1;23644:88;23751:4;23748:1;23741:15;23775:4;23772:1;23765:15;23791:177;23876:66;23869:5;23865:78;23858:5;23855:89;23845:117;;23958:1;23955;23948:12
Swarm Source
ipfs://fc6900cd32448a2ca07f33d000553eb8226453762f848c63b00d5d42633ab37c
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.