ERC-721
Overview
Max Total Supply
10,000 Dustmon
Holders
4,275
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
20 DustmonLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Dustmon
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-31 */ /** *Submitted for verification at Etherscan.io on 2022-10-30 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/ERC721A.sol pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: contracts/Dustmon.sol pragma solidity ^0.8.2; contract Dustmon is ERC721A, Pausable, Ownable{ using Counters for Counters.Counter; // using ECDSA for bytes32; Counters.Counter private _tokenIdCounter; bool public isRevealed; string private hash; string private baseURI; string private defaultURI = "https://dustmon-test-9328.s3.amazonaws.com/box"; uint256 public priceStep = 0.001 ether; uint256 public initPrice = 0.001 ether; uint256 public maxSupply = 10000; constructor() ERC721A("Dustmons", "Dustmon") { isRevealed=false; pause(); } function _baseURI() internal view override returns (string memory) { return baseURI; } function _defaultURI() internal view returns (string memory){ return defaultURI; } function setBaseURI(string memory s) public onlyOwner { baseURI=s; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function setIsRevealed(bool isRevealedArg) public onlyOwner { isRevealed=isRevealedArg; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); if(isRevealed){ return ERC721A.tokenURI(tokenId); }else{ return _defaultURI(); } } function safeMint(uint256 quantity) public payable { uint256 price=getPrice(); if(price==0){ require(quantity==1,"you can only mint 1 free token everytime"); }else{ require(quantity<=5,"you can only mint 5 tokens everytime"); } require(ERC721A._currentIndex+quantity<=maxSupply,"you are over our max supply"); require(msg.value>=price*quantity,"not enough value"); _safeMint(msg.sender, quantity); } function getPrice() public view returns (uint256) { if(isRevealed){ return initPrice+priceStep*(uint((ERC721A._currentIndex)/100)); }else{ return 0; } } function airDrop(address to,uint256 quantity) public onlyOwner{ require(ERC721A._currentIndex+quantity<maxSupply,"you are over our max supply"); _safeMint(to, quantity); } function withdraw() public onlyOwner { require(address(this).balance>0,"Balance must > 0"); payable(owner()).transfer(address(this).balance); } function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal whenNotPaused override { super._beforeTokenTransfers(from,to,startTokenId,quantity); } // take the keccak256 hashed message from the getHash function above and input into this function // this function prefixes the hash above with \x19Ethereum signed message:\n32 + hash // and produces a new hash signature }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airDrop","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":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceStep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"s","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isRevealedArg","type":"bool"}],"name":"setIsRevealed","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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060600160405280602e815260200162003dbf602e9139600d90805190602001906200003592919062000413565b5066038d7ea4c68000600e5566038d7ea4c68000600f556127106010553480156200005f57600080fd5b506040518060400160405280600881526020017f447573746d6f6e730000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f447573746d6f6e000000000000000000000000000000000000000000000000008152508160029080519060200190620000e492919062000413565b508060039080519060200190620000fd92919062000413565b506200010e6200018260201b60201c565b60008190555050506000600860006101000a81548160ff02191690831515021790555062000151620001456200018760201b60201c565b6200018f60201b60201c565b6000600a60006101000a81548160ff0219169083151502179055506200017c6200025560201b60201c565b6200067f565b600090565b600033905090565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002656200027760201b60201c565b620002756200030860201b60201c565b565b620002876200018760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002ad6200037d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000306576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fd9062000561565b60405180910390fd5b565b62000318620003a760201b60201c565b6001600860006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620003646200018760201b60201c565b60405162000373919062000522565b60405180910390a1565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620003b7620003fc60201b60201c565b15620003fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003f1906200053f565b60405180910390fd5b565b6000600860009054906101000a900460ff16905090565b8280546200042190620005c8565b90600052602060002090601f01602090048101928262000445576000855562000491565b82601f106200046057805160ff191683800117855562000491565b8280016001018555821562000491579182015b828111156200049057825182559160200191906001019062000473565b5b509050620004a09190620004a4565b5090565b5b80821115620004bf576000816000905550600101620004a5565b5090565b620004ce8162000594565b82525050565b6000620004e360108362000583565b9150620004f0826200062d565b602082019050919050565b60006200050a60208362000583565b9150620005178262000656565b602082019050919050565b6000602082019050620005396000830184620004c3565b92915050565b600060208201905081810360008301526200055a81620004d4565b9050919050565b600060208201905081810360008301526200057c81620004fb565b9050919050565b600082825260208201905092915050565b6000620005a182620005a8565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620005e157607f821691505b60208210811415620005f857620005f7620005fe565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b613730806200068f6000396000f3fe6080604052600436106101cd5760003560e01c80636352211e116100f757806398d5fdca11610095578063c87b56dd11610064578063c87b56dd14610609578063d5abeb0114610646578063e985e9c514610671578063f2fde38b146106ae576101cd565b806398d5fdca14610561578063a22cb4651461058c578063b6add0f4146105b5578063b88d4fde146105e0576101cd565b80638456cb59116100d15780638456cb59146104c957806388d519c4146104e05780638da5cb5b1461050b57806395d89b4114610536576101cd565b80636352211e1461043857806370a0823114610475578063715018a6146104b2576101cd565b806331c864e81161016f57806349a5980a1161013e57806349a5980a1461039057806354214f69146103b957806355f804b3146103e45780635c975abb1461040d576101cd565b806331c864e81461031d5780633ccfd60b146103395780633f4ba83a1461035057806342842e0e14610367576101cd565b8063081812fc116101ab578063081812fc14610263578063095ea7b3146102a057806318160ddd146102c957806323b872dd146102f4576101cd565b806301ffc9a7146101d2578063045f78501461020f57806306fdde0314610238575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612ac9565b6106d7565b6040516102069190612e52565b60405180910390f35b34801561021b57600080fd5b5061023660048036038101906102319190612a5c565b6107b9565b005b34801561024457600080fd5b5061024d610820565b60405161025a9190612e6d565b60405180910390f35b34801561026f57600080fd5b5061028a60048036038101906102859190612b6c565b6108b2565b6040516102979190612deb565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c29190612a5c565b61092e565b005b3480156102d557600080fd5b506102de610a39565b6040516102eb9190612fcf565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612946565b610a50565b005b61033760048036038101906103329190612b6c565b610a60565b005b34801561034557600080fd5b5061034e610bb0565b005b34801561035c57600080fd5b50610365610c4b565b005b34801561037357600080fd5b5061038e60048036038101906103899190612946565b610c5d565b005b34801561039c57600080fd5b506103b760048036038101906103b29190612a9c565b610c7d565b005b3480156103c557600080fd5b506103ce610ca2565b6040516103db9190612e52565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190612b23565b610cb5565b005b34801561041957600080fd5b50610422610cd7565b60405161042f9190612e52565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190612b6c565b610cee565b60405161046c9190612deb565b60405180910390f35b34801561048157600080fd5b5061049c600480360381019061049791906128d9565b610d04565b6040516104a99190612fcf565b60405180910390f35b3480156104be57600080fd5b506104c7610dd4565b005b3480156104d557600080fd5b506104de610de8565b005b3480156104ec57600080fd5b506104f5610dfa565b6040516105029190612fcf565b60405180910390f35b34801561051757600080fd5b50610520610e00565b60405161052d9190612deb565b60405180910390f35b34801561054257600080fd5b5061054b610e2a565b6040516105589190612e6d565b60405180910390f35b34801561056d57600080fd5b50610576610ebc565b6040516105839190612fcf565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190612a1c565b610f0b565b005b3480156105c157600080fd5b506105ca611083565b6040516105d79190612fcf565b60405180910390f35b3480156105ec57600080fd5b5061060760048036038101906106029190612999565b611089565b005b34801561061557600080fd5b50610630600480360381019061062b9190612b6c565b611105565b60405161063d9190612e6d565b60405180910390f35b34801561065257600080fd5b5061065b611184565b6040516106689190612fcf565b60405180910390f35b34801561067d57600080fd5b5061069860048036038101906106939190612906565b61118a565b6040516106a59190612e52565b60405180910390f35b3480156106ba57600080fd5b506106d560048036038101906106d091906128d9565b61121e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107b257506107b1826112a2565b5b9050919050565b6107c161130c565b601054816000546107d291906130b4565b10610812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080990612ecf565b60405180910390fd5b61081c828261138a565b5050565b60606002805461082f9061327f565b80601f016020809104026020016040519081016040528092919081815260200182805461085b9061327f565b80156108a85780601f1061087d576101008083540402835291602001916108a8565b820191906000526020600020905b81548152906001019060200180831161088b57829003601f168201915b5050505050905090565b60006108bd826113a8565b6108f3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093982610cee565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109a1576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109c06113f6565b73ffffffffffffffffffffffffffffffffffffffff16141580156109f257506109f0816109eb6113f6565b61118a565b155b15610a29576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a348383836113fe565b505050565b6000610a436114b0565b6001546000540303905090565b610a5b8383836114b5565b505050565b6000610a6a610ebc565b90506000811415610abd5760018214610ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaf90612eef565b60405180910390fd5b610b02565b6005821115610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af890612f2f565b60405180910390fd5b5b60105482600054610b1391906130b4565b1115610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b90612ecf565b60405180910390fd5b8181610b60919061313b565b341015610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9990612faf565b60405180910390fd5b610bac338361138a565b5050565b610bb861130c565b60004711610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf290612f8f565b60405180910390fd5b610c03610e00565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c48573d6000803e3d6000fd5b50565b610c5361130c565b610c5b61196b565b565b610c7883838360405180602001604052806000815250611089565b505050565b610c8561130c565b80600a60006101000a81548160ff02191690831515021790555050565b600a60009054906101000a900460ff1681565b610cbd61130c565b80600c9080519060200190610cd39291906126aa565b5050565b6000600860009054906101000a900460ff16905090565b6000610cf9826119ce565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d6c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610ddc61130c565b610de66000611c5d565b565b610df061130c565b610df8611d23565b565b600e5481565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e399061327f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e659061327f565b8015610eb25780601f10610e8757610100808354040283529160200191610eb2565b820191906000526020600020905b815481529060010190602001808311610e9557829003601f168201915b5050505050905090565b6000600a60009054906101000a900460ff1615610f03576064600054610ee2919061310a565b600e54610eef919061313b565b600f54610efc91906130b4565b9050610f08565b600090505b90565b610f136113f6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f78576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610f856113f6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110326113f6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110779190612e52565b60405180910390a35050565b600f5481565b6110948484846114b5565b6110b38373ffffffffffffffffffffffffffffffffffffffff16611d86565b80156110c857506110c684848484611da9565b155b156110ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611110826113a8565b61114f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114690612f6f565b60405180910390fd5b600a60009054906101000a900460ff16156111745761116d82611f09565b905061117f565b61117c611fa8565b90505b919050565b60105481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61122661130c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90612eaf565b60405180910390fd5b61129f81611c5d565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6113146113f6565b73ffffffffffffffffffffffffffffffffffffffff16611332610e00565b73ffffffffffffffffffffffffffffffffffffffff1614611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137f90612f4f565b60405180910390fd5b565b6113a482826040518060200160405280600081525061203a565b5050565b6000816113b36114b0565b111580156113c2575060005482105b80156113ef575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006114c0826119ce565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461152b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661154c6113f6565b73ffffffffffffffffffffffffffffffffffffffff16148061157b575061157a856115756113f6565b61118a565b5b806115c057506115896113f6565b73ffffffffffffffffffffffffffffffffffffffff166115a8846108b2565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806115f9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611660576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61166d85858560016123fe565b611679600084876113fe565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156118f95760005482146118f857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119648585856001612418565b5050505050565b61197361241e565b6000600860006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6119b76113f6565b6040516119c49190612deb565b60405180910390a1565b6119d6612730565b6000829050806119e46114b0565b111580156119f3575060005481105b15611c26576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611c2457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b08578092505050611c58565b5b600115611c2357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c1e578092505050611c58565b611b09565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d2b612467565b6001600860006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611d6f6113f6565b604051611d7c9190612deb565b60405180910390a1565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611dcf6113f6565b8786866040518563ffffffff1660e01b8152600401611df19493929190612e06565b602060405180830381600087803b158015611e0b57600080fd5b505af1925050508015611e3c57506040513d601f19601f82011682018060405250810190611e399190612af6565b60015b611eb6573d8060008114611e6c576040519150601f19603f3d011682016040523d82523d6000602084013e611e71565b606091505b50600081511415611eae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060611f14826113a8565b611f4a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611f546124b1565b9050600081511415611f755760405180602001604052806000815250611fa0565b80611f7f84612543565b604051602001611f90929190612dc7565b6040516020818303038152906040525b915050919050565b6060600d8054611fb79061327f565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe39061327f565b80156120305780601f1061200557610100808354040283529160200191612030565b820191906000526020600020905b81548152906001019060200180831161201357829003601f168201915b5050505050905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120a7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156120e2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120ef60008583866123fe565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506122b08673ffffffffffffffffffffffffffffffffffffffff16611d86565b15612376575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123256000878480600101955087611da9565b61235b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156122b657826000541461237157600080fd5b6123e2565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612377575b8160008190555050506123f86000858386612418565b50505050565b612406612467565b612412848484846126a4565b50505050565b50505050565b612426610cd7565b612465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245c90612e8f565b60405180910390fd5b565b61246f610cd7565b156124af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a690612f0f565b60405180910390fd5b565b6060600c80546124c09061327f565b80601f01602080910402602001604051908101604052809291908181526020018280546124ec9061327f565b80156125395780601f1061250e57610100808354040283529160200191612539565b820191906000526020600020905b81548152906001019060200180831161251c57829003601f168201915b5050505050905090565b6060600082141561258b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061269f565b600082905060005b600082146125bd5780806125a6906132e2565b915050600a826125b6919061310a565b9150612593565b60008167ffffffffffffffff8111156125d9576125d8613418565b5b6040519080825280601f01601f19166020018201604052801561260b5781602001600182028036833780820191505090505b5090505b60008514612698576001826126249190613195565b9150600a85612633919061332b565b603061263f91906130b4565b60f81b818381518110612655576126546133e9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612691919061310a565b945061260f565b8093505050505b919050565b50505050565b8280546126b69061327f565b90600052602060002090601f0160209004810192826126d8576000855561271f565b82601f106126f157805160ff191683800117855561271f565b8280016001018555821561271f579182015b8281111561271e578251825591602001919060010190612703565b5b50905061272c9190612773565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561278c576000816000905550600101612774565b5090565b60006127a361279e8461300f565b612fea565b9050828152602081018484840111156127bf576127be61344c565b5b6127ca84828561323d565b509392505050565b60006127e56127e084613040565b612fea565b9050828152602081018484840111156128015761280061344c565b5b61280c84828561323d565b509392505050565b6000813590506128238161369e565b92915050565b600081359050612838816136b5565b92915050565b60008135905061284d816136cc565b92915050565b600081519050612862816136cc565b92915050565b600082601f83011261287d5761287c613447565b5b813561288d848260208601612790565b91505092915050565b600082601f8301126128ab576128aa613447565b5b81356128bb8482602086016127d2565b91505092915050565b6000813590506128d3816136e3565b92915050565b6000602082840312156128ef576128ee613456565b5b60006128fd84828501612814565b91505092915050565b6000806040838503121561291d5761291c613456565b5b600061292b85828601612814565b925050602061293c85828601612814565b9150509250929050565b60008060006060848603121561295f5761295e613456565b5b600061296d86828701612814565b935050602061297e86828701612814565b925050604061298f868287016128c4565b9150509250925092565b600080600080608085870312156129b3576129b2613456565b5b60006129c187828801612814565b94505060206129d287828801612814565b93505060406129e3878288016128c4565b925050606085013567ffffffffffffffff811115612a0457612a03613451565b5b612a1087828801612868565b91505092959194509250565b60008060408385031215612a3357612a32613456565b5b6000612a4185828601612814565b9250506020612a5285828601612829565b9150509250929050565b60008060408385031215612a7357612a72613456565b5b6000612a8185828601612814565b9250506020612a92858286016128c4565b9150509250929050565b600060208284031215612ab257612ab1613456565b5b6000612ac084828501612829565b91505092915050565b600060208284031215612adf57612ade613456565b5b6000612aed8482850161283e565b91505092915050565b600060208284031215612b0c57612b0b613456565b5b6000612b1a84828501612853565b91505092915050565b600060208284031215612b3957612b38613456565b5b600082013567ffffffffffffffff811115612b5757612b56613451565b5b612b6384828501612896565b91505092915050565b600060208284031215612b8257612b81613456565b5b6000612b90848285016128c4565b91505092915050565b612ba2816131c9565b82525050565b612bb1816131db565b82525050565b6000612bc282613071565b612bcc8185613087565b9350612bdc81856020860161324c565b612be58161345b565b840191505092915050565b6000612bfb8261307c565b612c058185613098565b9350612c1581856020860161324c565b612c1e8161345b565b840191505092915050565b6000612c348261307c565b612c3e81856130a9565b9350612c4e81856020860161324c565b80840191505092915050565b6000612c67601483613098565b9150612c728261346c565b602082019050919050565b6000612c8a602683613098565b9150612c9582613495565b604082019050919050565b6000612cad601b83613098565b9150612cb8826134e4565b602082019050919050565b6000612cd0602883613098565b9150612cdb8261350d565b604082019050919050565b6000612cf3601083613098565b9150612cfe8261355c565b602082019050919050565b6000612d16602483613098565b9150612d2182613585565b604082019050919050565b6000612d39602083613098565b9150612d44826135d4565b602082019050919050565b6000612d5c602f83613098565b9150612d67826135fd565b604082019050919050565b6000612d7f601083613098565b9150612d8a8261364c565b602082019050919050565b6000612da2601083613098565b9150612dad82613675565b602082019050919050565b612dc181613233565b82525050565b6000612dd38285612c29565b9150612ddf8284612c29565b91508190509392505050565b6000602082019050612e006000830184612b99565b92915050565b6000608082019050612e1b6000830187612b99565b612e286020830186612b99565b612e356040830185612db8565b8181036060830152612e478184612bb7565b905095945050505050565b6000602082019050612e676000830184612ba8565b92915050565b60006020820190508181036000830152612e878184612bf0565b905092915050565b60006020820190508181036000830152612ea881612c5a565b9050919050565b60006020820190508181036000830152612ec881612c7d565b9050919050565b60006020820190508181036000830152612ee881612ca0565b9050919050565b60006020820190508181036000830152612f0881612cc3565b9050919050565b60006020820190508181036000830152612f2881612ce6565b9050919050565b60006020820190508181036000830152612f4881612d09565b9050919050565b60006020820190508181036000830152612f6881612d2c565b9050919050565b60006020820190508181036000830152612f8881612d4f565b9050919050565b60006020820190508181036000830152612fa881612d72565b9050919050565b60006020820190508181036000830152612fc881612d95565b9050919050565b6000602082019050612fe46000830184612db8565b92915050565b6000612ff4613005565b905061300082826132b1565b919050565b6000604051905090565b600067ffffffffffffffff82111561302a57613029613418565b5b6130338261345b565b9050602081019050919050565b600067ffffffffffffffff82111561305b5761305a613418565b5b6130648261345b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006130bf82613233565b91506130ca83613233565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130ff576130fe61335c565b5b828201905092915050565b600061311582613233565b915061312083613233565b9250826131305761312f61338b565b5b828204905092915050565b600061314682613233565b915061315183613233565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561318a5761318961335c565b5b828202905092915050565b60006131a082613233565b91506131ab83613233565b9250828210156131be576131bd61335c565b5b828203905092915050565b60006131d482613213565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561326a57808201518184015260208101905061324f565b83811115613279576000848401525b50505050565b6000600282049050600182168061329757607f821691505b602082108114156132ab576132aa6133ba565b5b50919050565b6132ba8261345b565b810181811067ffffffffffffffff821117156132d9576132d8613418565b5b80604052505050565b60006132ed82613233565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133205761331f61335c565b5b600182019050919050565b600061333682613233565b915061334183613233565b9250826133515761335061338b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f796f7520617265206f766572206f7572206d617820737570706c790000000000600082015250565b7f796f752063616e206f6e6c79206d696e742031206672656520746f6b656e206560008201527f7665727974696d65000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f796f752063616e206f6e6c79206d696e74203520746f6b656e7320657665727960008201527f74696d6500000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f42616c616e6365206d757374203e203000000000000000000000000000000000600082015250565b7f6e6f7420656e6f7567682076616c756500000000000000000000000000000000600082015250565b6136a7816131c9565b81146136b257600080fd5b50565b6136be816131db565b81146136c957600080fd5b50565b6136d5816131e7565b81146136e057600080fd5b50565b6136ec81613233565b81146136f757600080fd5b5056fea2646970667358221220b24ed54c6b233fc3acbca7bdf6f9df8c8dc75226f0bb4f89259f89231eca8c0364736f6c6343000807003368747470733a2f2f647573746d6f6e2d746573742d393332382e73332e616d617a6f6e6177732e636f6d2f626f78
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c80636352211e116100f757806398d5fdca11610095578063c87b56dd11610064578063c87b56dd14610609578063d5abeb0114610646578063e985e9c514610671578063f2fde38b146106ae576101cd565b806398d5fdca14610561578063a22cb4651461058c578063b6add0f4146105b5578063b88d4fde146105e0576101cd565b80638456cb59116100d15780638456cb59146104c957806388d519c4146104e05780638da5cb5b1461050b57806395d89b4114610536576101cd565b80636352211e1461043857806370a0823114610475578063715018a6146104b2576101cd565b806331c864e81161016f57806349a5980a1161013e57806349a5980a1461039057806354214f69146103b957806355f804b3146103e45780635c975abb1461040d576101cd565b806331c864e81461031d5780633ccfd60b146103395780633f4ba83a1461035057806342842e0e14610367576101cd565b8063081812fc116101ab578063081812fc14610263578063095ea7b3146102a057806318160ddd146102c957806323b872dd146102f4576101cd565b806301ffc9a7146101d2578063045f78501461020f57806306fdde0314610238575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612ac9565b6106d7565b6040516102069190612e52565b60405180910390f35b34801561021b57600080fd5b5061023660048036038101906102319190612a5c565b6107b9565b005b34801561024457600080fd5b5061024d610820565b60405161025a9190612e6d565b60405180910390f35b34801561026f57600080fd5b5061028a60048036038101906102859190612b6c565b6108b2565b6040516102979190612deb565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c29190612a5c565b61092e565b005b3480156102d557600080fd5b506102de610a39565b6040516102eb9190612fcf565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612946565b610a50565b005b61033760048036038101906103329190612b6c565b610a60565b005b34801561034557600080fd5b5061034e610bb0565b005b34801561035c57600080fd5b50610365610c4b565b005b34801561037357600080fd5b5061038e60048036038101906103899190612946565b610c5d565b005b34801561039c57600080fd5b506103b760048036038101906103b29190612a9c565b610c7d565b005b3480156103c557600080fd5b506103ce610ca2565b6040516103db9190612e52565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190612b23565b610cb5565b005b34801561041957600080fd5b50610422610cd7565b60405161042f9190612e52565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190612b6c565b610cee565b60405161046c9190612deb565b60405180910390f35b34801561048157600080fd5b5061049c600480360381019061049791906128d9565b610d04565b6040516104a99190612fcf565b60405180910390f35b3480156104be57600080fd5b506104c7610dd4565b005b3480156104d557600080fd5b506104de610de8565b005b3480156104ec57600080fd5b506104f5610dfa565b6040516105029190612fcf565b60405180910390f35b34801561051757600080fd5b50610520610e00565b60405161052d9190612deb565b60405180910390f35b34801561054257600080fd5b5061054b610e2a565b6040516105589190612e6d565b60405180910390f35b34801561056d57600080fd5b50610576610ebc565b6040516105839190612fcf565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190612a1c565b610f0b565b005b3480156105c157600080fd5b506105ca611083565b6040516105d79190612fcf565b60405180910390f35b3480156105ec57600080fd5b5061060760048036038101906106029190612999565b611089565b005b34801561061557600080fd5b50610630600480360381019061062b9190612b6c565b611105565b60405161063d9190612e6d565b60405180910390f35b34801561065257600080fd5b5061065b611184565b6040516106689190612fcf565b60405180910390f35b34801561067d57600080fd5b5061069860048036038101906106939190612906565b61118a565b6040516106a59190612e52565b60405180910390f35b3480156106ba57600080fd5b506106d560048036038101906106d091906128d9565b61121e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107b257506107b1826112a2565b5b9050919050565b6107c161130c565b601054816000546107d291906130b4565b10610812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080990612ecf565b60405180910390fd5b61081c828261138a565b5050565b60606002805461082f9061327f565b80601f016020809104026020016040519081016040528092919081815260200182805461085b9061327f565b80156108a85780601f1061087d576101008083540402835291602001916108a8565b820191906000526020600020905b81548152906001019060200180831161088b57829003601f168201915b5050505050905090565b60006108bd826113a8565b6108f3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093982610cee565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109a1576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109c06113f6565b73ffffffffffffffffffffffffffffffffffffffff16141580156109f257506109f0816109eb6113f6565b61118a565b155b15610a29576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a348383836113fe565b505050565b6000610a436114b0565b6001546000540303905090565b610a5b8383836114b5565b505050565b6000610a6a610ebc565b90506000811415610abd5760018214610ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaf90612eef565b60405180910390fd5b610b02565b6005821115610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af890612f2f565b60405180910390fd5b5b60105482600054610b1391906130b4565b1115610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b90612ecf565b60405180910390fd5b8181610b60919061313b565b341015610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9990612faf565b60405180910390fd5b610bac338361138a565b5050565b610bb861130c565b60004711610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf290612f8f565b60405180910390fd5b610c03610e00565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c48573d6000803e3d6000fd5b50565b610c5361130c565b610c5b61196b565b565b610c7883838360405180602001604052806000815250611089565b505050565b610c8561130c565b80600a60006101000a81548160ff02191690831515021790555050565b600a60009054906101000a900460ff1681565b610cbd61130c565b80600c9080519060200190610cd39291906126aa565b5050565b6000600860009054906101000a900460ff16905090565b6000610cf9826119ce565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d6c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610ddc61130c565b610de66000611c5d565b565b610df061130c565b610df8611d23565b565b600e5481565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e399061327f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e659061327f565b8015610eb25780601f10610e8757610100808354040283529160200191610eb2565b820191906000526020600020905b815481529060010190602001808311610e9557829003601f168201915b5050505050905090565b6000600a60009054906101000a900460ff1615610f03576064600054610ee2919061310a565b600e54610eef919061313b565b600f54610efc91906130b4565b9050610f08565b600090505b90565b610f136113f6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f78576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610f856113f6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110326113f6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110779190612e52565b60405180910390a35050565b600f5481565b6110948484846114b5565b6110b38373ffffffffffffffffffffffffffffffffffffffff16611d86565b80156110c857506110c684848484611da9565b155b156110ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611110826113a8565b61114f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114690612f6f565b60405180910390fd5b600a60009054906101000a900460ff16156111745761116d82611f09565b905061117f565b61117c611fa8565b90505b919050565b60105481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61122661130c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90612eaf565b60405180910390fd5b61129f81611c5d565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6113146113f6565b73ffffffffffffffffffffffffffffffffffffffff16611332610e00565b73ffffffffffffffffffffffffffffffffffffffff1614611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137f90612f4f565b60405180910390fd5b565b6113a482826040518060200160405280600081525061203a565b5050565b6000816113b36114b0565b111580156113c2575060005482105b80156113ef575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006114c0826119ce565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461152b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661154c6113f6565b73ffffffffffffffffffffffffffffffffffffffff16148061157b575061157a856115756113f6565b61118a565b5b806115c057506115896113f6565b73ffffffffffffffffffffffffffffffffffffffff166115a8846108b2565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806115f9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611660576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61166d85858560016123fe565b611679600084876113fe565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156118f95760005482146118f857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119648585856001612418565b5050505050565b61197361241e565b6000600860006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6119b76113f6565b6040516119c49190612deb565b60405180910390a1565b6119d6612730565b6000829050806119e46114b0565b111580156119f3575060005481105b15611c26576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611c2457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b08578092505050611c58565b5b600115611c2357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c1e578092505050611c58565b611b09565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d2b612467565b6001600860006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611d6f6113f6565b604051611d7c9190612deb565b60405180910390a1565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611dcf6113f6565b8786866040518563ffffffff1660e01b8152600401611df19493929190612e06565b602060405180830381600087803b158015611e0b57600080fd5b505af1925050508015611e3c57506040513d601f19601f82011682018060405250810190611e399190612af6565b60015b611eb6573d8060008114611e6c576040519150601f19603f3d011682016040523d82523d6000602084013e611e71565b606091505b50600081511415611eae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060611f14826113a8565b611f4a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611f546124b1565b9050600081511415611f755760405180602001604052806000815250611fa0565b80611f7f84612543565b604051602001611f90929190612dc7565b6040516020818303038152906040525b915050919050565b6060600d8054611fb79061327f565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe39061327f565b80156120305780601f1061200557610100808354040283529160200191612030565b820191906000526020600020905b81548152906001019060200180831161201357829003601f168201915b5050505050905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120a7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156120e2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120ef60008583866123fe565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506122b08673ffffffffffffffffffffffffffffffffffffffff16611d86565b15612376575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123256000878480600101955087611da9565b61235b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156122b657826000541461237157600080fd5b6123e2565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612377575b8160008190555050506123f86000858386612418565b50505050565b612406612467565b612412848484846126a4565b50505050565b50505050565b612426610cd7565b612465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245c90612e8f565b60405180910390fd5b565b61246f610cd7565b156124af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a690612f0f565b60405180910390fd5b565b6060600c80546124c09061327f565b80601f01602080910402602001604051908101604052809291908181526020018280546124ec9061327f565b80156125395780601f1061250e57610100808354040283529160200191612539565b820191906000526020600020905b81548152906001019060200180831161251c57829003601f168201915b5050505050905090565b6060600082141561258b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061269f565b600082905060005b600082146125bd5780806125a6906132e2565b915050600a826125b6919061310a565b9150612593565b60008167ffffffffffffffff8111156125d9576125d8613418565b5b6040519080825280601f01601f19166020018201604052801561260b5781602001600182028036833780820191505090505b5090505b60008514612698576001826126249190613195565b9150600a85612633919061332b565b603061263f91906130b4565b60f81b818381518110612655576126546133e9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612691919061310a565b945061260f565b8093505050505b919050565b50505050565b8280546126b69061327f565b90600052602060002090601f0160209004810192826126d8576000855561271f565b82601f106126f157805160ff191683800117855561271f565b8280016001018555821561271f579182015b8281111561271e578251825591602001919060010190612703565b5b50905061272c9190612773565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561278c576000816000905550600101612774565b5090565b60006127a361279e8461300f565b612fea565b9050828152602081018484840111156127bf576127be61344c565b5b6127ca84828561323d565b509392505050565b60006127e56127e084613040565b612fea565b9050828152602081018484840111156128015761280061344c565b5b61280c84828561323d565b509392505050565b6000813590506128238161369e565b92915050565b600081359050612838816136b5565b92915050565b60008135905061284d816136cc565b92915050565b600081519050612862816136cc565b92915050565b600082601f83011261287d5761287c613447565b5b813561288d848260208601612790565b91505092915050565b600082601f8301126128ab576128aa613447565b5b81356128bb8482602086016127d2565b91505092915050565b6000813590506128d3816136e3565b92915050565b6000602082840312156128ef576128ee613456565b5b60006128fd84828501612814565b91505092915050565b6000806040838503121561291d5761291c613456565b5b600061292b85828601612814565b925050602061293c85828601612814565b9150509250929050565b60008060006060848603121561295f5761295e613456565b5b600061296d86828701612814565b935050602061297e86828701612814565b925050604061298f868287016128c4565b9150509250925092565b600080600080608085870312156129b3576129b2613456565b5b60006129c187828801612814565b94505060206129d287828801612814565b93505060406129e3878288016128c4565b925050606085013567ffffffffffffffff811115612a0457612a03613451565b5b612a1087828801612868565b91505092959194509250565b60008060408385031215612a3357612a32613456565b5b6000612a4185828601612814565b9250506020612a5285828601612829565b9150509250929050565b60008060408385031215612a7357612a72613456565b5b6000612a8185828601612814565b9250506020612a92858286016128c4565b9150509250929050565b600060208284031215612ab257612ab1613456565b5b6000612ac084828501612829565b91505092915050565b600060208284031215612adf57612ade613456565b5b6000612aed8482850161283e565b91505092915050565b600060208284031215612b0c57612b0b613456565b5b6000612b1a84828501612853565b91505092915050565b600060208284031215612b3957612b38613456565b5b600082013567ffffffffffffffff811115612b5757612b56613451565b5b612b6384828501612896565b91505092915050565b600060208284031215612b8257612b81613456565b5b6000612b90848285016128c4565b91505092915050565b612ba2816131c9565b82525050565b612bb1816131db565b82525050565b6000612bc282613071565b612bcc8185613087565b9350612bdc81856020860161324c565b612be58161345b565b840191505092915050565b6000612bfb8261307c565b612c058185613098565b9350612c1581856020860161324c565b612c1e8161345b565b840191505092915050565b6000612c348261307c565b612c3e81856130a9565b9350612c4e81856020860161324c565b80840191505092915050565b6000612c67601483613098565b9150612c728261346c565b602082019050919050565b6000612c8a602683613098565b9150612c9582613495565b604082019050919050565b6000612cad601b83613098565b9150612cb8826134e4565b602082019050919050565b6000612cd0602883613098565b9150612cdb8261350d565b604082019050919050565b6000612cf3601083613098565b9150612cfe8261355c565b602082019050919050565b6000612d16602483613098565b9150612d2182613585565b604082019050919050565b6000612d39602083613098565b9150612d44826135d4565b602082019050919050565b6000612d5c602f83613098565b9150612d67826135fd565b604082019050919050565b6000612d7f601083613098565b9150612d8a8261364c565b602082019050919050565b6000612da2601083613098565b9150612dad82613675565b602082019050919050565b612dc181613233565b82525050565b6000612dd38285612c29565b9150612ddf8284612c29565b91508190509392505050565b6000602082019050612e006000830184612b99565b92915050565b6000608082019050612e1b6000830187612b99565b612e286020830186612b99565b612e356040830185612db8565b8181036060830152612e478184612bb7565b905095945050505050565b6000602082019050612e676000830184612ba8565b92915050565b60006020820190508181036000830152612e878184612bf0565b905092915050565b60006020820190508181036000830152612ea881612c5a565b9050919050565b60006020820190508181036000830152612ec881612c7d565b9050919050565b60006020820190508181036000830152612ee881612ca0565b9050919050565b60006020820190508181036000830152612f0881612cc3565b9050919050565b60006020820190508181036000830152612f2881612ce6565b9050919050565b60006020820190508181036000830152612f4881612d09565b9050919050565b60006020820190508181036000830152612f6881612d2c565b9050919050565b60006020820190508181036000830152612f8881612d4f565b9050919050565b60006020820190508181036000830152612fa881612d72565b9050919050565b60006020820190508181036000830152612fc881612d95565b9050919050565b6000602082019050612fe46000830184612db8565b92915050565b6000612ff4613005565b905061300082826132b1565b919050565b6000604051905090565b600067ffffffffffffffff82111561302a57613029613418565b5b6130338261345b565b9050602081019050919050565b600067ffffffffffffffff82111561305b5761305a613418565b5b6130648261345b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006130bf82613233565b91506130ca83613233565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130ff576130fe61335c565b5b828201905092915050565b600061311582613233565b915061312083613233565b9250826131305761312f61338b565b5b828204905092915050565b600061314682613233565b915061315183613233565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561318a5761318961335c565b5b828202905092915050565b60006131a082613233565b91506131ab83613233565b9250828210156131be576131bd61335c565b5b828203905092915050565b60006131d482613213565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561326a57808201518184015260208101905061324f565b83811115613279576000848401525b50505050565b6000600282049050600182168061329757607f821691505b602082108114156132ab576132aa6133ba565b5b50919050565b6132ba8261345b565b810181811067ffffffffffffffff821117156132d9576132d8613418565b5b80604052505050565b60006132ed82613233565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133205761331f61335c565b5b600182019050919050565b600061333682613233565b915061334183613233565b9250826133515761335061338b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f796f7520617265206f766572206f7572206d617820737570706c790000000000600082015250565b7f796f752063616e206f6e6c79206d696e742031206672656520746f6b656e206560008201527f7665727974696d65000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f796f752063616e206f6e6c79206d696e74203520746f6b656e7320657665727960008201527f74696d6500000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f42616c616e6365206d757374203e203000000000000000000000000000000000600082015250565b7f6e6f7420656e6f7567682076616c756500000000000000000000000000000000600082015250565b6136a7816131c9565b81146136b257600080fd5b50565b6136be816131db565b81146136c957600080fd5b50565b6136d5816131e7565b81146136e057600080fd5b50565b6136ec81613233565b81146136f757600080fd5b5056fea2646970667358221220b24ed54c6b233fc3acbca7bdf6f9df8c8dc75226f0bb4f89259f89231eca8c0364736f6c63430008070033
Deployed Bytecode Sourcemap
50671:3077:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29135:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52844:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32248:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33751:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33314:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28384:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34616:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52126:496;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53047:166;;;;;;;;;;;;;:::i;:::-;;51619:65;;;;;;;;;;;;;:::i;:::-;;34857:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51692:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50846:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51462:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49620:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32056:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29504:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24082:103;;;;;;;;;;;;;:::i;:::-;;51550:61;;;;;;;;;;;;;:::i;:::-;;51013:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23434:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32417:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52628:210;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34027:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51058:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35113:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51801:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51103:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34385:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24340:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29135:305;29237:4;29289:25;29274:40;;;:11;:40;;;;:105;;;;29346:33;29331:48;;;:11;:48;;;;29274:105;:158;;;;29396:36;29420:11;29396:23;:36::i;:::-;29274:158;29254:178;;29135:305;;;:::o;52844:195::-;23320:13;:11;:13::i;:::-;52956:9:::1;;52947:8;52925:21;;:30;;;;:::i;:::-;:40;52917:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;53008:23;53018:2;53022:8;53008:9;:23::i;:::-;52844:195:::0;;:::o;32248:100::-;32302:13;32335:5;32328:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32248:100;:::o;33751:204::-;33819:7;33844:16;33852:7;33844;:16::i;:::-;33839:64;;33869:34;;;;;;;;;;;;;;33839:64;33923:15;:24;33939:7;33923:24;;;;;;;;;;;;;;;;;;;;;33916:31;;33751:204;;;:::o;33314:371::-;33387:13;33403:24;33419:7;33403:15;:24::i;:::-;33387:40;;33448:5;33442:11;;:2;:11;;;33438:48;;;33462:24;;;;;;;;;;;;;;33438:48;33519:5;33503:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33529:37;33546:5;33553:12;:10;:12::i;:::-;33529:16;:37::i;:::-;33528:38;33503:63;33499:138;;;33590:35;;;;;;;;;;;;;;33499:138;33649:28;33658:2;33662:7;33671:5;33649:8;:28::i;:::-;33376:309;33314:371;;:::o;28384:303::-;28428:7;28653:15;:13;:15::i;:::-;28638:12;;28622:13;;:28;:46;28615:53;;28384:303;:::o;34616:170::-;34750:28;34760:4;34766:2;34770:7;34750:9;:28::i;:::-;34616:170;;;:::o;52126:496::-;52188:13;52202:10;:8;:10::i;:::-;52188:24;;52236:1;52229:5;:8;52226:192;;;52271:1;52261:8;:11;52253:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52226:192;;;52365:1;52355:8;:11;;52347:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;52226:192;52468:9;;52458:8;52436:21;;:30;;;;:::i;:::-;:41;;52428:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;52544:8;52538:5;:14;;;;:::i;:::-;52527:9;:25;;52519:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52583:31;52593:10;52605:8;52583:9;:31::i;:::-;52177:445;52126:496;:::o;53047:166::-;23320:13;:11;:13::i;:::-;53125:1:::1;53103:21;:23;53095:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;53165:7;:5;:7::i;:::-;53157:25;;:48;53183:21;53157:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53047:166::o:0;51619:65::-;23320:13;:11;:13::i;:::-;51666:10:::1;:8;:10::i;:::-;51619:65::o:0;34857:185::-;34995:39;35012:4;35018:2;35022:7;34995:39;;;;;;;;;;;;:16;:39::i;:::-;34857:185;;;:::o;51692:103::-;23320:13;:11;:13::i;:::-;51774::::1;51763:10;;:24;;;;;;;;;;;;;;;;;;51692:103:::0;:::o;50846:22::-;;;;;;;;;;;;;:::o;51462:82::-;23320:13;:11;:13::i;:::-;51535:1:::1;51527:7;:9;;;;;;;;;;;;:::i;:::-;;51462:82:::0;:::o;49620:86::-;49667:4;49691:7;;;;;;;;;;;49684:14;;49620:86;:::o;32056:125::-;32120:7;32147:21;32160:7;32147:12;:21::i;:::-;:26;;;32140:33;;32056:125;;;:::o;29504:206::-;29568:7;29609:1;29592:19;;:5;:19;;;29588:60;;;29620:28;;;;;;;;;;;;;;29588:60;29674:12;:19;29687:5;29674:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29666:36;;29659:43;;29504:206;;;:::o;24082:103::-;23320:13;:11;:13::i;:::-;24147:30:::1;24174:1;24147:18;:30::i;:::-;24082:103::o:0;51550:61::-;23320:13;:11;:13::i;:::-;51595:8:::1;:6;:8::i;:::-;51550:61::o:0;51013:38::-;;;;:::o;23434:87::-;23480:7;23507:6;;;;;;;;;;;23500:13;;23434:87;:::o;32417:104::-;32473:13;32506:7;32499:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32417:104;:::o;52628:210::-;52669:7;52692:10;;;;;;;;;;;52689:142;;;52775:3;52752:21;;52751:27;;;;:::i;:::-;52735:9;;:45;;;;:::i;:::-;52725:9;;:55;;;;:::i;:::-;52718:62;;;;52689:142;52818:1;52811:8;;52628:210;;:::o;34027:287::-;34138:12;:10;:12::i;:::-;34126:24;;:8;:24;;;34122:54;;;34159:17;;;;;;;;;;;;;;34122:54;34234:8;34189:18;:32;34208:12;:10;:12::i;:::-;34189:32;;;;;;;;;;;;;;;:42;34222:8;34189:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34287:8;34258:48;;34273:12;:10;:12::i;:::-;34258:48;;;34297:8;34258:48;;;;;;:::i;:::-;;;;;;;;34027:287;;:::o;51058:38::-;;;;:::o;35113:369::-;35280:28;35290:4;35296:2;35300:7;35280:9;:28::i;:::-;35323:15;:2;:13;;;:15::i;:::-;:76;;;;;35343:56;35374:4;35380:2;35384:7;35393:5;35343:30;:56::i;:::-;35342:57;35323:76;35319:156;;;35423:40;;;;;;;;;;;;;;35319:156;35113:369;;;;:::o;51801:317::-;51874:13;51908:16;51916:7;51908;:16::i;:::-;51900:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51990:10;;;;;;;;;;;51987:124;;;52023:25;52040:7;52023:16;:25::i;:::-;52016:32;;;;51987:124;52086:13;:11;:13::i;:::-;52079:20;;51801:317;;;;:::o;51103:32::-;;;;:::o;34385:164::-;34482:4;34506:18;:25;34525:5;34506:25;;;;;;;;;;;;;;;:35;34532:8;34506:35;;;;;;;;;;;;;;;;;;;;;;;;;34499:42;;34385:164;;;;:::o;24340:201::-;23320:13;:11;:13::i;:::-;24449:1:::1;24429:22;;:8;:22;;;;24421:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24505:28;24524:8;24505:18;:28::i;:::-;24340:201:::0;:::o;13990:157::-;14075:4;14114:25;14099:40;;;:11;:40;;;;14092:47;;13990:157;;;:::o;23599:132::-;23674:12;:10;:12::i;:::-;23663:23;;:7;:5;:7::i;:::-;:23;;;23655:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23599:132::o;35995:104::-;36064:27;36074:2;36078:8;36064:27;;;;;;;;;;;;:9;:27::i;:::-;35995:104;;:::o;35737:174::-;35794:4;35837:7;35818:15;:13;:15::i;:::-;:26;;:53;;;;;35858:13;;35848:7;:23;35818:53;:85;;;;;35876:11;:20;35888:7;35876:20;;;;;;;;;;;:27;;;;;;;;;;;;35875:28;35818:85;35811:92;;35737:174;;;:::o;21985:98::-;22038:7;22065:10;22058:17;;21985:98;:::o;44963:196::-;45105:2;45078:15;:24;45094:7;45078:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45143:7;45139:2;45123:28;;45132:5;45123:28;;;;;;;;;;;;44963:196;;;:::o;28158:92::-;28214:7;28158:92;:::o;39911:2130::-;40026:35;40064:21;40077:7;40064:12;:21::i;:::-;40026:59;;40124:4;40102:26;;:13;:18;;;:26;;;40098:67;;40137:28;;;;;;;;;;;;;;40098:67;40178:22;40220:4;40204:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;40241:36;40258:4;40264:12;:10;:12::i;:::-;40241:16;:36::i;:::-;40204:73;:126;;;;40318:12;:10;:12::i;:::-;40294:36;;:20;40306:7;40294:11;:20::i;:::-;:36;;;40204:126;40178:153;;40349:17;40344:66;;40375:35;;;;;;;;;;;;;;40344:66;40439:1;40425:16;;:2;:16;;;40421:52;;;40450:23;;;;;;;;;;;;;;40421:52;40486:43;40508:4;40514:2;40518:7;40527:1;40486:21;:43::i;:::-;40594:35;40611:1;40615:7;40624:4;40594:8;:35::i;:::-;40955:1;40925:12;:18;40938:4;40925:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40999:1;40971:12;:16;40984:2;40971:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41017:31;41051:11;:20;41063:7;41051:20;;;;;;;;;;;41017:54;;41102:2;41086:8;:13;;;:18;;;;;;;;;;;;;;;;;;41152:15;41119:8;:23;;;:49;;;;;;;;;;;;;;;;;;41420:19;41452:1;41442:7;:11;41420:33;;41468:31;41502:11;:24;41514:11;41502:24;;;;;;;;;;;41468:58;;41570:1;41545:27;;:8;:13;;;;;;;;;;;;:27;;;41541:384;;;41755:13;;41740:11;:28;41736:174;;41809:4;41793:8;:13;;;:20;;;;;;;;;;;;;;;;;;41862:13;:28;;;41836:8;:23;;;:54;;;;;;;;;;;;;;;;;;41736:174;41541:384;40900:1036;;;41972:7;41968:2;41953:27;;41962:4;41953:27;;;;;;;;;;;;41991:42;42012:4;42018:2;42022:7;42031:1;41991:20;:42::i;:::-;40015:2026;;39911:2130;;;:::o;50475:120::-;49484:16;:14;:16::i;:::-;50544:5:::1;50534:7;;:15;;;;;;;;;;;;;;;;;;50565:22;50574:12;:10;:12::i;:::-;50565:22;;;;;;:::i;:::-;;;;;;;;50475:120::o:0;30885:1109::-;30947:21;;:::i;:::-;30981:12;30996:7;30981:22;;31064:4;31045:15;:13;:15::i;:::-;:23;;:47;;;;;31079:13;;31072:4;:20;31045:47;31041:886;;;31113:31;31147:11;:17;31159:4;31147:17;;;;;;;;;;;31113:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31188:9;:16;;;31183:729;;31259:1;31233:28;;:9;:14;;;:28;;;31229:101;;31297:9;31290:16;;;;;;31229:101;31632:261;31639:4;31632:261;;;31672:6;;;;;;;;31717:11;:17;31729:4;31717:17;;;;;;;;;;;31705:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31791:1;31765:28;;:9;:14;;;:28;;;31761:109;;31833:9;31826:16;;;;;;31761:109;31632:261;;;31183:729;31094:833;31041:886;31955:31;;;;;;;;;;;;;;30885:1109;;;;:::o;24701:191::-;24775:16;24794:6;;;;;;;;;;;24775:25;;24820:8;24811:6;;:17;;;;;;;;;;;;;;;;;;24875:8;24844:40;;24865:8;24844:40;;;;;;;;;;;;24764:128;24701:191;:::o;50216:118::-;49225:19;:17;:19::i;:::-;50286:4:::1;50276:7;;:14;;;;;;;;;;;;;;;;;;50306:20;50313:12;:10;:12::i;:::-;50306:20;;;;;;:::i;:::-;;;;;;;;50216:118::o:0;3834:326::-;3894:4;4151:1;4129:7;:19;;;:23;4122:30;;3834:326;;;:::o;45651:667::-;45814:4;45851:2;45835:36;;;45872:12;:10;:12::i;:::-;45886:4;45892:7;45901:5;45835:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45831:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46086:1;46069:6;:13;:18;46065:235;;;46115:40;;;;;;;;;;;;;;46065:235;46258:6;46252:13;46243:6;46239:2;46235:15;46228:38;45831:480;45964:45;;;45954:55;;;:6;:55;;;;45947:62;;;45651:667;;;;;;:::o;32592:318::-;32665:13;32696:16;32704:7;32696;:16::i;:::-;32691:59;;32721:29;;;;;;;;;;;;;;32691:59;32763:21;32787:10;:8;:10::i;:::-;32763:34;;32840:1;32821:7;32815:21;:26;;:87;;;;;;;;;;;;;;;;;32868:7;32877:18;:7;:16;:18::i;:::-;32851:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32815:87;32808:94;;;32592:318;;;:::o;51360:96::-;51406:13;51438:10;51431:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51360:96;:::o;36473:1751::-;36596:20;36619:13;;36596:36;;36661:1;36647:16;;:2;:16;;;36643:48;;;36672:19;;;;;;;;;;;;;;36643:48;36718:1;36706:8;:13;36702:44;;;36728:18;;;;;;;;;;;;;;36702:44;36759:61;36789:1;36793:2;36797:12;36811:8;36759:21;:61::i;:::-;37132:8;37097:12;:16;37110:2;37097:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37196:8;37156:12;:16;37169:2;37156:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37255:2;37222:11;:25;37234:12;37222:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37322:15;37272:11;:25;37284:12;37272:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37355:20;37378:12;37355:35;;37405:11;37434:8;37419:12;:23;37405:37;;37463:15;:2;:13;;;:15::i;:::-;37459:633;;;37499:314;37555:12;37551:2;37530:38;;37547:1;37530:38;;;;;;;;;;;;37596:69;37635:1;37639:2;37643:14;;;;;;37659:5;37596:30;:69::i;:::-;37591:174;;37701:40;;;;;;;;;;;;;;37591:174;37808:3;37792:12;:19;;37499:314;;37894:12;37877:13;;:29;37873:43;;37908:8;;;37873:43;37459:633;;;37957:120;38013:14;;;;;;38009:2;37988:40;;38005:1;37988:40;;;;;;;;;;;;38072:3;38056:12;:19;;37957:120;;37459:633;38122:12;38106:13;:28;;;;37072:1074;;38156:60;38185:1;38189:2;38193:12;38207:8;38156:20;:60::i;:::-;36585:1639;36473:1751;;;:::o;53219:286::-;49225:19;:17;:19::i;:::-;53439:58:::1;53467:4;53472:2;53475:12;53488:8;53439:27;:58::i;:::-;53219:286:::0;;;;:::o;47784:158::-;;;;;:::o;49964:108::-;50031:8;:6;:8::i;:::-;50023:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;49964:108::o;49779:::-;49850:8;:6;:8::i;:::-;49849:9;49841:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;49779:108::o;51254:100::-;51306:13;51339:7;51332:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51254:100;:::o;534:723::-;590:13;820:1;811:5;:10;807:53;;;838:10;;;;;;;;;;;;;;;;;;;;;807:53;870:12;885:5;870:20;;901:14;926:78;941:1;933:4;:9;926:78;;959:8;;;;;:::i;:::-;;;;990:2;982:10;;;;;:::i;:::-;;;926:78;;;1014:19;1046:6;1036:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1014:39;;1064:154;1080:1;1071:5;:10;1064:154;;1108:1;1098:11;;;;;:::i;:::-;;;1175:2;1167:5;:10;;;;:::i;:::-;1154:2;:24;;;;:::i;:::-;1141:39;;1124:6;1131;1124:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1204:2;1195:11;;;;;:::i;:::-;;;1064:154;;;1242:6;1228:21;;;;;534:723;;;;:::o;46966:159::-;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7611:109;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;7726:360;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;8092:364;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;8462:377;;;;:::o;8845:366::-;8987:3;9008:67;9072:2;9067:3;9008:67;:::i;:::-;9001:74;;9084:93;9173:3;9084:93;:::i;:::-;9202:2;9197:3;9193:12;9186:19;;8845:366;;;:::o;9217:::-;9359:3;9380:67;9444:2;9439:3;9380:67;:::i;:::-;9373:74;;9456:93;9545:3;9456:93;:::i;:::-;9574:2;9569:3;9565:12;9558:19;;9217:366;;;:::o;9589:::-;9731:3;9752:67;9816:2;9811:3;9752:67;:::i;:::-;9745:74;;9828:93;9917:3;9828:93;:::i;:::-;9946:2;9941:3;9937:12;9930:19;;9589:366;;;:::o;9961:::-;10103:3;10124:67;10188:2;10183:3;10124:67;:::i;:::-;10117:74;;10200:93;10289:3;10200:93;:::i;:::-;10318:2;10313:3;10309:12;10302:19;;9961:366;;;:::o;10333:::-;10475:3;10496:67;10560:2;10555:3;10496:67;:::i;:::-;10489:74;;10572:93;10661:3;10572:93;:::i;:::-;10690:2;10685:3;10681:12;10674:19;;10333:366;;;:::o;10705:::-;10847:3;10868:67;10932:2;10927:3;10868:67;:::i;:::-;10861:74;;10944:93;11033:3;10944:93;:::i;:::-;11062:2;11057:3;11053:12;11046:19;;10705:366;;;:::o;11077:::-;11219:3;11240:67;11304:2;11299:3;11240:67;:::i;:::-;11233:74;;11316:93;11405:3;11316:93;:::i;:::-;11434:2;11429:3;11425:12;11418:19;;11077:366;;;:::o;11449:::-;11591:3;11612:67;11676:2;11671:3;11612:67;:::i;:::-;11605:74;;11688:93;11777:3;11688:93;:::i;:::-;11806:2;11801:3;11797:12;11790:19;;11449:366;;;:::o;11821:::-;11963:3;11984:67;12048:2;12043:3;11984:67;:::i;:::-;11977:74;;12060:93;12149:3;12060:93;:::i;:::-;12178:2;12173:3;12169:12;12162:19;;11821:366;;;:::o;12193:::-;12335:3;12356:67;12420:2;12415:3;12356:67;:::i;:::-;12349:74;;12432:93;12521:3;12432:93;:::i;:::-;12550:2;12545:3;12541:12;12534:19;;12193:366;;;:::o;12565:118::-;12652:24;12670:5;12652:24;:::i;:::-;12647:3;12640:37;12565:118;;:::o;12689:435::-;12869:3;12891:95;12982:3;12973:6;12891:95;:::i;:::-;12884:102;;13003:95;13094:3;13085:6;13003:95;:::i;:::-;12996:102;;13115:3;13108:10;;12689:435;;;;;:::o;13130:222::-;13223:4;13261:2;13250:9;13246:18;13238:26;;13274:71;13342:1;13331:9;13327:17;13318:6;13274:71;:::i;:::-;13130:222;;;;:::o;13358:640::-;13553:4;13591:3;13580:9;13576:19;13568:27;;13605:71;13673:1;13662:9;13658:17;13649:6;13605:71;:::i;:::-;13686:72;13754:2;13743:9;13739:18;13730:6;13686:72;:::i;:::-;13768;13836:2;13825:9;13821:18;13812:6;13768:72;:::i;:::-;13887:9;13881:4;13877:20;13872:2;13861:9;13857:18;13850:48;13915:76;13986:4;13977:6;13915:76;:::i;:::-;13907:84;;13358:640;;;;;;;:::o;14004:210::-;14091:4;14129:2;14118:9;14114:18;14106:26;;14142:65;14204:1;14193:9;14189:17;14180:6;14142:65;:::i;:::-;14004:210;;;;:::o;14220:313::-;14333:4;14371:2;14360:9;14356:18;14348:26;;14420:9;14414:4;14410:20;14406:1;14395:9;14391:17;14384:47;14448:78;14521:4;14512:6;14448:78;:::i;:::-;14440:86;;14220:313;;;;:::o;14539:419::-;14705:4;14743:2;14732:9;14728:18;14720:26;;14792:9;14786:4;14782:20;14778:1;14767:9;14763:17;14756:47;14820:131;14946:4;14820:131;:::i;:::-;14812:139;;14539:419;;;:::o;14964:::-;15130:4;15168:2;15157:9;15153:18;15145:26;;15217:9;15211:4;15207:20;15203:1;15192:9;15188:17;15181:47;15245:131;15371:4;15245:131;:::i;:::-;15237:139;;14964:419;;;:::o;15389:::-;15555:4;15593:2;15582:9;15578:18;15570:26;;15642:9;15636:4;15632:20;15628:1;15617:9;15613:17;15606:47;15670:131;15796:4;15670:131;:::i;:::-;15662:139;;15389:419;;;:::o;15814:::-;15980:4;16018:2;16007:9;16003:18;15995:26;;16067:9;16061:4;16057:20;16053:1;16042:9;16038:17;16031:47;16095:131;16221:4;16095:131;:::i;:::-;16087:139;;15814:419;;;:::o;16239:::-;16405:4;16443:2;16432:9;16428:18;16420:26;;16492:9;16486:4;16482:20;16478:1;16467:9;16463:17;16456:47;16520:131;16646:4;16520:131;:::i;:::-;16512:139;;16239:419;;;:::o;16664:::-;16830:4;16868:2;16857:9;16853:18;16845:26;;16917:9;16911:4;16907:20;16903:1;16892:9;16888:17;16881:47;16945:131;17071:4;16945:131;:::i;:::-;16937:139;;16664:419;;;:::o;17089:::-;17255:4;17293:2;17282:9;17278:18;17270:26;;17342:9;17336:4;17332:20;17328:1;17317:9;17313:17;17306:47;17370:131;17496:4;17370:131;:::i;:::-;17362:139;;17089:419;;;:::o;17514:::-;17680:4;17718:2;17707:9;17703:18;17695:26;;17767:9;17761:4;17757:20;17753:1;17742:9;17738:17;17731:47;17795:131;17921:4;17795:131;:::i;:::-;17787:139;;17514:419;;;:::o;17939:::-;18105:4;18143:2;18132:9;18128:18;18120:26;;18192:9;18186:4;18182:20;18178:1;18167:9;18163:17;18156:47;18220:131;18346:4;18220:131;:::i;:::-;18212:139;;17939:419;;;:::o;18364:::-;18530:4;18568:2;18557:9;18553:18;18545:26;;18617:9;18611:4;18607:20;18603:1;18592:9;18588:17;18581:47;18645:131;18771:4;18645:131;:::i;:::-;18637:139;;18364:419;;;:::o;18789:222::-;18882:4;18920:2;18909:9;18905:18;18897:26;;18933:71;19001:1;18990:9;18986:17;18977:6;18933:71;:::i;:::-;18789:222;;;;:::o;19017:129::-;19051:6;19078:20;;:::i;:::-;19068:30;;19107:33;19135:4;19127:6;19107:33;:::i;:::-;19017:129;;;:::o;19152:75::-;19185:6;19218:2;19212:9;19202:19;;19152:75;:::o;19233:307::-;19294:4;19384:18;19376:6;19373:30;19370:56;;;19406:18;;:::i;:::-;19370:56;19444:29;19466:6;19444:29;:::i;:::-;19436:37;;19528:4;19522;19518:15;19510:23;;19233:307;;;:::o;19546:308::-;19608:4;19698:18;19690:6;19687:30;19684:56;;;19720:18;;:::i;:::-;19684:56;19758:29;19780:6;19758:29;:::i;:::-;19750:37;;19842:4;19836;19832:15;19824:23;;19546:308;;;:::o;19860:98::-;19911:6;19945:5;19939:12;19929:22;;19860:98;;;:::o;19964:99::-;20016:6;20050:5;20044:12;20034:22;;19964:99;;;:::o;20069:168::-;20152:11;20186:6;20181:3;20174:19;20226:4;20221:3;20217:14;20202:29;;20069:168;;;;:::o;20243:169::-;20327:11;20361:6;20356:3;20349:19;20401:4;20396:3;20392:14;20377:29;;20243:169;;;;:::o;20418:148::-;20520:11;20557:3;20542:18;;20418:148;;;;:::o;20572:305::-;20612:3;20631:20;20649:1;20631:20;:::i;:::-;20626:25;;20665:20;20683:1;20665:20;:::i;:::-;20660:25;;20819:1;20751:66;20747:74;20744:1;20741:81;20738:107;;;20825:18;;:::i;:::-;20738:107;20869:1;20866;20862:9;20855:16;;20572:305;;;;:::o;20883:185::-;20923:1;20940:20;20958:1;20940:20;:::i;:::-;20935:25;;20974:20;20992:1;20974:20;:::i;:::-;20969:25;;21013:1;21003:35;;21018:18;;:::i;:::-;21003:35;21060:1;21057;21053:9;21048:14;;20883:185;;;;:::o;21074:348::-;21114:7;21137:20;21155:1;21137:20;:::i;:::-;21132:25;;21171:20;21189:1;21171:20;:::i;:::-;21166:25;;21359:1;21291:66;21287:74;21284:1;21281:81;21276:1;21269:9;21262:17;21258:105;21255:131;;;21366:18;;:::i;:::-;21255:131;21414:1;21411;21407:9;21396:20;;21074:348;;;;:::o;21428:191::-;21468:4;21488:20;21506:1;21488:20;:::i;:::-;21483:25;;21522:20;21540:1;21522:20;:::i;:::-;21517:25;;21561:1;21558;21555:8;21552:34;;;21566:18;;:::i;:::-;21552:34;21611:1;21608;21604:9;21596:17;;21428:191;;;;:::o;21625:96::-;21662:7;21691:24;21709:5;21691:24;:::i;:::-;21680:35;;21625:96;;;:::o;21727:90::-;21761:7;21804:5;21797:13;21790:21;21779:32;;21727:90;;;:::o;21823:149::-;21859:7;21899:66;21892:5;21888:78;21877:89;;21823:149;;;:::o;21978:126::-;22015:7;22055:42;22048:5;22044:54;22033:65;;21978:126;;;:::o;22110:77::-;22147:7;22176:5;22165:16;;22110:77;;;:::o;22193:154::-;22277:6;22272:3;22267;22254:30;22339:1;22330:6;22325:3;22321:16;22314:27;22193:154;;;:::o;22353:307::-;22421:1;22431:113;22445:6;22442:1;22439:13;22431:113;;;22530:1;22525:3;22521:11;22515:18;22511:1;22506:3;22502:11;22495:39;22467:2;22464:1;22460:10;22455:15;;22431:113;;;22562:6;22559:1;22556:13;22553:101;;;22642:1;22633:6;22628:3;22624:16;22617:27;22553:101;22402:258;22353:307;;;:::o;22666:320::-;22710:6;22747:1;22741:4;22737:12;22727:22;;22794:1;22788:4;22784:12;22815:18;22805:81;;22871:4;22863:6;22859:17;22849:27;;22805:81;22933:2;22925:6;22922:14;22902:18;22899:38;22896:84;;;22952:18;;:::i;:::-;22896:84;22717:269;22666:320;;;:::o;22992:281::-;23075:27;23097:4;23075:27;:::i;:::-;23067:6;23063:40;23205:6;23193:10;23190:22;23169:18;23157:10;23154:34;23151:62;23148:88;;;23216:18;;:::i;:::-;23148:88;23256:10;23252:2;23245:22;23035:238;22992:281;;:::o;23279:233::-;23318:3;23341:24;23359:5;23341:24;:::i;:::-;23332:33;;23387:66;23380:5;23377:77;23374:103;;;23457:18;;:::i;:::-;23374:103;23504:1;23497:5;23493:13;23486:20;;23279:233;;;:::o;23518:176::-;23550:1;23567:20;23585:1;23567:20;:::i;:::-;23562:25;;23601:20;23619:1;23601:20;:::i;:::-;23596:25;;23640:1;23630:35;;23645:18;;:::i;:::-;23630:35;23686:1;23683;23679:9;23674:14;;23518:176;;;;:::o;23700:180::-;23748:77;23745:1;23738:88;23845:4;23842:1;23835:15;23869:4;23866:1;23859:15;23886:180;23934:77;23931:1;23924:88;24031:4;24028:1;24021:15;24055:4;24052:1;24045:15;24072:180;24120:77;24117:1;24110:88;24217:4;24214:1;24207:15;24241:4;24238:1;24231:15;24258:180;24306:77;24303:1;24296:88;24403:4;24400:1;24393:15;24427:4;24424:1;24417:15;24444:180;24492:77;24489:1;24482:88;24589:4;24586:1;24579:15;24613:4;24610:1;24603:15;24630:117;24739:1;24736;24729:12;24753:117;24862:1;24859;24852:12;24876:117;24985:1;24982;24975:12;24999:117;25108:1;25105;25098:12;25122:102;25163:6;25214:2;25210:7;25205:2;25198:5;25194:14;25190:28;25180:38;;25122:102;;;:::o;25230:170::-;25370:22;25366:1;25358:6;25354:14;25347:46;25230:170;:::o;25406:225::-;25546:34;25542:1;25534:6;25530:14;25523:58;25615:8;25610:2;25602:6;25598:15;25591:33;25406:225;:::o;25637:177::-;25777:29;25773:1;25765:6;25761:14;25754:53;25637:177;:::o;25820:227::-;25960:34;25956:1;25948:6;25944:14;25937:58;26029:10;26024:2;26016:6;26012:15;26005:35;25820:227;:::o;26053:166::-;26193:18;26189:1;26181:6;26177:14;26170:42;26053:166;:::o;26225:223::-;26365:34;26361:1;26353:6;26349:14;26342:58;26434:6;26429:2;26421:6;26417:15;26410:31;26225:223;:::o;26454:182::-;26594:34;26590:1;26582:6;26578:14;26571:58;26454:182;:::o;26642:234::-;26782:34;26778:1;26770:6;26766:14;26759:58;26851:17;26846:2;26838:6;26834:15;26827:42;26642:234;:::o;26882:166::-;27022:18;27018:1;27010:6;27006:14;26999:42;26882:166;:::o;27054:::-;27194:18;27190:1;27182:6;27178:14;27171:42;27054:166;:::o;27226:122::-;27299:24;27317:5;27299:24;:::i;:::-;27292:5;27289:35;27279:63;;27338:1;27335;27328:12;27279:63;27226:122;:::o;27354:116::-;27424:21;27439:5;27424:21;:::i;:::-;27417:5;27414:32;27404:60;;27460:1;27457;27450:12;27404:60;27354:116;:::o;27476:120::-;27548:23;27565:5;27548:23;:::i;:::-;27541:5;27538:34;27528:62;;27586:1;27583;27576:12;27528:62;27476:120;:::o;27602:122::-;27675:24;27693:5;27675:24;:::i;:::-;27668:5;27665:35;27655:63;;27714:1;27711;27704:12;27655:63;27602:122;:::o
Swarm Source
ipfs://b24ed54c6b233fc3acbca7bdf6f9df8c8dc75226f0bb4f89259f89231eca8c03
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.