ERC-721
Overview
Max Total Supply
323 SPUNK
Holders
56
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
30 SPUNKLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CryptoSkullPunks
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-12 */ // File: @openzeppelin/[email protected]/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/[email protected]/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/[email protected]/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/[email protected]/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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: @openzeppelin/[email protected]/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/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/[email protected]/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/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/[email protected]/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/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/test.sol pragma solidity ^0.8.2; contract CryptoSkullPunks is ERC721, ERC721Enumerable, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; //project info string public projectName = "Crypto Skull Punks"; string public projectSym = "SPUNK"; uint256 public mintPrice = 0.02 ether; uint256 public maxSupply = 10000; uint256 public mintLimit = 10; uint256 public freeMintAmount = 1000; bool public publicSaleState = false; constructor() ERC721(projectName, projectSym) {} function _baseURI() internal pure override returns (string memory) { //swap this link with correct repository return "https://ipfs.io/ipfs/QmWQzPvTGpPvU927JytwGyfnhoPNtjTUCQ8FUfNNAYEtBE/"; } //toggle public sale function changeStatePublicSale() public onlyOwner returns(bool) { publicSaleState = !publicSaleState; return publicSaleState; } //public mint function function mint(uint numberOfTokens) external payable { require(publicSaleState, "Sale is not active"); require(_tokenIdCounter.current() <= maxSupply, "Not enough tokens left"); require(numberOfTokens <= mintLimit, "Too many tokens for one transaction"); if(_tokenIdCounter.current() >= freeMintAmount){ require(msg.value >= (mintPrice * numberOfTokens), "Insufficient payment"); } mintInternal(msg.sender, numberOfTokens); } //backend mint function mintInternal(address wallet, uint amount) internal { uint currentTokenSupply = _tokenIdCounter.current(); require((currentTokenSupply + amount) <= maxSupply, "Not enough tokens left"); for(uint i = 0; i< amount; i++){ currentTokenSupply++; _safeMint(wallet, currentTokenSupply); _tokenIdCounter.increment(); } } //change free mint amount function setfreeAmount(uint16 _newFreeMints) public onlyOwner() { freeMintAmount = _newFreeMints; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, Strings.toString(tokenId), ".json")) : ""; } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } //cashout function withdraw() public onlyOwner { require(address(this).balance > 0, "Balance is 0"); payable(owner()).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":[],"name":"changeStatePublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","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":"projectName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectSym","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newFreeMints","type":"uint16"}],"name":"setfreeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280601281526020017f43727970746f20536b756c6c2050756e6b730000000000000000000000000000815250600c90805190602001906200005192919062000333565b506040518060400160405280600581526020017f5350554e4b000000000000000000000000000000000000000000000000000000815250600d90805190602001906200009f92919062000333565b5066470de4df820000600e55612710600f55600a6010556103e86011556000601260006101000a81548160ff021916908315150217905550348015620000e457600080fd5b50600c8054620000f490620003e3565b80601f01602080910402602001604051908101604052809291908181526020018280546200012290620003e3565b8015620001735780601f10620001475761010080835404028352916020019162000173565b820191906000526020600020905b8154815290600101906020018083116200015557829003601f168201915b5050505050600d80546200018790620003e3565b80601f0160208091040260200160405190810160405280929190818152602001828054620001b590620003e3565b8015620002065780601f10620001da5761010080835404028352916020019162000206565b820191906000526020600020905b815481529060010190602001808311620001e857829003601f168201915b505050505081600090805190602001906200022392919062000333565b5080600190805190602001906200023c92919062000333565b5050506200025f620002536200026560201b60201c565b6200026d60201b60201c565b62000448565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200034190620003e3565b90600052602060002090601f016020900481019282620003655760008555620003b1565b82601f106200038057805160ff1916838001178555620003b1565b82800160010185558215620003b1579182015b82811115620003b057825182559160200191906001019062000393565b5b509050620003c09190620003c4565b5090565b5b80821115620003df576000816000905550600101620003c5565b5090565b60006002820490506001821680620003fc57607f821691505b6020821081141562000413576200041262000419565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613f5080620004586000396000f3fe6080604052600436106101cd5760003560e01c806370a08231116100f7578063a0712d6811610095578063d1cbf17d11610064578063d1cbf17d1461066b578063d5abeb0114610696578063e985e9c5146106c1578063f2fde38b146106fe576101cd565b8063a0712d68146105c0578063a22cb465146105dc578063b88d4fde14610605578063c87b56dd1461062e576101cd565b80638da5cb5b116100d15780638da5cb5b1461051457806395d89b411461053f578063996517cf1461056a5780639a33e30014610595576101cd565b806370a0823114610495578063715018a6146104d257806371adc02a146104e9576101cd565b80632d46d6ff1161016f57806342842e0e1161013e57806342842e0e146103c75780634f6ccce7146103f05780636352211e1461042d5780636817c76c1461046a576101cd565b80632d46d6ff1461031f5780632f745c59146103485780633a467e3d146103855780633ccfd60b146103b0576101cd565b8063081812fc116101ab578063081812fc14610265578063095ea7b3146102a257806318160ddd146102cb57806323b872dd146102f6576101cd565b806301ffc9a7146101d257806305f20d6e1461020f57806306fdde031461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612b29565b610727565b604051610206919061308b565b60405180910390f35b34801561021b57600080fd5b50610224610739565b60405161023191906130a6565b60405180910390f35b34801561024657600080fd5b5061024f6107c7565b60405161025c91906130a6565b60405180910390f35b34801561027157600080fd5b5061028c60048036038101906102879190612bb0565b610859565b6040516102999190613024565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190612ae9565b6108de565b005b3480156102d757600080fd5b506102e06109f6565b6040516102ed91906133a8565b60405180910390f35b34801561030257600080fd5b5061031d600480360381019061031891906129d3565b610a03565b005b34801561032b57600080fd5b5061034660048036038101906103419190612b83565b610a63565b005b34801561035457600080fd5b5061036f600480360381019061036a9190612ae9565b610aed565b60405161037c91906133a8565b60405180910390f35b34801561039157600080fd5b5061039a610b92565b6040516103a791906133a8565b60405180910390f35b3480156103bc57600080fd5b506103c5610b98565b005b3480156103d357600080fd5b506103ee60048036038101906103e991906129d3565b610ca7565b005b3480156103fc57600080fd5b5061041760048036038101906104129190612bb0565b610cc7565b60405161042491906133a8565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190612bb0565b610d38565b6040516104619190613024565b60405180910390f35b34801561047657600080fd5b5061047f610dea565b60405161048c91906133a8565b60405180910390f35b3480156104a157600080fd5b506104bc60048036038101906104b79190612966565b610df0565b6040516104c991906133a8565b60405180910390f35b3480156104de57600080fd5b506104e7610ea8565b005b3480156104f557600080fd5b506104fe610f30565b60405161050b919061308b565b60405180910390f35b34801561052057600080fd5b50610529610f43565b6040516105369190613024565b60405180910390f35b34801561054b57600080fd5b50610554610f6d565b60405161056191906130a6565b60405180910390f35b34801561057657600080fd5b5061057f610fff565b60405161058c91906133a8565b60405180910390f35b3480156105a157600080fd5b506105aa611005565b6040516105b791906130a6565b60405180910390f35b6105da60048036038101906105d59190612bb0565b611093565b005b3480156105e857600080fd5b5061060360048036038101906105fe9190612aa9565b6111e5565b005b34801561061157600080fd5b5061062c60048036038101906106279190612a26565b6111fb565b005b34801561063a57600080fd5b5061065560048036038101906106509190612bb0565b61125d565b60405161066291906130a6565b60405180910390f35b34801561067757600080fd5b50610680611304565b60405161068d919061308b565b60405180910390f35b3480156106a257600080fd5b506106ab6113c1565b6040516106b891906133a8565b60405180910390f35b3480156106cd57600080fd5b506106e860048036038101906106e39190612993565b6113c7565b6040516106f5919061308b565b60405180910390f35b34801561070a57600080fd5b5061072560048036038101906107209190612966565b61145b565b005b600061073282611553565b9050919050565b600d805461074690613635565b80601f016020809104026020016040519081016040528092919081815260200182805461077290613635565b80156107bf5780601f10610794576101008083540402835291602001916107bf565b820191906000526020600020905b8154815290600101906020018083116107a257829003601f168201915b505050505081565b6060600080546107d690613635565b80601f016020809104026020016040519081016040528092919081815260200182805461080290613635565b801561084f5780601f106108245761010080835404028352916020019161084f565b820191906000526020600020905b81548152906001019060200180831161083257829003601f168201915b5050505050905090565b6000610864826115cd565b6108a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089a906132c8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e982610d38565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190613348565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610979611639565b73ffffffffffffffffffffffffffffffffffffffff1614806109a857506109a7816109a2611639565b6113c7565b5b6109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de906131e8565b60405180910390fd5b6109f18383611641565b505050565b6000600880549050905090565b610a14610a0e611639565b826116fa565b610a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90613368565b60405180910390fd5b610a5e8383836117d8565b505050565b610a6b611639565b73ffffffffffffffffffffffffffffffffffffffff16610a89610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad6906132e8565b60405180910390fd5b8061ffff1660118190555050565b6000610af883610df0565b8210610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b30906130e8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60115481565b610ba0611639565b73ffffffffffffffffffffffffffffffffffffffff16610bbe610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b906132e8565b60405180910390fd5b60004711610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e90613288565b60405180910390fd5b610c5f610f43565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ca4573d6000803e3d6000fd5b50565b610cc2838383604051806020016040528060008152506111fb565b505050565b6000610cd16109f6565b8210610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990613388565b60405180910390fd5b60088281548110610d2657610d256137ce565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd890613228565b60405180910390fd5b80915050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890613208565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610eb0611639565b73ffffffffffffffffffffffffffffffffffffffff16610ece610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b906132e8565b60405180910390fd5b610f2e6000611a34565b565b601260009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f7c90613635565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa890613635565b8015610ff55780601f10610fca57610100808354040283529160200191610ff5565b820191906000526020600020905b815481529060010190602001808311610fd857829003601f168201915b5050505050905090565b60105481565b600c805461101290613635565b80601f016020809104026020016040519081016040528092919081815260200182805461103e90613635565b801561108b5780601f106110605761010080835404028352916020019161108b565b820191906000526020600020905b81548152906001019060200180831161106e57829003601f168201915b505050505081565b601260009054906101000a900460ff166110e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d9906131a8565b60405180910390fd5b600f546110ef600b611afa565b1115611130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112790613248565b60405180910390fd5b601054811115611175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116c906130c8565b60405180910390fd5b601154611182600b611afa565b106111d85780600e5461119591906134e3565b3410156111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce906132a8565b60405180910390fd5b5b6111e23382611b08565b50565b6111f76111f0611639565b8383611bac565b5050565b61120c611206611639565b836116fa565b61124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124290613368565b60405180910390fd5b61125784848484611d19565b50505050565b6060611268826115cd565b6112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90613328565b60405180910390fd5b60006112b1611d75565b905060008151116112d157604051806020016040528060008152506112fc565b806112db84611d95565b6040516020016112ec929190612ff5565b6040516020818303038152906040525b915050919050565b600061130e611639565b73ffffffffffffffffffffffffffffffffffffffff1661132c610f43565b73ffffffffffffffffffffffffffffffffffffffff1614611382576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611379906132e8565b60405180910390fd5b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550601260009054906101000a900460ff16905090565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611463611639565b73ffffffffffffffffffffffffffffffffffffffff16611481610f43565b73ffffffffffffffffffffffffffffffffffffffff16146114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce906132e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e90613128565b60405180910390fd5b61155081611a34565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115c657506115c582611ef6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116b483610d38565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611705826115cd565b611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b906131c8565b60405180910390fd5b600061174f83610d38565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117be57508373ffffffffffffffffffffffffffffffffffffffff166117a684610859565b73ffffffffffffffffffffffffffffffffffffffff16145b806117cf57506117ce81856113c7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117f882610d38565b73ffffffffffffffffffffffffffffffffffffffff161461184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590613308565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b590613168565b60405180910390fd5b6118c9838383611fd8565b6118d4600082611641565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611924919061353d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461197b919061345c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6000611b14600b611afa565b9050600f548282611b25919061345c565b1115611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d90613248565b60405180910390fd5b60005b82811015611ba6578180611b7c90613698565b925050611b898483611fe8565b611b93600b612006565b8080611b9e90613698565b915050611b69565b50505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1290613188565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d0c919061308b565b60405180910390a3505050565b611d248484846117d8565b611d308484848461201c565b611d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6690613108565b60405180910390fd5b50505050565b6060604051806080016040528060448152602001613ed760449139905090565b60606000821415611ddd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ef1565b600082905060005b60008214611e0f578080611df890613698565b915050600a82611e0891906134b2565b9150611de5565b60008167ffffffffffffffff811115611e2b57611e2a6137fd565b5b6040519080825280601f01601f191660200182016040528015611e5d5781602001600182028036833780820191505090505b5090505b60008514611eea57600182611e76919061353d565b9150600a85611e8591906136e1565b6030611e91919061345c565b60f81b818381518110611ea757611ea66137ce565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ee391906134b2565b9450611e61565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fc157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fd15750611fd0826121b3565b5b9050919050565b611fe383838361221d565b505050565b612002828260405180602001604052806000815250612331565b5050565b6001816000016000828254019250508190555050565b600061203d8473ffffffffffffffffffffffffffffffffffffffff1661238c565b156121a6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612066611639565b8786866040518563ffffffff1660e01b8152600401612088949392919061303f565b602060405180830381600087803b1580156120a257600080fd5b505af19250505080156120d357506040513d601f19601f820116820180604052508101906120d09190612b56565b60015b612156573d8060008114612103576040519150601f19603f3d011682016040523d82523d6000602084013e612108565b606091505b5060008151141561214e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214590613108565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121ab565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61222883838361239f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561226b57612266816123a4565b6122aa565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122a9576122a883826123ed565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122ed576122e88161255a565b61232c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461232b5761232a828261262b565b5b5b505050565b61233b83836126aa565b612348600084848461201c565b612387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237e90613108565b60405180910390fd5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016123fa84610df0565b612404919061353d565b90506000600760008481526020019081526020016000205490508181146124e9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061256e919061353d565b905060006009600084815260200190815260200160002054905060006008838154811061259e5761259d6137ce565b5b9060005260206000200154905080600883815481106125c0576125bf6137ce565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061260f5761260e61379f565b5b6001900381819060005260206000200160009055905550505050565b600061263683610df0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561271a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271190613268565b60405180910390fd5b612723816115cd565b15612763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275a90613148565b60405180910390fd5b61276f60008383611fd8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127bf919061345c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061288b612886846133e8565b6133c3565b9050828152602081018484840111156128a7576128a6613831565b5b6128b28482856135f3565b509392505050565b6000813590506128c981613e63565b92915050565b6000813590506128de81613e7a565b92915050565b6000813590506128f381613e91565b92915050565b60008151905061290881613e91565b92915050565b600082601f8301126129235761292261382c565b5b8135612933848260208601612878565b91505092915050565b60008135905061294b81613ea8565b92915050565b60008135905061296081613ebf565b92915050565b60006020828403121561297c5761297b61383b565b5b600061298a848285016128ba565b91505092915050565b600080604083850312156129aa576129a961383b565b5b60006129b8858286016128ba565b92505060206129c9858286016128ba565b9150509250929050565b6000806000606084860312156129ec576129eb61383b565b5b60006129fa868287016128ba565b9350506020612a0b868287016128ba565b9250506040612a1c86828701612951565b9150509250925092565b60008060008060808587031215612a4057612a3f61383b565b5b6000612a4e878288016128ba565b9450506020612a5f878288016128ba565b9350506040612a7087828801612951565b925050606085013567ffffffffffffffff811115612a9157612a90613836565b5b612a9d8782880161290e565b91505092959194509250565b60008060408385031215612ac057612abf61383b565b5b6000612ace858286016128ba565b9250506020612adf858286016128cf565b9150509250929050565b60008060408385031215612b0057612aff61383b565b5b6000612b0e858286016128ba565b9250506020612b1f85828601612951565b9150509250929050565b600060208284031215612b3f57612b3e61383b565b5b6000612b4d848285016128e4565b91505092915050565b600060208284031215612b6c57612b6b61383b565b5b6000612b7a848285016128f9565b91505092915050565b600060208284031215612b9957612b9861383b565b5b6000612ba78482850161293c565b91505092915050565b600060208284031215612bc657612bc561383b565b5b6000612bd484828501612951565b91505092915050565b612be681613571565b82525050565b612bf581613583565b82525050565b6000612c0682613419565b612c10818561342f565b9350612c20818560208601613602565b612c2981613840565b840191505092915050565b6000612c3f82613424565b612c498185613440565b9350612c59818560208601613602565b612c6281613840565b840191505092915050565b6000612c7882613424565b612c828185613451565b9350612c92818560208601613602565b80840191505092915050565b6000612cab602383613440565b9150612cb682613851565b604082019050919050565b6000612cce602b83613440565b9150612cd9826138a0565b604082019050919050565b6000612cf1603283613440565b9150612cfc826138ef565b604082019050919050565b6000612d14602683613440565b9150612d1f8261393e565b604082019050919050565b6000612d37601c83613440565b9150612d428261398d565b602082019050919050565b6000612d5a602483613440565b9150612d65826139b6565b604082019050919050565b6000612d7d601983613440565b9150612d8882613a05565b602082019050919050565b6000612da0601283613440565b9150612dab82613a2e565b602082019050919050565b6000612dc3602c83613440565b9150612dce82613a57565b604082019050919050565b6000612de6603883613440565b9150612df182613aa6565b604082019050919050565b6000612e09602a83613440565b9150612e1482613af5565b604082019050919050565b6000612e2c602983613440565b9150612e3782613b44565b604082019050919050565b6000612e4f601683613440565b9150612e5a82613b93565b602082019050919050565b6000612e72602083613440565b9150612e7d82613bbc565b602082019050919050565b6000612e95600c83613440565b9150612ea082613be5565b602082019050919050565b6000612eb8601483613440565b9150612ec382613c0e565b602082019050919050565b6000612edb602c83613440565b9150612ee682613c37565b604082019050919050565b6000612efe600583613451565b9150612f0982613c86565b600582019050919050565b6000612f21602083613440565b9150612f2c82613caf565b602082019050919050565b6000612f44602983613440565b9150612f4f82613cd8565b604082019050919050565b6000612f67602f83613440565b9150612f7282613d27565b604082019050919050565b6000612f8a602183613440565b9150612f9582613d76565b604082019050919050565b6000612fad603183613440565b9150612fb882613dc5565b604082019050919050565b6000612fd0602c83613440565b9150612fdb82613e14565b604082019050919050565b612fef816135e9565b82525050565b60006130018285612c6d565b915061300d8284612c6d565b915061301882612ef1565b91508190509392505050565b60006020820190506130396000830184612bdd565b92915050565b60006080820190506130546000830187612bdd565b6130616020830186612bdd565b61306e6040830185612fe6565b81810360608301526130808184612bfb565b905095945050505050565b60006020820190506130a06000830184612bec565b92915050565b600060208201905081810360008301526130c08184612c34565b905092915050565b600060208201905081810360008301526130e181612c9e565b9050919050565b6000602082019050818103600083015261310181612cc1565b9050919050565b6000602082019050818103600083015261312181612ce4565b9050919050565b6000602082019050818103600083015261314181612d07565b9050919050565b6000602082019050818103600083015261316181612d2a565b9050919050565b6000602082019050818103600083015261318181612d4d565b9050919050565b600060208201905081810360008301526131a181612d70565b9050919050565b600060208201905081810360008301526131c181612d93565b9050919050565b600060208201905081810360008301526131e181612db6565b9050919050565b6000602082019050818103600083015261320181612dd9565b9050919050565b6000602082019050818103600083015261322181612dfc565b9050919050565b6000602082019050818103600083015261324181612e1f565b9050919050565b6000602082019050818103600083015261326181612e42565b9050919050565b6000602082019050818103600083015261328181612e65565b9050919050565b600060208201905081810360008301526132a181612e88565b9050919050565b600060208201905081810360008301526132c181612eab565b9050919050565b600060208201905081810360008301526132e181612ece565b9050919050565b6000602082019050818103600083015261330181612f14565b9050919050565b6000602082019050818103600083015261332181612f37565b9050919050565b6000602082019050818103600083015261334181612f5a565b9050919050565b6000602082019050818103600083015261336181612f7d565b9050919050565b6000602082019050818103600083015261338181612fa0565b9050919050565b600060208201905081810360008301526133a181612fc3565b9050919050565b60006020820190506133bd6000830184612fe6565b92915050565b60006133cd6133de565b90506133d98282613667565b919050565b6000604051905090565b600067ffffffffffffffff821115613403576134026137fd565b5b61340c82613840565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613467826135e9565b9150613472836135e9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134a7576134a6613712565b5b828201905092915050565b60006134bd826135e9565b91506134c8836135e9565b9250826134d8576134d7613741565b5b828204905092915050565b60006134ee826135e9565b91506134f9836135e9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561353257613531613712565b5b828202905092915050565b6000613548826135e9565b9150613553836135e9565b92508282101561356657613565613712565b5b828203905092915050565b600061357c826135c9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613620578082015181840152602081019050613605565b8381111561362f576000848401525b50505050565b6000600282049050600182168061364d57607f821691505b6020821081141561366157613660613770565b5b50919050565b61367082613840565b810181811067ffffffffffffffff8211171561368f5761368e6137fd565b5b80604052505050565b60006136a3826135e9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136d6576136d5613712565b5b600182019050919050565b60006136ec826135e9565b91506136f7836135e9565b92508261370757613706613741565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f546f6f206d616e7920746f6b656e7320666f72206f6e65207472616e7361637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f42616c616e636520697320300000000000000000000000000000000000000000600082015250565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613e6c81613571565b8114613e7757600080fd5b50565b613e8381613583565b8114613e8e57600080fd5b50565b613e9a8161358f565b8114613ea557600080fd5b50565b613eb1816135bb565b8114613ebc57600080fd5b50565b613ec8816135e9565b8114613ed357600080fd5b5056fe68747470733a2f2f697066732e696f2f697066732f516d57517a50765447705076553932374a7974774779666e686f504e746a54554351384655664e4e4159457442452fa26469706673582212200e5ac980888a4aed9bb7a9df91d5d199ea8fb57a3e12658319cea4da8a295e1264736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c806370a08231116100f7578063a0712d6811610095578063d1cbf17d11610064578063d1cbf17d1461066b578063d5abeb0114610696578063e985e9c5146106c1578063f2fde38b146106fe576101cd565b8063a0712d68146105c0578063a22cb465146105dc578063b88d4fde14610605578063c87b56dd1461062e576101cd565b80638da5cb5b116100d15780638da5cb5b1461051457806395d89b411461053f578063996517cf1461056a5780639a33e30014610595576101cd565b806370a0823114610495578063715018a6146104d257806371adc02a146104e9576101cd565b80632d46d6ff1161016f57806342842e0e1161013e57806342842e0e146103c75780634f6ccce7146103f05780636352211e1461042d5780636817c76c1461046a576101cd565b80632d46d6ff1461031f5780632f745c59146103485780633a467e3d146103855780633ccfd60b146103b0576101cd565b8063081812fc116101ab578063081812fc14610265578063095ea7b3146102a257806318160ddd146102cb57806323b872dd146102f6576101cd565b806301ffc9a7146101d257806305f20d6e1461020f57806306fdde031461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612b29565b610727565b604051610206919061308b565b60405180910390f35b34801561021b57600080fd5b50610224610739565b60405161023191906130a6565b60405180910390f35b34801561024657600080fd5b5061024f6107c7565b60405161025c91906130a6565b60405180910390f35b34801561027157600080fd5b5061028c60048036038101906102879190612bb0565b610859565b6040516102999190613024565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190612ae9565b6108de565b005b3480156102d757600080fd5b506102e06109f6565b6040516102ed91906133a8565b60405180910390f35b34801561030257600080fd5b5061031d600480360381019061031891906129d3565b610a03565b005b34801561032b57600080fd5b5061034660048036038101906103419190612b83565b610a63565b005b34801561035457600080fd5b5061036f600480360381019061036a9190612ae9565b610aed565b60405161037c91906133a8565b60405180910390f35b34801561039157600080fd5b5061039a610b92565b6040516103a791906133a8565b60405180910390f35b3480156103bc57600080fd5b506103c5610b98565b005b3480156103d357600080fd5b506103ee60048036038101906103e991906129d3565b610ca7565b005b3480156103fc57600080fd5b5061041760048036038101906104129190612bb0565b610cc7565b60405161042491906133a8565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190612bb0565b610d38565b6040516104619190613024565b60405180910390f35b34801561047657600080fd5b5061047f610dea565b60405161048c91906133a8565b60405180910390f35b3480156104a157600080fd5b506104bc60048036038101906104b79190612966565b610df0565b6040516104c991906133a8565b60405180910390f35b3480156104de57600080fd5b506104e7610ea8565b005b3480156104f557600080fd5b506104fe610f30565b60405161050b919061308b565b60405180910390f35b34801561052057600080fd5b50610529610f43565b6040516105369190613024565b60405180910390f35b34801561054b57600080fd5b50610554610f6d565b60405161056191906130a6565b60405180910390f35b34801561057657600080fd5b5061057f610fff565b60405161058c91906133a8565b60405180910390f35b3480156105a157600080fd5b506105aa611005565b6040516105b791906130a6565b60405180910390f35b6105da60048036038101906105d59190612bb0565b611093565b005b3480156105e857600080fd5b5061060360048036038101906105fe9190612aa9565b6111e5565b005b34801561061157600080fd5b5061062c60048036038101906106279190612a26565b6111fb565b005b34801561063a57600080fd5b5061065560048036038101906106509190612bb0565b61125d565b60405161066291906130a6565b60405180910390f35b34801561067757600080fd5b50610680611304565b60405161068d919061308b565b60405180910390f35b3480156106a257600080fd5b506106ab6113c1565b6040516106b891906133a8565b60405180910390f35b3480156106cd57600080fd5b506106e860048036038101906106e39190612993565b6113c7565b6040516106f5919061308b565b60405180910390f35b34801561070a57600080fd5b5061072560048036038101906107209190612966565b61145b565b005b600061073282611553565b9050919050565b600d805461074690613635565b80601f016020809104026020016040519081016040528092919081815260200182805461077290613635565b80156107bf5780601f10610794576101008083540402835291602001916107bf565b820191906000526020600020905b8154815290600101906020018083116107a257829003601f168201915b505050505081565b6060600080546107d690613635565b80601f016020809104026020016040519081016040528092919081815260200182805461080290613635565b801561084f5780601f106108245761010080835404028352916020019161084f565b820191906000526020600020905b81548152906001019060200180831161083257829003601f168201915b5050505050905090565b6000610864826115cd565b6108a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089a906132c8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e982610d38565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190613348565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610979611639565b73ffffffffffffffffffffffffffffffffffffffff1614806109a857506109a7816109a2611639565b6113c7565b5b6109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de906131e8565b60405180910390fd5b6109f18383611641565b505050565b6000600880549050905090565b610a14610a0e611639565b826116fa565b610a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90613368565b60405180910390fd5b610a5e8383836117d8565b505050565b610a6b611639565b73ffffffffffffffffffffffffffffffffffffffff16610a89610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad6906132e8565b60405180910390fd5b8061ffff1660118190555050565b6000610af883610df0565b8210610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b30906130e8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60115481565b610ba0611639565b73ffffffffffffffffffffffffffffffffffffffff16610bbe610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b906132e8565b60405180910390fd5b60004711610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e90613288565b60405180910390fd5b610c5f610f43565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ca4573d6000803e3d6000fd5b50565b610cc2838383604051806020016040528060008152506111fb565b505050565b6000610cd16109f6565b8210610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990613388565b60405180910390fd5b60088281548110610d2657610d256137ce565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd890613228565b60405180910390fd5b80915050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890613208565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610eb0611639565b73ffffffffffffffffffffffffffffffffffffffff16610ece610f43565b73ffffffffffffffffffffffffffffffffffffffff1614610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b906132e8565b60405180910390fd5b610f2e6000611a34565b565b601260009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f7c90613635565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa890613635565b8015610ff55780601f10610fca57610100808354040283529160200191610ff5565b820191906000526020600020905b815481529060010190602001808311610fd857829003601f168201915b5050505050905090565b60105481565b600c805461101290613635565b80601f016020809104026020016040519081016040528092919081815260200182805461103e90613635565b801561108b5780601f106110605761010080835404028352916020019161108b565b820191906000526020600020905b81548152906001019060200180831161106e57829003601f168201915b505050505081565b601260009054906101000a900460ff166110e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d9906131a8565b60405180910390fd5b600f546110ef600b611afa565b1115611130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112790613248565b60405180910390fd5b601054811115611175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116c906130c8565b60405180910390fd5b601154611182600b611afa565b106111d85780600e5461119591906134e3565b3410156111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce906132a8565b60405180910390fd5b5b6111e23382611b08565b50565b6111f76111f0611639565b8383611bac565b5050565b61120c611206611639565b836116fa565b61124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124290613368565b60405180910390fd5b61125784848484611d19565b50505050565b6060611268826115cd565b6112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90613328565b60405180910390fd5b60006112b1611d75565b905060008151116112d157604051806020016040528060008152506112fc565b806112db84611d95565b6040516020016112ec929190612ff5565b6040516020818303038152906040525b915050919050565b600061130e611639565b73ffffffffffffffffffffffffffffffffffffffff1661132c610f43565b73ffffffffffffffffffffffffffffffffffffffff1614611382576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611379906132e8565b60405180910390fd5b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550601260009054906101000a900460ff16905090565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611463611639565b73ffffffffffffffffffffffffffffffffffffffff16611481610f43565b73ffffffffffffffffffffffffffffffffffffffff16146114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce906132e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e90613128565b60405180910390fd5b61155081611a34565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115c657506115c582611ef6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116b483610d38565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611705826115cd565b611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b906131c8565b60405180910390fd5b600061174f83610d38565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117be57508373ffffffffffffffffffffffffffffffffffffffff166117a684610859565b73ffffffffffffffffffffffffffffffffffffffff16145b806117cf57506117ce81856113c7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117f882610d38565b73ffffffffffffffffffffffffffffffffffffffff161461184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590613308565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b590613168565b60405180910390fd5b6118c9838383611fd8565b6118d4600082611641565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611924919061353d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461197b919061345c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6000611b14600b611afa565b9050600f548282611b25919061345c565b1115611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d90613248565b60405180910390fd5b60005b82811015611ba6578180611b7c90613698565b925050611b898483611fe8565b611b93600b612006565b8080611b9e90613698565b915050611b69565b50505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1290613188565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d0c919061308b565b60405180910390a3505050565b611d248484846117d8565b611d308484848461201c565b611d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6690613108565b60405180910390fd5b50505050565b6060604051806080016040528060448152602001613ed760449139905090565b60606000821415611ddd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ef1565b600082905060005b60008214611e0f578080611df890613698565b915050600a82611e0891906134b2565b9150611de5565b60008167ffffffffffffffff811115611e2b57611e2a6137fd565b5b6040519080825280601f01601f191660200182016040528015611e5d5781602001600182028036833780820191505090505b5090505b60008514611eea57600182611e76919061353d565b9150600a85611e8591906136e1565b6030611e91919061345c565b60f81b818381518110611ea757611ea66137ce565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ee391906134b2565b9450611e61565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fc157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fd15750611fd0826121b3565b5b9050919050565b611fe383838361221d565b505050565b612002828260405180602001604052806000815250612331565b5050565b6001816000016000828254019250508190555050565b600061203d8473ffffffffffffffffffffffffffffffffffffffff1661238c565b156121a6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612066611639565b8786866040518563ffffffff1660e01b8152600401612088949392919061303f565b602060405180830381600087803b1580156120a257600080fd5b505af19250505080156120d357506040513d601f19601f820116820180604052508101906120d09190612b56565b60015b612156573d8060008114612103576040519150601f19603f3d011682016040523d82523d6000602084013e612108565b606091505b5060008151141561214e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214590613108565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121ab565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61222883838361239f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561226b57612266816123a4565b6122aa565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122a9576122a883826123ed565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122ed576122e88161255a565b61232c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461232b5761232a828261262b565b5b5b505050565b61233b83836126aa565b612348600084848461201c565b612387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237e90613108565b60405180910390fd5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016123fa84610df0565b612404919061353d565b90506000600760008481526020019081526020016000205490508181146124e9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061256e919061353d565b905060006009600084815260200190815260200160002054905060006008838154811061259e5761259d6137ce565b5b9060005260206000200154905080600883815481106125c0576125bf6137ce565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061260f5761260e61379f565b5b6001900381819060005260206000200160009055905550505050565b600061263683610df0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561271a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271190613268565b60405180910390fd5b612723816115cd565b15612763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275a90613148565b60405180910390fd5b61276f60008383611fd8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127bf919061345c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061288b612886846133e8565b6133c3565b9050828152602081018484840111156128a7576128a6613831565b5b6128b28482856135f3565b509392505050565b6000813590506128c981613e63565b92915050565b6000813590506128de81613e7a565b92915050565b6000813590506128f381613e91565b92915050565b60008151905061290881613e91565b92915050565b600082601f8301126129235761292261382c565b5b8135612933848260208601612878565b91505092915050565b60008135905061294b81613ea8565b92915050565b60008135905061296081613ebf565b92915050565b60006020828403121561297c5761297b61383b565b5b600061298a848285016128ba565b91505092915050565b600080604083850312156129aa576129a961383b565b5b60006129b8858286016128ba565b92505060206129c9858286016128ba565b9150509250929050565b6000806000606084860312156129ec576129eb61383b565b5b60006129fa868287016128ba565b9350506020612a0b868287016128ba565b9250506040612a1c86828701612951565b9150509250925092565b60008060008060808587031215612a4057612a3f61383b565b5b6000612a4e878288016128ba565b9450506020612a5f878288016128ba565b9350506040612a7087828801612951565b925050606085013567ffffffffffffffff811115612a9157612a90613836565b5b612a9d8782880161290e565b91505092959194509250565b60008060408385031215612ac057612abf61383b565b5b6000612ace858286016128ba565b9250506020612adf858286016128cf565b9150509250929050565b60008060408385031215612b0057612aff61383b565b5b6000612b0e858286016128ba565b9250506020612b1f85828601612951565b9150509250929050565b600060208284031215612b3f57612b3e61383b565b5b6000612b4d848285016128e4565b91505092915050565b600060208284031215612b6c57612b6b61383b565b5b6000612b7a848285016128f9565b91505092915050565b600060208284031215612b9957612b9861383b565b5b6000612ba78482850161293c565b91505092915050565b600060208284031215612bc657612bc561383b565b5b6000612bd484828501612951565b91505092915050565b612be681613571565b82525050565b612bf581613583565b82525050565b6000612c0682613419565b612c10818561342f565b9350612c20818560208601613602565b612c2981613840565b840191505092915050565b6000612c3f82613424565b612c498185613440565b9350612c59818560208601613602565b612c6281613840565b840191505092915050565b6000612c7882613424565b612c828185613451565b9350612c92818560208601613602565b80840191505092915050565b6000612cab602383613440565b9150612cb682613851565b604082019050919050565b6000612cce602b83613440565b9150612cd9826138a0565b604082019050919050565b6000612cf1603283613440565b9150612cfc826138ef565b604082019050919050565b6000612d14602683613440565b9150612d1f8261393e565b604082019050919050565b6000612d37601c83613440565b9150612d428261398d565b602082019050919050565b6000612d5a602483613440565b9150612d65826139b6565b604082019050919050565b6000612d7d601983613440565b9150612d8882613a05565b602082019050919050565b6000612da0601283613440565b9150612dab82613a2e565b602082019050919050565b6000612dc3602c83613440565b9150612dce82613a57565b604082019050919050565b6000612de6603883613440565b9150612df182613aa6565b604082019050919050565b6000612e09602a83613440565b9150612e1482613af5565b604082019050919050565b6000612e2c602983613440565b9150612e3782613b44565b604082019050919050565b6000612e4f601683613440565b9150612e5a82613b93565b602082019050919050565b6000612e72602083613440565b9150612e7d82613bbc565b602082019050919050565b6000612e95600c83613440565b9150612ea082613be5565b602082019050919050565b6000612eb8601483613440565b9150612ec382613c0e565b602082019050919050565b6000612edb602c83613440565b9150612ee682613c37565b604082019050919050565b6000612efe600583613451565b9150612f0982613c86565b600582019050919050565b6000612f21602083613440565b9150612f2c82613caf565b602082019050919050565b6000612f44602983613440565b9150612f4f82613cd8565b604082019050919050565b6000612f67602f83613440565b9150612f7282613d27565b604082019050919050565b6000612f8a602183613440565b9150612f9582613d76565b604082019050919050565b6000612fad603183613440565b9150612fb882613dc5565b604082019050919050565b6000612fd0602c83613440565b9150612fdb82613e14565b604082019050919050565b612fef816135e9565b82525050565b60006130018285612c6d565b915061300d8284612c6d565b915061301882612ef1565b91508190509392505050565b60006020820190506130396000830184612bdd565b92915050565b60006080820190506130546000830187612bdd565b6130616020830186612bdd565b61306e6040830185612fe6565b81810360608301526130808184612bfb565b905095945050505050565b60006020820190506130a06000830184612bec565b92915050565b600060208201905081810360008301526130c08184612c34565b905092915050565b600060208201905081810360008301526130e181612c9e565b9050919050565b6000602082019050818103600083015261310181612cc1565b9050919050565b6000602082019050818103600083015261312181612ce4565b9050919050565b6000602082019050818103600083015261314181612d07565b9050919050565b6000602082019050818103600083015261316181612d2a565b9050919050565b6000602082019050818103600083015261318181612d4d565b9050919050565b600060208201905081810360008301526131a181612d70565b9050919050565b600060208201905081810360008301526131c181612d93565b9050919050565b600060208201905081810360008301526131e181612db6565b9050919050565b6000602082019050818103600083015261320181612dd9565b9050919050565b6000602082019050818103600083015261322181612dfc565b9050919050565b6000602082019050818103600083015261324181612e1f565b9050919050565b6000602082019050818103600083015261326181612e42565b9050919050565b6000602082019050818103600083015261328181612e65565b9050919050565b600060208201905081810360008301526132a181612e88565b9050919050565b600060208201905081810360008301526132c181612eab565b9050919050565b600060208201905081810360008301526132e181612ece565b9050919050565b6000602082019050818103600083015261330181612f14565b9050919050565b6000602082019050818103600083015261332181612f37565b9050919050565b6000602082019050818103600083015261334181612f5a565b9050919050565b6000602082019050818103600083015261336181612f7d565b9050919050565b6000602082019050818103600083015261338181612fa0565b9050919050565b600060208201905081810360008301526133a181612fc3565b9050919050565b60006020820190506133bd6000830184612fe6565b92915050565b60006133cd6133de565b90506133d98282613667565b919050565b6000604051905090565b600067ffffffffffffffff821115613403576134026137fd565b5b61340c82613840565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613467826135e9565b9150613472836135e9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134a7576134a6613712565b5b828201905092915050565b60006134bd826135e9565b91506134c8836135e9565b9250826134d8576134d7613741565b5b828204905092915050565b60006134ee826135e9565b91506134f9836135e9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561353257613531613712565b5b828202905092915050565b6000613548826135e9565b9150613553836135e9565b92508282101561356657613565613712565b5b828203905092915050565b600061357c826135c9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613620578082015181840152602081019050613605565b8381111561362f576000848401525b50505050565b6000600282049050600182168061364d57607f821691505b6020821081141561366157613660613770565b5b50919050565b61367082613840565b810181811067ffffffffffffffff8211171561368f5761368e6137fd565b5b80604052505050565b60006136a3826135e9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136d6576136d5613712565b5b600182019050919050565b60006136ec826135e9565b91506136f7836135e9565b92508261370757613706613741565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f546f6f206d616e7920746f6b656e7320666f72206f6e65207472616e7361637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f42616c616e636520697320300000000000000000000000000000000000000000600082015250565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613e6c81613571565b8114613e7757600080fd5b50565b613e8381613583565b8114613e8e57600080fd5b50565b613e9a8161358f565b8114613ea557600080fd5b50565b613eb1816135bb565b8114613ebc57600080fd5b50565b613ec8816135e9565b8114613ed357600080fd5b5056fe68747470733a2f2f697066732e696f2f697066732f516d57517a50765447705076553932374a7974774779666e686f504e746a54554351384655664e4e4159457442452fa26469706673582212200e5ac980888a4aed9bb7a9df91d5d199ea8fb57a3e12658319cea4da8a295e1264736f6c63430008070033
Deployed Bytecode Sourcemap
46043:3424:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49010:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46309:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27297:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28856:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28379:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40449:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29606:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48097:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40117:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46485:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49281:177;;;;;;;;;;;;;:::i;:::-;;30016:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40639:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26991:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46354:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26721:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6219:103;;;;;;;;;;;;;:::i;:::-;;46532:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5568:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27466:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46445:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46250:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47101:501;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29149:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30272:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48226:462;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46903:154;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46402:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29375:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6477:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49010:240;49165:4;49202:36;49226:11;49202:23;:36::i;:::-;49195:43;;49010:240;;;:::o;46309:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27297:100::-;27351:13;27384:5;27377:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27297:100;:::o;28856:221::-;28932:7;28960:16;28968:7;28960;:16::i;:::-;28952:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29045:15;:24;29061:7;29045:24;;;;;;;;;;;;;;;;;;;;;29038:31;;28856:221;;;:::o;28379:411::-;28460:13;28476:23;28491:7;28476:14;:23::i;:::-;28460:39;;28524:5;28518:11;;:2;:11;;;;28510:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28618:5;28602:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28627:37;28644:5;28651:12;:10;:12::i;:::-;28627:16;:37::i;:::-;28602:62;28580:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28761:21;28770:2;28774:7;28761:8;:21::i;:::-;28449:341;28379:411;;:::o;40449:113::-;40510:7;40537:10;:17;;;;40530:24;;40449:113;:::o;29606:339::-;29801:41;29820:12;:10;:12::i;:::-;29834:7;29801:18;:41::i;:::-;29793:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29909:28;29919:4;29925:2;29929:7;29909:9;:28::i;:::-;29606:339;;;:::o;48097:117::-;5799:12;:10;:12::i;:::-;5788:23;;:7;:5;:7::i;:::-;:23;;;5780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48189:13:::1;48172:30;;:14;:30;;;;48097:117:::0;:::o;40117:256::-;40214:7;40250:23;40267:5;40250:16;:23::i;:::-;40242:5;:31;40234:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40339:12;:19;40352:5;40339:19;;;;;;;;;;;;;;;:26;40359:5;40339:26;;;;;;;;;;;;40332:33;;40117:256;;;;:::o;46485:36::-;;;;:::o;49281:177::-;5799:12;:10;:12::i;:::-;5788:23;;:7;:5;:7::i;:::-;:23;;;5780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49365:1:::1;49341:21;:25;49333:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;49406:7;:5;:7::i;:::-;49398:25;;:48;49424:21;49398:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49281:177::o:0;30016:185::-;30154:39;30171:4;30177:2;30181:7;30154:39;;;;;;;;;;;;:16;:39::i;:::-;30016:185;;;:::o;40639:233::-;40714:7;40750:30;:28;:30::i;:::-;40742:5;:38;40734:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40847:10;40858:5;40847:17;;;;;;;;:::i;:::-;;;;;;;;;;40840:24;;40639:233;;;:::o;26991:239::-;27063:7;27083:13;27099:7;:16;27107:7;27099:16;;;;;;;;;;;;;;;;;;;;;27083:32;;27151:1;27134:19;;:5;:19;;;;27126:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27217:5;27210:12;;;26991:239;;;:::o;46354:37::-;;;;:::o;26721:208::-;26793:7;26838:1;26821:19;;:5;:19;;;;26813:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26905:9;:16;26915:5;26905:16;;;;;;;;;;;;;;;;26898:23;;26721:208;;;:::o;6219:103::-;5799:12;:10;:12::i;:::-;5788:23;;:7;:5;:7::i;:::-;:23;;;5780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6284:30:::1;6311:1;6284:18;:30::i;:::-;6219:103::o:0;46532:35::-;;;;;;;;;;;;;:::o;5568:87::-;5614:7;5641:6;;;;;;;;;;;5634:13;;5568:87;:::o;27466:104::-;27522:13;27555:7;27548:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27466:104;:::o;46445:29::-;;;;:::o;46250:48::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47101:501::-;47173:15;;;;;;;;;;;47165:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;47259:9;;47230:25;:15;:23;:25::i;:::-;:38;;47222:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47332:9;;47314:14;:27;;47306:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;47424:14;;47395:25;:15;:23;:25::i;:::-;:43;47392:148;;47488:14;47476:9;;:26;;;;:::i;:::-;47462:9;:41;;47454:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47392:148;47550:40;47563:10;47575:14;47550:12;:40::i;:::-;47101:501;:::o;29149:155::-;29244:52;29263:12;:10;:12::i;:::-;29277:8;29287;29244:18;:52::i;:::-;29149:155;;:::o;30272:328::-;30447:41;30466:12;:10;:12::i;:::-;30480:7;30447:18;:41::i;:::-;30439:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30553:39;30567:4;30573:2;30577:7;30586:5;30553:13;:39::i;:::-;30272:328;;;;:::o;48226:462::-;48299:13;48351:16;48359:7;48351;:16::i;:::-;48329:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;48463:28;48494:10;:8;:10::i;:::-;48463:41;;48557:1;48532:14;48526:28;:32;:150;;;;;;;;;;;;;;;;;48602:14;48618:25;48635:7;48618:16;:25::i;:::-;48585:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48526:150;48519:157;;;48226:462;;;:::o;46903:154::-;46961:4;5799:12;:10;:12::i;:::-;5788:23;;:7;:5;:7::i;:::-;:23;;;5780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46997:15:::1;;;;;;;;;;;46996:16;46978:15;;:34;;;;;;;;;;;;;;;;;;47030:15;;;;;;;;;;;47023:22;;46903:154:::0;:::o;46402:32::-;;;;:::o;29375:164::-;29472:4;29496:18;:25;29515:5;29496:25;;;;;;;;;;;;;;;:35;29522:8;29496:35;;;;;;;;;;;;;;;;;;;;;;;;;29489:42;;29375:164;;;;:::o;6477:201::-;5799:12;:10;:12::i;:::-;5788:23;;:7;:5;:7::i;:::-;:23;;;5780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6586:1:::1;6566:22;;:8;:22;;;;6558:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6642:28;6661:8;6642:18;:28::i;:::-;6477:201:::0;:::o;39809:224::-;39911:4;39950:35;39935:50;;;:11;:50;;;;:90;;;;39989:36;40013:11;39989:23;:36::i;:::-;39935:90;39928:97;;39809:224;;;:::o;32110:127::-;32175:4;32227:1;32199:30;;:7;:16;32207:7;32199:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32192:37;;32110:127;;;:::o;4286:98::-;4339:7;4366:10;4359:17;;4286:98;:::o;36092:174::-;36194:2;36167:15;:24;36183:7;36167:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36250:7;36246:2;36212:46;;36221:23;36236:7;36221:14;:23::i;:::-;36212:46;;;;;;;;;;;;36092:174;;:::o;32404:348::-;32497:4;32522:16;32530:7;32522;:16::i;:::-;32514:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32598:13;32614:23;32629:7;32614:14;:23::i;:::-;32598:39;;32667:5;32656:16;;:7;:16;;;:51;;;;32700:7;32676:31;;:20;32688:7;32676:11;:20::i;:::-;:31;;;32656:51;:87;;;;32711:32;32728:5;32735:7;32711:16;:32::i;:::-;32656:87;32648:96;;;32404:348;;;;:::o;35396:578::-;35555:4;35528:31;;:23;35543:7;35528:14;:23::i;:::-;:31;;;35520:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;35638:1;35624:16;;:2;:16;;;;35616:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35694:39;35715:4;35721:2;35725:7;35694:20;:39::i;:::-;35798:29;35815:1;35819:7;35798:8;:29::i;:::-;35859:1;35840:9;:15;35850:4;35840:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35888:1;35871:9;:13;35881:2;35871:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35919:2;35900:7;:16;35908:7;35900:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35958:7;35954:2;35939:27;;35948:4;35939:27;;;;;;;;;;;;35396:578;;;:::o;6838:191::-;6912:16;6931:6;;;;;;;;;;;6912:25;;6957:8;6948:6;;:17;;;;;;;;;;;;;;;;;;7012:8;6981:40;;7002:8;6981:40;;;;;;;;;;;;6901:128;6838:191;:::o;878:114::-;943:7;970;:14;;;963:21;;878:114;;;:::o;47642:408::-;47713:23;47739:25;:15;:23;:25::i;:::-;47713:51;;47816:9;;47805:6;47784:18;:27;;;;:::i;:::-;47783:42;;47775:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;47871:6;47867:172;47886:6;47883:1;:9;47867:172;;;47913:20;;;;;:::i;:::-;;;;47948:37;47958:6;47966:18;47948:9;:37::i;:::-;48000:27;:15;:25;:27::i;:::-;47894:3;;;;;:::i;:::-;;;;47867:172;;;;47702:348;47642:408;;:::o;36408:315::-;36563:8;36554:17;;:5;:17;;;;36546:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36650:8;36612:18;:25;36631:5;36612:25;;;;;;;;;;;;;;;:35;36638:8;36612:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36696:8;36674:41;;36689:5;36674:41;;;36706:8;36674:41;;;;;;:::i;:::-;;;;;;;;36408:315;;;:::o;31482:::-;31639:28;31649:4;31655:2;31659:7;31639:9;:28::i;:::-;31686:48;31709:4;31715:2;31719:7;31728:5;31686:22;:48::i;:::-;31678:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31482:315;;;;:::o;46640:221::-;46692:13;46772:77;;;;;;;;;;;;;;;;;;;46640:221;:::o;1842:723::-;1898:13;2128:1;2119:5;:10;2115:53;;;2146:10;;;;;;;;;;;;;;;;;;;;;2115:53;2178:12;2193:5;2178:20;;2209:14;2234:78;2249:1;2241:4;:9;2234:78;;2267:8;;;;;:::i;:::-;;;;2298:2;2290:10;;;;;:::i;:::-;;;2234:78;;;2322:19;2354:6;2344:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2322:39;;2372:154;2388:1;2379:5;:10;2372:154;;2416:1;2406:11;;;;;:::i;:::-;;;2483:2;2475:5;:10;;;;:::i;:::-;2462:2;:24;;;;:::i;:::-;2449:39;;2432:6;2439;2432:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2512:2;2503:11;;;;;:::i;:::-;;;2372:154;;;2550:6;2536:21;;;;;1842:723;;;;:::o;26352:305::-;26454:4;26506:25;26491:40;;;:11;:40;;;;:105;;;;26563:33;26548:48;;;:11;:48;;;;26491:105;:158;;;;26613:36;26637:11;26613:23;:36::i;:::-;26491:158;26471:178;;26352:305;;;:::o;48774:224::-;48941:45;48968:4;48974:2;48978:7;48941:26;:45::i;:::-;48774:224;;;:::o;33094:110::-;33170:26;33180:2;33184:7;33170:26;;;;;;;;;;;;:9;:26::i;:::-;33094:110;;:::o;1000:127::-;1107:1;1089:7;:14;;;:19;;;;;;;;;;;1000:127;:::o;37288:799::-;37443:4;37464:15;:2;:13;;;:15::i;:::-;37460:620;;;37516:2;37500:36;;;37537:12;:10;:12::i;:::-;37551:4;37557:7;37566:5;37500:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37496:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37759:1;37742:6;:13;:18;37738:272;;;37785:60;;;;;;;;;;:::i;:::-;;;;;;;;37738:272;37960:6;37954:13;37945:6;37941:2;37937:15;37930:38;37496:529;37633:41;;;37623:51;;;:6;:51;;;;37616:58;;;;;37460:620;38064:4;38057:11;;37288:799;;;;;;;:::o;18024:157::-;18109:4;18148:25;18133:40;;;:11;:40;;;;18126:47;;18024:157;;;:::o;41485:589::-;41629:45;41656:4;41662:2;41666:7;41629:26;:45::i;:::-;41707:1;41691:18;;:4;:18;;;41687:187;;;41726:40;41758:7;41726:31;:40::i;:::-;41687:187;;;41796:2;41788:10;;:4;:10;;;41784:90;;41815:47;41848:4;41854:7;41815:32;:47::i;:::-;41784:90;41687:187;41902:1;41888:16;;:2;:16;;;41884:183;;;41921:45;41958:7;41921:36;:45::i;:::-;41884:183;;;41994:4;41988:10;;:2;:10;;;41984:83;;42015:40;42043:2;42047:7;42015:27;:40::i;:::-;41984:83;41884:183;41485:589;;;:::o;33431:321::-;33561:18;33567:2;33571:7;33561:5;:18::i;:::-;33612:54;33643:1;33647:2;33651:7;33660:5;33612:22;:54::i;:::-;33590:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33431:321;;;:::o;7862:387::-;7922:4;8130:12;8197:7;8185:20;8177:28;;8240:1;8233:4;:8;8226:15;;;7862:387;;;:::o;38659:126::-;;;;:::o;42797:164::-;42901:10;:17;;;;42874:15;:24;42890:7;42874:24;;;;;;;;;;;:44;;;;42929:10;42945:7;42929:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42797:164;:::o;43588:988::-;43854:22;43904:1;43879:22;43896:4;43879:16;:22::i;:::-;:26;;;;:::i;:::-;43854:51;;43916:18;43937:17;:26;43955:7;43937:26;;;;;;;;;;;;43916:47;;44084:14;44070:10;:28;44066:328;;44115:19;44137:12;:18;44150:4;44137:18;;;;;;;;;;;;;;;:34;44156:14;44137:34;;;;;;;;;;;;44115:56;;44221:11;44188:12;:18;44201:4;44188:18;;;;;;;;;;;;;;;:30;44207:10;44188:30;;;;;;;;;;;:44;;;;44338:10;44305:17;:30;44323:11;44305:30;;;;;;;;;;;:43;;;;44100:294;44066:328;44490:17;:26;44508:7;44490:26;;;;;;;;;;;44483:33;;;44534:12;:18;44547:4;44534:18;;;;;;;;;;;;;;;:34;44553:14;44534:34;;;;;;;;;;;44527:41;;;43669:907;;43588:988;;:::o;44871:1079::-;45124:22;45169:1;45149:10;:17;;;;:21;;;;:::i;:::-;45124:46;;45181:18;45202:15;:24;45218:7;45202:24;;;;;;;;;;;;45181:45;;45553:19;45575:10;45586:14;45575:26;;;;;;;;:::i;:::-;;;;;;;;;;45553:48;;45639:11;45614:10;45625;45614:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45750:10;45719:15;:28;45735:11;45719:28;;;;;;;;;;;:41;;;;45891:15;:24;45907:7;45891:24;;;;;;;;;;;45884:31;;;45926:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44942:1008;;;44871:1079;:::o;42375:221::-;42460:14;42477:20;42494:2;42477:16;:20::i;:::-;42460:37;;42535:7;42508:12;:16;42521:2;42508:16;;;;;;;;;;;;;;;:24;42525:6;42508:24;;;;;;;;;;;:34;;;;42582:6;42553:17;:26;42571:7;42553:26;;;;;;;;;;;:35;;;;42449:147;42375:221;;:::o;34088:382::-;34182:1;34168:16;;:2;:16;;;;34160:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34241:16;34249:7;34241;:16::i;:::-;34240:17;34232:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34303:45;34332:1;34336:2;34340:7;34303:20;:45::i;:::-;34378:1;34361:9;:13;34371:2;34361:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34409:2;34390:7;:16;34398:7;34390:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34454:7;34450:2;34429:33;;34446:1;34429:33;;;;;;;;;;;;34088:382;;:::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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:137::-;1399:5;1437:6;1424:20;1415:29;;1453:32;1479:5;1453:32;:::i;:::-;1354:137;;;;:::o;1497:139::-;1543:5;1581:6;1568:20;1559:29;;1597:33;1624:5;1597:33;:::i;:::-;1497:139;;;;:::o;1642:329::-;1701:6;1750:2;1738:9;1729:7;1725:23;1721:32;1718:119;;;1756:79;;:::i;:::-;1718:119;1876:1;1901:53;1946:7;1937:6;1926:9;1922:22;1901:53;:::i;:::-;1891:63;;1847:117;1642:329;;;;:::o;1977:474::-;2045:6;2053;2102:2;2090:9;2081:7;2077:23;2073:32;2070:119;;;2108:79;;:::i;:::-;2070:119;2228:1;2253:53;2298:7;2289:6;2278:9;2274:22;2253:53;:::i;:::-;2243:63;;2199:117;2355:2;2381:53;2426:7;2417:6;2406:9;2402:22;2381:53;:::i;:::-;2371:63;;2326:118;1977:474;;;;;:::o;2457:619::-;2534:6;2542;2550;2599:2;2587:9;2578:7;2574:23;2570:32;2567:119;;;2605:79;;:::i;:::-;2567:119;2725:1;2750:53;2795:7;2786:6;2775:9;2771:22;2750:53;:::i;:::-;2740:63;;2696:117;2852:2;2878:53;2923:7;2914:6;2903:9;2899:22;2878:53;:::i;:::-;2868:63;;2823:118;2980:2;3006:53;3051:7;3042:6;3031:9;3027:22;3006:53;:::i;:::-;2996:63;;2951:118;2457:619;;;;;:::o;3082:943::-;3177:6;3185;3193;3201;3250:3;3238:9;3229:7;3225:23;3221:33;3218:120;;;3257:79;;:::i;:::-;3218:120;3377:1;3402:53;3447:7;3438:6;3427:9;3423:22;3402:53;:::i;:::-;3392:63;;3348:117;3504:2;3530:53;3575:7;3566:6;3555:9;3551:22;3530:53;:::i;:::-;3520:63;;3475:118;3632:2;3658:53;3703:7;3694:6;3683:9;3679:22;3658:53;:::i;:::-;3648:63;;3603:118;3788:2;3777:9;3773:18;3760:32;3819:18;3811:6;3808:30;3805:117;;;3841:79;;:::i;:::-;3805:117;3946:62;4000:7;3991:6;3980:9;3976:22;3946:62;:::i;:::-;3936:72;;3731:287;3082:943;;;;;;;:::o;4031:468::-;4096:6;4104;4153:2;4141:9;4132:7;4128:23;4124:32;4121:119;;;4159:79;;:::i;:::-;4121:119;4279:1;4304:53;4349:7;4340:6;4329:9;4325:22;4304:53;:::i;:::-;4294:63;;4250:117;4406:2;4432:50;4474:7;4465:6;4454:9;4450:22;4432:50;:::i;:::-;4422:60;;4377:115;4031:468;;;;;:::o;4505:474::-;4573:6;4581;4630:2;4618:9;4609:7;4605:23;4601:32;4598:119;;;4636:79;;:::i;:::-;4598:119;4756:1;4781:53;4826:7;4817:6;4806:9;4802:22;4781:53;:::i;:::-;4771:63;;4727:117;4883:2;4909:53;4954:7;4945:6;4934:9;4930:22;4909:53;:::i;:::-;4899:63;;4854:118;4505:474;;;;;:::o;4985:327::-;5043:6;5092:2;5080:9;5071:7;5067:23;5063:32;5060:119;;;5098:79;;:::i;:::-;5060:119;5218:1;5243:52;5287:7;5278:6;5267:9;5263:22;5243:52;:::i;:::-;5233:62;;5189:116;4985:327;;;;:::o;5318:349::-;5387:6;5436:2;5424:9;5415:7;5411:23;5407:32;5404:119;;;5442:79;;:::i;:::-;5404:119;5562:1;5587:63;5642:7;5633:6;5622:9;5618:22;5587:63;:::i;:::-;5577:73;;5533:127;5318:349;;;;:::o;5673:327::-;5731:6;5780:2;5768:9;5759:7;5755:23;5751:32;5748:119;;;5786:79;;:::i;:::-;5748:119;5906:1;5931:52;5975:7;5966:6;5955:9;5951:22;5931:52;:::i;:::-;5921:62;;5877:116;5673:327;;;;:::o;6006:329::-;6065:6;6114:2;6102:9;6093:7;6089:23;6085:32;6082:119;;;6120:79;;:::i;:::-;6082:119;6240:1;6265:53;6310:7;6301:6;6290:9;6286:22;6265:53;:::i;:::-;6255:63;;6211:117;6006:329;;;;:::o;6341:118::-;6428:24;6446:5;6428:24;:::i;:::-;6423:3;6416:37;6341:118;;:::o;6465:109::-;6546:21;6561:5;6546:21;:::i;:::-;6541:3;6534:34;6465:109;;:::o;6580:360::-;6666:3;6694:38;6726:5;6694:38;:::i;:::-;6748:70;6811:6;6806:3;6748:70;:::i;:::-;6741:77;;6827:52;6872:6;6867:3;6860:4;6853:5;6849:16;6827:52;:::i;:::-;6904:29;6926:6;6904:29;:::i;:::-;6899:3;6895:39;6888:46;;6670:270;6580:360;;;;:::o;6946:364::-;7034:3;7062:39;7095:5;7062:39;:::i;:::-;7117:71;7181:6;7176:3;7117:71;:::i;:::-;7110:78;;7197:52;7242:6;7237:3;7230:4;7223:5;7219:16;7197:52;:::i;:::-;7274:29;7296:6;7274:29;:::i;:::-;7269:3;7265:39;7258:46;;7038:272;6946:364;;;;:::o;7316:377::-;7422:3;7450:39;7483:5;7450:39;:::i;:::-;7505:89;7587:6;7582:3;7505:89;:::i;:::-;7498:96;;7603:52;7648:6;7643:3;7636:4;7629:5;7625:16;7603:52;:::i;:::-;7680:6;7675:3;7671:16;7664:23;;7426:267;7316:377;;;;:::o;7699:366::-;7841:3;7862:67;7926:2;7921:3;7862:67;:::i;:::-;7855:74;;7938:93;8027:3;7938:93;:::i;:::-;8056:2;8051:3;8047:12;8040:19;;7699:366;;;:::o;8071:::-;8213:3;8234:67;8298:2;8293:3;8234:67;:::i;:::-;8227:74;;8310:93;8399:3;8310:93;:::i;:::-;8428:2;8423:3;8419:12;8412:19;;8071:366;;;:::o;8443:::-;8585:3;8606:67;8670:2;8665:3;8606:67;:::i;:::-;8599:74;;8682:93;8771:3;8682:93;:::i;:::-;8800:2;8795:3;8791:12;8784:19;;8443:366;;;:::o;8815:::-;8957:3;8978:67;9042:2;9037:3;8978:67;:::i;:::-;8971:74;;9054:93;9143:3;9054:93;:::i;:::-;9172:2;9167:3;9163:12;9156:19;;8815:366;;;:::o;9187:::-;9329:3;9350:67;9414:2;9409:3;9350:67;:::i;:::-;9343:74;;9426:93;9515:3;9426:93;:::i;:::-;9544:2;9539:3;9535:12;9528:19;;9187:366;;;:::o;9559:::-;9701:3;9722:67;9786:2;9781:3;9722:67;:::i;:::-;9715:74;;9798:93;9887:3;9798:93;:::i;:::-;9916:2;9911:3;9907:12;9900:19;;9559:366;;;:::o;9931:::-;10073:3;10094:67;10158:2;10153:3;10094:67;:::i;:::-;10087:74;;10170:93;10259:3;10170:93;:::i;:::-;10288:2;10283:3;10279:12;10272:19;;9931:366;;;:::o;10303:::-;10445:3;10466:67;10530:2;10525:3;10466:67;:::i;:::-;10459:74;;10542:93;10631:3;10542:93;:::i;:::-;10660:2;10655:3;10651:12;10644:19;;10303:366;;;:::o;10675:::-;10817:3;10838:67;10902:2;10897:3;10838:67;:::i;:::-;10831:74;;10914:93;11003:3;10914:93;:::i;:::-;11032:2;11027:3;11023:12;11016:19;;10675:366;;;:::o;11047:::-;11189:3;11210:67;11274:2;11269:3;11210:67;:::i;:::-;11203:74;;11286:93;11375:3;11286:93;:::i;:::-;11404:2;11399:3;11395:12;11388:19;;11047:366;;;:::o;11419:::-;11561:3;11582:67;11646:2;11641:3;11582:67;:::i;:::-;11575:74;;11658:93;11747:3;11658:93;:::i;:::-;11776:2;11771:3;11767:12;11760:19;;11419:366;;;:::o;11791:::-;11933:3;11954:67;12018:2;12013:3;11954:67;:::i;:::-;11947:74;;12030:93;12119:3;12030:93;:::i;:::-;12148:2;12143:3;12139:12;12132:19;;11791:366;;;:::o;12163:::-;12305:3;12326:67;12390:2;12385:3;12326:67;:::i;:::-;12319:74;;12402:93;12491:3;12402:93;:::i;:::-;12520:2;12515:3;12511:12;12504:19;;12163:366;;;:::o;12535:::-;12677:3;12698:67;12762:2;12757:3;12698:67;:::i;:::-;12691:74;;12774:93;12863:3;12774:93;:::i;:::-;12892:2;12887:3;12883:12;12876:19;;12535:366;;;:::o;12907:::-;13049:3;13070:67;13134:2;13129:3;13070:67;:::i;:::-;13063:74;;13146:93;13235:3;13146:93;:::i;:::-;13264:2;13259:3;13255:12;13248:19;;12907:366;;;:::o;13279:::-;13421:3;13442:67;13506:2;13501:3;13442:67;:::i;:::-;13435:74;;13518:93;13607:3;13518:93;:::i;:::-;13636:2;13631:3;13627:12;13620:19;;13279:366;;;:::o;13651:::-;13793:3;13814:67;13878:2;13873:3;13814:67;:::i;:::-;13807:74;;13890:93;13979:3;13890:93;:::i;:::-;14008:2;14003:3;13999:12;13992:19;;13651:366;;;:::o;14023:400::-;14183:3;14204:84;14286:1;14281:3;14204:84;:::i;:::-;14197:91;;14297:93;14386:3;14297:93;:::i;:::-;14415:1;14410:3;14406:11;14399:18;;14023:400;;;:::o;14429:366::-;14571:3;14592:67;14656:2;14651:3;14592:67;:::i;:::-;14585:74;;14668:93;14757:3;14668:93;:::i;:::-;14786:2;14781:3;14777:12;14770:19;;14429:366;;;:::o;14801:::-;14943:3;14964:67;15028:2;15023:3;14964:67;:::i;:::-;14957:74;;15040:93;15129:3;15040:93;:::i;:::-;15158:2;15153:3;15149:12;15142:19;;14801:366;;;:::o;15173:::-;15315:3;15336:67;15400:2;15395:3;15336:67;:::i;:::-;15329:74;;15412:93;15501:3;15412:93;:::i;:::-;15530:2;15525:3;15521:12;15514:19;;15173:366;;;:::o;15545:::-;15687:3;15708:67;15772:2;15767:3;15708:67;:::i;:::-;15701:74;;15784:93;15873:3;15784:93;:::i;:::-;15902:2;15897:3;15893:12;15886:19;;15545:366;;;:::o;15917:::-;16059:3;16080:67;16144:2;16139:3;16080:67;:::i;:::-;16073:74;;16156:93;16245:3;16156:93;:::i;:::-;16274:2;16269:3;16265:12;16258:19;;15917:366;;;:::o;16289:::-;16431:3;16452:67;16516:2;16511:3;16452:67;:::i;:::-;16445:74;;16528:93;16617:3;16528:93;:::i;:::-;16646:2;16641:3;16637:12;16630:19;;16289:366;;;:::o;16661:118::-;16748:24;16766:5;16748:24;:::i;:::-;16743:3;16736:37;16661:118;;:::o;16785:701::-;17066:3;17088:95;17179:3;17170:6;17088:95;:::i;:::-;17081:102;;17200:95;17291:3;17282:6;17200:95;:::i;:::-;17193:102;;17312:148;17456:3;17312:148;:::i;:::-;17305:155;;17477:3;17470:10;;16785:701;;;;;:::o;17492:222::-;17585:4;17623:2;17612:9;17608:18;17600:26;;17636:71;17704:1;17693:9;17689:17;17680:6;17636:71;:::i;:::-;17492:222;;;;:::o;17720:640::-;17915:4;17953:3;17942:9;17938:19;17930:27;;17967:71;18035:1;18024:9;18020:17;18011:6;17967:71;:::i;:::-;18048:72;18116:2;18105:9;18101:18;18092:6;18048:72;:::i;:::-;18130;18198:2;18187:9;18183:18;18174:6;18130:72;:::i;:::-;18249:9;18243:4;18239:20;18234:2;18223:9;18219:18;18212:48;18277:76;18348:4;18339:6;18277:76;:::i;:::-;18269:84;;17720:640;;;;;;;:::o;18366:210::-;18453:4;18491:2;18480:9;18476:18;18468:26;;18504:65;18566:1;18555:9;18551:17;18542:6;18504:65;:::i;:::-;18366:210;;;;:::o;18582:313::-;18695:4;18733:2;18722:9;18718:18;18710:26;;18782:9;18776:4;18772:20;18768:1;18757:9;18753:17;18746:47;18810:78;18883:4;18874:6;18810:78;:::i;:::-;18802:86;;18582:313;;;;:::o;18901:419::-;19067:4;19105:2;19094:9;19090:18;19082:26;;19154:9;19148:4;19144:20;19140:1;19129:9;19125:17;19118:47;19182:131;19308:4;19182:131;:::i;:::-;19174:139;;18901:419;;;:::o;19326:::-;19492:4;19530:2;19519:9;19515:18;19507:26;;19579:9;19573:4;19569:20;19565:1;19554:9;19550:17;19543:47;19607:131;19733:4;19607:131;:::i;:::-;19599:139;;19326:419;;;:::o;19751:::-;19917:4;19955:2;19944:9;19940:18;19932:26;;20004:9;19998:4;19994:20;19990:1;19979:9;19975:17;19968:47;20032:131;20158:4;20032:131;:::i;:::-;20024:139;;19751:419;;;:::o;20176:::-;20342:4;20380:2;20369:9;20365:18;20357:26;;20429:9;20423:4;20419:20;20415:1;20404:9;20400:17;20393:47;20457:131;20583:4;20457:131;:::i;:::-;20449:139;;20176:419;;;:::o;20601:::-;20767:4;20805:2;20794:9;20790:18;20782:26;;20854:9;20848:4;20844:20;20840:1;20829:9;20825:17;20818:47;20882:131;21008:4;20882:131;:::i;:::-;20874:139;;20601:419;;;:::o;21026:::-;21192:4;21230:2;21219:9;21215:18;21207:26;;21279:9;21273:4;21269:20;21265:1;21254:9;21250:17;21243:47;21307:131;21433:4;21307:131;:::i;:::-;21299:139;;21026:419;;;:::o;21451:::-;21617:4;21655:2;21644:9;21640:18;21632:26;;21704:9;21698:4;21694:20;21690:1;21679:9;21675:17;21668:47;21732:131;21858:4;21732:131;:::i;:::-;21724:139;;21451:419;;;:::o;21876:::-;22042:4;22080:2;22069:9;22065:18;22057:26;;22129:9;22123:4;22119:20;22115:1;22104:9;22100:17;22093:47;22157:131;22283:4;22157:131;:::i;:::-;22149:139;;21876:419;;;:::o;22301:::-;22467:4;22505:2;22494:9;22490:18;22482:26;;22554:9;22548:4;22544:20;22540:1;22529:9;22525:17;22518:47;22582:131;22708:4;22582:131;:::i;:::-;22574:139;;22301:419;;;:::o;22726:::-;22892:4;22930:2;22919:9;22915:18;22907:26;;22979:9;22973:4;22969:20;22965:1;22954:9;22950:17;22943:47;23007:131;23133:4;23007:131;:::i;:::-;22999:139;;22726:419;;;:::o;23151:::-;23317:4;23355:2;23344:9;23340:18;23332:26;;23404:9;23398:4;23394:20;23390:1;23379:9;23375:17;23368:47;23432:131;23558:4;23432:131;:::i;:::-;23424:139;;23151:419;;;:::o;23576:::-;23742:4;23780:2;23769:9;23765:18;23757:26;;23829:9;23823:4;23819:20;23815:1;23804:9;23800:17;23793:47;23857:131;23983:4;23857:131;:::i;:::-;23849:139;;23576:419;;;:::o;24001:::-;24167:4;24205:2;24194:9;24190:18;24182:26;;24254:9;24248:4;24244:20;24240:1;24229:9;24225:17;24218:47;24282:131;24408:4;24282:131;:::i;:::-;24274:139;;24001:419;;;:::o;24426:::-;24592:4;24630:2;24619:9;24615:18;24607:26;;24679:9;24673:4;24669:20;24665:1;24654:9;24650:17;24643:47;24707:131;24833:4;24707:131;:::i;:::-;24699:139;;24426:419;;;:::o;24851:::-;25017:4;25055:2;25044:9;25040:18;25032:26;;25104:9;25098:4;25094:20;25090:1;25079:9;25075:17;25068:47;25132:131;25258:4;25132:131;:::i;:::-;25124:139;;24851:419;;;:::o;25276:::-;25442:4;25480:2;25469:9;25465:18;25457:26;;25529:9;25523:4;25519:20;25515:1;25504:9;25500:17;25493:47;25557:131;25683:4;25557:131;:::i;:::-;25549:139;;25276:419;;;:::o;25701:::-;25867:4;25905:2;25894:9;25890:18;25882:26;;25954:9;25948:4;25944:20;25940:1;25929:9;25925:17;25918:47;25982:131;26108:4;25982:131;:::i;:::-;25974:139;;25701:419;;;:::o;26126:::-;26292:4;26330:2;26319:9;26315:18;26307:26;;26379:9;26373:4;26369:20;26365:1;26354:9;26350:17;26343:47;26407:131;26533:4;26407:131;:::i;:::-;26399:139;;26126:419;;;:::o;26551:::-;26717:4;26755:2;26744:9;26740:18;26732:26;;26804:9;26798:4;26794:20;26790:1;26779:9;26775:17;26768:47;26832:131;26958:4;26832:131;:::i;:::-;26824:139;;26551:419;;;:::o;26976:::-;27142:4;27180:2;27169:9;27165:18;27157:26;;27229:9;27223:4;27219:20;27215:1;27204:9;27200:17;27193:47;27257:131;27383:4;27257:131;:::i;:::-;27249:139;;26976:419;;;:::o;27401:::-;27567:4;27605:2;27594:9;27590:18;27582:26;;27654:9;27648:4;27644:20;27640:1;27629:9;27625:17;27618:47;27682:131;27808:4;27682:131;:::i;:::-;27674:139;;27401:419;;;:::o;27826:::-;27992:4;28030:2;28019:9;28015:18;28007:26;;28079:9;28073:4;28069:20;28065:1;28054:9;28050:17;28043:47;28107:131;28233:4;28107:131;:::i;:::-;28099:139;;27826:419;;;:::o;28251:::-;28417:4;28455:2;28444:9;28440:18;28432:26;;28504:9;28498:4;28494:20;28490:1;28479:9;28475:17;28468:47;28532:131;28658:4;28532:131;:::i;:::-;28524:139;;28251:419;;;:::o;28676:222::-;28769:4;28807:2;28796:9;28792:18;28784:26;;28820:71;28888:1;28877:9;28873:17;28864:6;28820:71;:::i;:::-;28676:222;;;;:::o;28904:129::-;28938:6;28965:20;;:::i;:::-;28955:30;;28994:33;29022:4;29014:6;28994:33;:::i;:::-;28904:129;;;:::o;29039:75::-;29072:6;29105:2;29099:9;29089:19;;29039:75;:::o;29120:307::-;29181:4;29271:18;29263:6;29260:30;29257:56;;;29293:18;;:::i;:::-;29257:56;29331:29;29353:6;29331:29;:::i;:::-;29323:37;;29415:4;29409;29405:15;29397:23;;29120:307;;;:::o;29433:98::-;29484:6;29518:5;29512:12;29502:22;;29433:98;;;:::o;29537:99::-;29589:6;29623:5;29617:12;29607:22;;29537:99;;;:::o;29642:168::-;29725:11;29759:6;29754:3;29747:19;29799:4;29794:3;29790:14;29775:29;;29642:168;;;;:::o;29816:169::-;29900:11;29934:6;29929:3;29922:19;29974:4;29969:3;29965:14;29950:29;;29816:169;;;;:::o;29991:148::-;30093:11;30130:3;30115:18;;29991:148;;;;:::o;30145:305::-;30185:3;30204:20;30222:1;30204:20;:::i;:::-;30199:25;;30238:20;30256:1;30238:20;:::i;:::-;30233:25;;30392:1;30324:66;30320:74;30317:1;30314:81;30311:107;;;30398:18;;:::i;:::-;30311:107;30442:1;30439;30435:9;30428:16;;30145:305;;;;:::o;30456:185::-;30496:1;30513:20;30531:1;30513:20;:::i;:::-;30508:25;;30547:20;30565:1;30547:20;:::i;:::-;30542:25;;30586:1;30576:35;;30591:18;;:::i;:::-;30576:35;30633:1;30630;30626:9;30621:14;;30456:185;;;;:::o;30647:348::-;30687:7;30710:20;30728:1;30710:20;:::i;:::-;30705:25;;30744:20;30762:1;30744:20;:::i;:::-;30739:25;;30932:1;30864:66;30860:74;30857:1;30854:81;30849:1;30842:9;30835:17;30831:105;30828:131;;;30939:18;;:::i;:::-;30828:131;30987:1;30984;30980:9;30969:20;;30647:348;;;;:::o;31001:191::-;31041:4;31061:20;31079:1;31061:20;:::i;:::-;31056:25;;31095:20;31113:1;31095:20;:::i;:::-;31090:25;;31134:1;31131;31128:8;31125:34;;;31139:18;;:::i;:::-;31125:34;31184:1;31181;31177:9;31169:17;;31001:191;;;;:::o;31198:96::-;31235:7;31264:24;31282:5;31264:24;:::i;:::-;31253:35;;31198:96;;;:::o;31300:90::-;31334:7;31377:5;31370:13;31363:21;31352:32;;31300:90;;;:::o;31396:149::-;31432:7;31472:66;31465:5;31461:78;31450:89;;31396:149;;;:::o;31551:89::-;31587:7;31627:6;31620:5;31616:18;31605:29;;31551:89;;;:::o;31646:126::-;31683:7;31723:42;31716:5;31712:54;31701:65;;31646:126;;;:::o;31778:77::-;31815:7;31844:5;31833:16;;31778:77;;;:::o;31861:154::-;31945:6;31940:3;31935;31922:30;32007:1;31998:6;31993:3;31989:16;31982:27;31861:154;;;:::o;32021:307::-;32089:1;32099:113;32113:6;32110:1;32107:13;32099:113;;;32198:1;32193:3;32189:11;32183:18;32179:1;32174:3;32170:11;32163:39;32135:2;32132:1;32128:10;32123:15;;32099:113;;;32230:6;32227:1;32224:13;32221:101;;;32310:1;32301:6;32296:3;32292:16;32285:27;32221:101;32070:258;32021:307;;;:::o;32334:320::-;32378:6;32415:1;32409:4;32405:12;32395:22;;32462:1;32456:4;32452:12;32483:18;32473:81;;32539:4;32531:6;32527:17;32517:27;;32473:81;32601:2;32593:6;32590:14;32570:18;32567:38;32564:84;;;32620:18;;:::i;:::-;32564:84;32385:269;32334:320;;;:::o;32660:281::-;32743:27;32765:4;32743:27;:::i;:::-;32735:6;32731:40;32873:6;32861:10;32858:22;32837:18;32825:10;32822:34;32819:62;32816:88;;;32884:18;;:::i;:::-;32816:88;32924:10;32920:2;32913:22;32703:238;32660:281;;:::o;32947:233::-;32986:3;33009:24;33027:5;33009:24;:::i;:::-;33000:33;;33055:66;33048:5;33045:77;33042:103;;;33125:18;;:::i;:::-;33042:103;33172:1;33165:5;33161:13;33154:20;;32947:233;;;:::o;33186:176::-;33218:1;33235:20;33253:1;33235:20;:::i;:::-;33230:25;;33269:20;33287:1;33269:20;:::i;:::-;33264:25;;33308:1;33298:35;;33313:18;;:::i;:::-;33298:35;33354:1;33351;33347:9;33342:14;;33186:176;;;;:::o;33368:180::-;33416:77;33413:1;33406:88;33513:4;33510:1;33503:15;33537:4;33534:1;33527:15;33554:180;33602:77;33599:1;33592:88;33699:4;33696:1;33689:15;33723:4;33720:1;33713:15;33740:180;33788:77;33785:1;33778:88;33885:4;33882:1;33875:15;33909:4;33906:1;33899:15;33926:180;33974:77;33971:1;33964:88;34071:4;34068:1;34061:15;34095:4;34092:1;34085:15;34112:180;34160:77;34157:1;34150:88;34257:4;34254:1;34247:15;34281:4;34278:1;34271:15;34298:180;34346:77;34343:1;34336:88;34443:4;34440:1;34433:15;34467:4;34464:1;34457:15;34484:117;34593:1;34590;34583:12;34607:117;34716:1;34713;34706:12;34730:117;34839:1;34836;34829:12;34853:117;34962:1;34959;34952:12;34976:102;35017:6;35068:2;35064:7;35059:2;35052:5;35048:14;35044:28;35034:38;;34976:102;;;:::o;35084:222::-;35224:34;35220:1;35212:6;35208:14;35201:58;35293:5;35288:2;35280:6;35276:15;35269:30;35084:222;:::o;35312:230::-;35452:34;35448:1;35440:6;35436:14;35429:58;35521:13;35516:2;35508:6;35504:15;35497:38;35312:230;:::o;35548:237::-;35688:34;35684:1;35676:6;35672:14;35665:58;35757:20;35752:2;35744:6;35740:15;35733:45;35548:237;:::o;35791:225::-;35931:34;35927:1;35919:6;35915:14;35908:58;36000:8;35995:2;35987:6;35983:15;35976:33;35791:225;:::o;36022:178::-;36162:30;36158:1;36150:6;36146:14;36139:54;36022:178;:::o;36206:223::-;36346:34;36342:1;36334:6;36330:14;36323:58;36415:6;36410:2;36402:6;36398:15;36391:31;36206:223;:::o;36435:175::-;36575:27;36571:1;36563:6;36559:14;36552:51;36435:175;:::o;36616:168::-;36756:20;36752:1;36744:6;36740:14;36733:44;36616:168;:::o;36790:231::-;36930:34;36926:1;36918:6;36914:14;36907:58;36999:14;36994:2;36986:6;36982:15;36975:39;36790:231;:::o;37027:243::-;37167:34;37163:1;37155:6;37151:14;37144:58;37236:26;37231:2;37223:6;37219:15;37212:51;37027:243;:::o;37276:229::-;37416:34;37412:1;37404:6;37400:14;37393:58;37485:12;37480:2;37472:6;37468:15;37461:37;37276:229;:::o;37511:228::-;37651:34;37647:1;37639:6;37635:14;37628:58;37720:11;37715:2;37707:6;37703:15;37696:36;37511:228;:::o;37745:172::-;37885:24;37881:1;37873:6;37869:14;37862:48;37745:172;:::o;37923:182::-;38063:34;38059:1;38051:6;38047:14;38040:58;37923:182;:::o;38111:162::-;38251:14;38247:1;38239:6;38235:14;38228:38;38111:162;:::o;38279:170::-;38419:22;38415:1;38407:6;38403:14;38396:46;38279:170;:::o;38455:231::-;38595:34;38591:1;38583:6;38579:14;38572:58;38664:14;38659:2;38651:6;38647:15;38640:39;38455:231;:::o;38692:155::-;38832:7;38828:1;38820:6;38816:14;38809:31;38692:155;:::o;38853:182::-;38993:34;38989:1;38981:6;38977:14;38970:58;38853:182;:::o;39041:228::-;39181:34;39177:1;39169:6;39165:14;39158:58;39250:11;39245:2;39237:6;39233:15;39226:36;39041:228;:::o;39275:234::-;39415:34;39411:1;39403:6;39399:14;39392:58;39484:17;39479:2;39471:6;39467:15;39460:42;39275:234;:::o;39515:220::-;39655:34;39651:1;39643:6;39639:14;39632:58;39724:3;39719:2;39711:6;39707:15;39700:28;39515:220;:::o;39741:236::-;39881:34;39877:1;39869:6;39865:14;39858:58;39950:19;39945:2;39937:6;39933:15;39926:44;39741:236;:::o;39983:231::-;40123:34;40119:1;40111:6;40107:14;40100:58;40192:14;40187:2;40179:6;40175:15;40168:39;39983:231;:::o;40220:122::-;40293:24;40311:5;40293:24;:::i;:::-;40286:5;40283:35;40273:63;;40332:1;40329;40322:12;40273:63;40220:122;:::o;40348:116::-;40418:21;40433:5;40418:21;:::i;:::-;40411:5;40408:32;40398:60;;40454:1;40451;40444:12;40398:60;40348:116;:::o;40470:120::-;40542:23;40559:5;40542:23;:::i;:::-;40535:5;40532:34;40522:62;;40580:1;40577;40570:12;40522:62;40470:120;:::o;40596:::-;40668:23;40685:5;40668:23;:::i;:::-;40661:5;40658:34;40648:62;;40706:1;40703;40696:12;40648:62;40596:120;:::o;40722:122::-;40795:24;40813:5;40795:24;:::i;:::-;40788:5;40785:35;40775:63;;40834:1;40831;40824:12;40775:63;40722:122;:::o
Swarm Source
ipfs://0e5ac980888a4aed9bb7a9df91d5d199ea8fb57a3e12658319cea4da8a295e12
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.