Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 36 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 18903369 | 428 days ago | IN | 0 ETH | 0.00057248 | ||||
Set Approval For... | 14822276 | 1016 days ago | IN | 0 ETH | 0.00092169 | ||||
Safe Transfer Fr... | 14636742 | 1045 days ago | IN | 0 ETH | 0.0041822 | ||||
Safe Transfer Fr... | 14636741 | 1045 days ago | IN | 0 ETH | 0.00366897 | ||||
Safe Transfer Fr... | 14636735 | 1045 days ago | IN | 0 ETH | 0.00427781 | ||||
Safe Transfer Fr... | 14636732 | 1045 days ago | IN | 0 ETH | 0.00484285 | ||||
Safe Transfer Fr... | 14636728 | 1045 days ago | IN | 0 ETH | 0.00425983 | ||||
Safe Transfer Fr... | 14636725 | 1045 days ago | IN | 0 ETH | 0.00434729 | ||||
Withdraw | 14445091 | 1075 days ago | IN | 0 ETH | 0.00120917 | ||||
Transfer From | 14371984 | 1087 days ago | IN | 0 ETH | 0.00125638 | ||||
Transfer From | 14371984 | 1087 days ago | IN | 0 ETH | 0.00140604 | ||||
Transfer From | 14371984 | 1087 days ago | IN | 0 ETH | 0.00108031 | ||||
Transfer From | 14371984 | 1087 days ago | IN | 0 ETH | 0.00108031 | ||||
Transfer From | 14371984 | 1087 days ago | IN | 0 ETH | 0.00122997 | ||||
Transfer From | 14371984 | 1087 days ago | IN | 0 ETH | 0.00140604 | ||||
Mint | 14091756 | 1130 days ago | IN | 0.05 ETH | 0.019748 | ||||
Mint | 14078352 | 1132 days ago | IN | 0.05 ETH | 0.01576004 | ||||
Mint | 14056197 | 1136 days ago | IN | 0.05 ETH | 0.02291283 | ||||
Set Approval For... | 14052261 | 1136 days ago | IN | 0 ETH | 0.00880562 | ||||
Mint | 14039989 | 1138 days ago | IN | 0.05 ETH | 0.01969609 | ||||
Mint | 14031684 | 1139 days ago | IN | 0.05 ETH | 0.01623224 | ||||
Mint | 14030270 | 1140 days ago | IN | 0.05 ETH | 0.00985987 | ||||
Set Approval For... | 14018689 | 1141 days ago | IN | 0 ETH | 0.00812845 | ||||
Set Approval For... | 14014884 | 1142 days ago | IN | 0 ETH | 0.00595648 | ||||
Mint | 14012773 | 1142 days ago | IN | 0.05 ETH | 0.0160664 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
nft
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-30 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/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/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/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/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/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: Matt W - NFT.sol // André Luque pragma solidity >=0.8.2; // to enable certain compiler features //import '@openzeppelin/contracts/token/ERC721/ERC721.sol'; 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(), '.json')) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } 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); } 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(); } } contract nft is ERC721Enumerable, Ownable { //baseURI that is established string private _currentBaseURI; //limit the tokens that can be minted uint256 public maxTokens; //stores the amount of mints each address has had mapping(address => uint) private mintsPerAddress; //price to pay for each nft uint256 private mintCost_; //maximum mints per address uint private maxMint = 5; //current state os sale enum State {NoSale, OpenSale} //variable that defines the current state of sale State private saleState_; address payable private dev = payable(0x318cBF186eB13C74533943b054959867eE44eFFE); //marks the time that the sale has started uint256 public saleLaunchTime; constructor() ERC721('Villainous', 'VIL') { //this uri will only be used once revealed is on _currentBaseURI = 'ipfs://QmPrifdDJ2mMF7LtnWZ6UXtHUPMFJ7ePiLnLGQXL6fyWx7/'; //start off with zero tokens and max in total collection will be 10k maxTokens = 500; //setting the initial cost to mint mintCost_ = 0.05 ether; //setting the initial state of sale to closed saleState_ = State.NoSale; //mint 1 inital NFT _safeMint(msg.sender, 1); mintsPerAddress[msg.sender] += 1; } //this uri will only be used once revealed is on function setBaseURI(string memory baseURI) public onlyOwner { _currentBaseURI = baseURI; } //function to see the current baseURI function _baseURI() internal view override returns (string memory) { return _currentBaseURI; } //tokens are numbered from 1 to 777 function tokenId() internal view returns(uint256) { uint currentId = totalSupply(); bool exists = true; while (exists) { currentId += 1; exists = _exists(currentId); } return currentId; } //minting a new NFT function mint(uint number) payable public { require(saleState_ == State.OpenSale, 'Sale is not open yet!'); require(totalSupply() + number <= maxTokens, 'No more NFTs left to mint!'); require(msg.value >= mintCost() * number, 'Insufficient Funds, Check current price to Mint'); require(mintsPerAddress[msg.sender] + number <= maxMint, 'Maximum Mints per Address reached!'); for (uint i = 0; i < number; i++) { uint tid = tokenId(); _safeMint(msg.sender, tid); mintsPerAddress[msg.sender] += 1; } } //open the sale function openSale() public onlyOwner { saleState_ = State.OpenSale; saleLaunchTime = block.timestamp; } //shows the current state of sale function saleState() public view returns(State) { return saleState_; } //to see the price of minting function mintCost() public view returns(uint) { return mintCost_; } //see account balance function accountBalance() public view returns(uint256) { return address(this).balance; } //to withdraw funds function withdraw() public onlyOwner { uint256 balance_ = accountBalance(); require(balance_ > 0, 'No funds to withdraw'); withdraw_(payable(owner()), ((balance_ * 98) / 100)); withdraw_(dev, accountBalance()); //to avoid dust eth } function withdraw_(address payable _address, uint amount) internal { (bool sent, ) = _address.call{value: amount}(""); require(sent, "Failed to send Ether"); } //to see if a person has minted a NFT function isMinter() public view returns(bool) { if (mintsPerAddress[msg.sender] != 0) { return true; } else { return false; } } //mint the initial tokens that were minted already in the original collection //token 1 has already been minted and corresponds to the owner function initialMint(address[] memory listOfMinters) public onlyOwner { require(totalSupply() + listOfMinters.length <= 44, 'Initial Mint already Executed!'); //44 was the supply in the other collection for (uint i = 0; i < listOfMinters.length; i++) { uint tid = tokenId(); _safeMint(listOfMinters[i], tid); mintsPerAddress[listOfMinters[i]] += 1; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"accountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"listOfMinters","type":"address[]"}],"name":"initialMint","outputs":[],"stateMutability":"nonpayable","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":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCost","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":"openSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleLaunchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"enum nft.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","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
60806040526005600f5573318cbf186eb13c74533943b054959867ee44effe601060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006b57600080fd5b506040518060400160405280600a81526020017f56696c6c61696e6f7573000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f56494c00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f092919062000ccb565b5080600190805190602001906200010992919062000ccb565b5050506200012c620001206200021560201b60201c565b6200021d60201b60201c565b604051806060016040528060368152602001620058be60369139600b90805190602001906200015d92919062000ccb565b506101f4600c8190555066b1a2bc2ec50000600e819055506000601060006101000a81548160ff021916908360018111156200019e576200019d62001169565b5b0217905550620001b6336001620002e360201b60201c565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000208919062000fcc565b9250508190555062001345565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003058282604051806020016040528060008152506200030960201b60201c565b5050565b6200031b83836200037760201b60201c565b6200033060008484846200055d60201b60201c565b62000372576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003699062000f17565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003ea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003e19062000f7d565b60405180910390fd5b620003fb816200071760201b60201c565b156200043e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004359062000f39565b60405180910390fd5b62000452600083836200078360201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620004a4919062000fcc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006200058b8473ffffffffffffffffffffffffffffffffffffffff16620008ca60201b620018f71760201c565b156200070a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620005bd6200021560201b60201c565b8786866040518563ffffffff1660e01b8152600401620005e1949392919062000ec3565b602060405180830381600087803b158015620005fc57600080fd5b505af19250505080156200063057506040513d601f19601f820116820180604052508101906200062d919062000d92565b60015b620006b9573d806000811462000663576040519150601f19603f3d011682016040523d82523d6000602084013e62000668565b606091505b50600081511415620006b1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006a89062000f17565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506200070f565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6200079b838383620008dd60201b6200190a1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620007e857620007e281620008e260201b60201c565b62000830565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146200082f576200082e83826200092b60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200087d57620008778162000aa860201b60201c565b620008c5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620008c457620008c3828262000b8460201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001620009458462000c1060201b62000eef1760201c565b62000951919062001029565b905060006007600084815260200190815260200160002054905081811462000a37576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000abe919062001029565b905060006009600084815260200190815260200160002054905060006008838154811062000af15762000af0620011f6565b5b90600052602060002001549050806008838154811062000b165762000b15620011f6565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000b685762000b67620011c7565b5b6001900381819060005260206000200160009055905550505050565b600062000b9c8362000c1060201b62000eef1760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c7b9062000f5b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000cd99062001104565b90600052602060002090601f01602090048101928262000cfd576000855562000d49565b82601f1062000d1857805160ff191683800117855562000d49565b8280016001018555821562000d49579182015b8281111562000d4857825182559160200191906001019062000d2b565b5b50905062000d58919062000d5c565b5090565b5b8082111562000d7757600081600090555060010162000d5d565b5090565b60008151905062000d8c816200132b565b92915050565b60006020828403121562000dab5762000daa62001225565b5b600062000dbb8482850162000d7b565b91505092915050565b62000dcf8162001064565b82525050565b600062000de28262000f9f565b62000dee818562000faa565b935062000e00818560208601620010ce565b62000e0b816200122a565b840191505092915050565b600062000e2560328362000fbb565b915062000e32826200123b565b604082019050919050565b600062000e4c601c8362000fbb565b915062000e59826200128a565b602082019050919050565b600062000e73602a8362000fbb565b915062000e8082620012b3565b604082019050919050565b600062000e9a60208362000fbb565b915062000ea78262001302565b602082019050919050565b62000ebd81620010c4565b82525050565b600060808201905062000eda600083018762000dc4565b62000ee9602083018662000dc4565b62000ef8604083018562000eb2565b818103606083015262000f0c818462000dd5565b905095945050505050565b6000602082019050818103600083015262000f328162000e16565b9050919050565b6000602082019050818103600083015262000f548162000e3d565b9050919050565b6000602082019050818103600083015262000f768162000e64565b9050919050565b6000602082019050818103600083015262000f988162000e8b565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000fd982620010c4565b915062000fe683620010c4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200101e576200101d6200113a565b5b828201905092915050565b60006200103682620010c4565b91506200104383620010c4565b9250828210156200105957620010586200113a565b5b828203905092915050565b60006200107182620010a4565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620010ee578082015181840152602081019050620010d1565b83811115620010fe576000848401525b50505050565b600060028204905060018216806200111d57607f821691505b6020821081141562001134576200113362001198565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b620013368162001078565b81146200134257600080fd5b50565b61456980620013556000396000f3fe6080604052600436106101cd5760003560e01c806370a08231116100f7578063b0a1c1c411610095578063c87b56dd11610064578063c87b56dd14610643578063e831574214610680578063e985e9c5146106ab578063f2fde38b146106e8576101cd565b8063b0a1c1c41461059b578063b88d4fde146105c6578063bdb4b848146105ef578063c3b0ce3b1461061a576101cd565b80638da5cb5b116100d15780638da5cb5b1461050057806395d89b411461052b578063a0712d6814610556578063a22cb46514610572576101cd565b806370a0823114610481578063715018a6146104be5780637ad4f78f146104d5576101cd565b80632f745c591161016f57806350e59eb31161013e57806350e59eb3146103c557806355f804b3146103f0578063603f4d52146104195780636352211e14610444576101cd565b80632f745c591461030b5780633ccfd60b1461034857806342842e0e1461035f5780634f6ccce714610388576101cd565b8063095ea7b3116101ab578063095ea7b314610277578063167ff46f146102a057806318160ddd146102b757806323b872dd146102e2576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612f57565b610711565b6040516102069190613562565b60405180910390f35b34801561021b57600080fd5b5061022461078b565b6040516102319190613598565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612ffa565b61081d565b60405161026e91906134fb565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612ece565b6108a2565b005b3480156102ac57600080fd5b506102b56109ba565b005b3480156102c357600080fd5b506102cc610a6a565b6040516102d991906138da565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190612db8565b610a77565b005b34801561031757600080fd5b50610332600480360381019061032d9190612ece565b610ad7565b60405161033f91906138da565b60405180910390f35b34801561035457600080fd5b5061035d610b7c565b005b34801561036b57600080fd5b5061038660048036038101906103819190612db8565b610ca6565b005b34801561039457600080fd5b506103af60048036038101906103aa9190612ffa565b610cc6565b6040516103bc91906138da565b60405180910390f35b3480156103d157600080fd5b506103da610d37565b6040516103e79190613562565b60405180910390f35b3480156103fc57600080fd5b5061041760048036038101906104129190612fb1565b610d90565b005b34801561042557600080fd5b5061042e610e26565b60405161043b919061357d565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190612ffa565b610e3d565b60405161047891906134fb565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190612d4b565b610eef565b6040516104b591906138da565b60405180910390f35b3480156104ca57600080fd5b506104d3610fa7565b005b3480156104e157600080fd5b506104ea61102f565b6040516104f791906138da565b60405180910390f35b34801561050c57600080fd5b50610515611035565b60405161052291906134fb565b60405180910390f35b34801561053757600080fd5b5061054061105f565b60405161054d9190613598565b60405180910390f35b610570600480360381019061056b9190612ffa565b6110f1565b005b34801561057e57600080fd5b5061059960048036038101906105949190612e8e565b611331565b005b3480156105a757600080fd5b506105b06114b2565b6040516105bd91906138da565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190612e0b565b6114ba565b005b3480156105fb57600080fd5b5061060461151c565b60405161061191906138da565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190612f0e565b611526565b005b34801561064f57600080fd5b5061066a60048036038101906106659190612ffa565b6116be565b6040516106779190613598565b60405180910390f35b34801561068c57600080fd5b50610695611765565b6040516106a291906138da565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190612d78565b61176b565b6040516106df9190613562565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a9190612d4b565b6117ff565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078457506107838261190f565b5b9050919050565b60606000805461079a90613be6565b80601f01602080910402602001604051908101604052809291908181526020018280546107c690613be6565b80156108135780601f106107e857610100808354040283529160200191610813565b820191906000526020600020905b8154815290600101906020018083116107f657829003601f168201915b5050505050905090565b6000610828826119f1565b610867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085e906137da565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ad82610e3d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561091e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109159061387a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661093d611a5d565b73ffffffffffffffffffffffffffffffffffffffff16148061096c575061096b81610966611a5d565b61176b565b5b6109ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a29061371a565b60405180910390fd5b6109b58383611a65565b505050565b6109c2611a5d565b73ffffffffffffffffffffffffffffffffffffffff166109e0611035565b73ffffffffffffffffffffffffffffffffffffffff1614610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d906137fa565b60405180910390fd5b6001601060006101000a81548160ff02191690836001811115610a5c57610a5b613d21565b5b021790555042601181905550565b6000600880549050905090565b610a88610a82611a5d565b82611b1e565b610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe9061389a565b60405180910390fd5b610ad2838383611bfc565b505050565b6000610ae283610eef565b8210610b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a906135fa565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b84611a5d565b73ffffffffffffffffffffffffffffffffffffffff16610ba2611035565b73ffffffffffffffffffffffffffffffffffffffff1614610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef906137fa565b60405180910390fd5b6000610c026114b2565b905060008111610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906136da565b60405180910390fd5b610c70610c52611035565b6064606284610c619190613a7d565b610c6b9190613a4c565b611e58565b610ca3601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610c9e6114b2565b611e58565b50565b610cc1838383604051806020016040528060008152506114ba565b505050565b6000610cd0610a6a565b8210610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d08906138ba565b60405180910390fd5b60088281548110610d2557610d24613dae565b5b90600052602060002001549050919050565b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610d885760019050610d8d565b600090505b90565b610d98611a5d565b73ffffffffffffffffffffffffffffffffffffffff16610db6611035565b73ffffffffffffffffffffffffffffffffffffffff1614610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e03906137fa565b60405180910390fd5b80600b9080519060200190610e22929190612ac1565b5050565b6000601060009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd9061377a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f579061375a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610faf611a5d565b73ffffffffffffffffffffffffffffffffffffffff16610fcd611035565b73ffffffffffffffffffffffffffffffffffffffff1614611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a906137fa565b60405180910390fd5b61102d6000611f09565b565b60115481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461106e90613be6565b80601f016020809104026020016040519081016040528092919081815260200182805461109a90613be6565b80156110e75780601f106110bc576101008083540402835291602001916110e7565b820191906000526020600020905b8154815290600101906020018083116110ca57829003601f168201915b5050505050905090565b60018081111561110457611103613d21565b5b601060009054906101000a900460ff16600181111561112657611125613d21565b5b14611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d9061381a565b60405180910390fd5b600c5481611172610a6a565b61117c91906139f6565b11156111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b4906135da565b60405180910390fd5b806111c661151c565b6111d09190613a7d565b341015611212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112099061373a565b60405180910390fd5b600f5481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461126091906139f6565b11156112a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112989061379a565b60405180910390fd5b60005b8181101561132d5760006112b6611fcf565b90506112c23382612010565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461131291906139f6565b9250508190555050808061132590613c49565b9150506112a4565b5050565b611339611a5d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e906136ba565b60405180910390fd5b80600560006113b4611a5d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611461611a5d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a69190613562565b60405180910390a35050565b600047905090565b6114cb6114c5611a5d565b83611b1e565b61150a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115019061389a565b60405180910390fd5b6115168484848461202e565b50505050565b6000600e54905090565b61152e611a5d565b73ffffffffffffffffffffffffffffffffffffffff1661154c611035565b73ffffffffffffffffffffffffffffffffffffffff16146115a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611599906137fa565b60405180910390fd5b602c81516115ae610a6a565b6115b891906139f6565b11156115f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f0906135ba565b60405180910390fd5b60005b81518110156116ba57600061160f611fcf565b905061163583838151811061162757611626613dae565b5b602002602001015182612010565b6001600d600085858151811061164e5761164d613dae565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461169f91906139f6565b925050819055505080806116b290613c49565b9150506115fc565b5050565b60606116c9826119f1565b611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff9061385a565b60405180910390fd5b600061171261208a565b90506000815111611732576040518060200160405280600081525061175d565b8061173c8461211c565b60405160200161174d9291906134b7565b6040516020818303038152906040525b915050919050565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611807611a5d565b73ffffffffffffffffffffffffffffffffffffffff16611825611035565b73ffffffffffffffffffffffffffffffffffffffff161461187b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611872906137fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e29061363a565b60405180910390fd5b6118f481611f09565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119ea57506119e98261227d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ad883610e3d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b29826119f1565b611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f906136fa565b60405180910390fd5b6000611b7383610e3d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611be257508373ffffffffffffffffffffffffffffffffffffffff16611bca8461081d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611bf35750611bf2818561176b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c1c82610e3d565b73ffffffffffffffffffffffffffffffffffffffff1614611c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c699061383a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd99061369a565b60405180910390fd5b611ced8383836122e7565b611cf8600082611a65565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d489190613ad7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d9f91906139f6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611e7e906134e6565b60006040518083038185875af1925050503d8060008114611ebb576040519150601f19603f3d011682016040523d82523d6000602084013e611ec0565b606091505b5050905080611f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efb9061367a565b60405180910390fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080611fda610a6a565b90506000600190505b801561200857600182611ff691906139f6565b9150612001826119f1565b9050611fe3565b819250505090565b61202a8282604051806020016040528060008152506123fb565b5050565b612039848484611bfc565b61204584848484612456565b612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207b9061361a565b60405180910390fd5b50505050565b6060600b805461209990613be6565b80601f01602080910402602001604051908101604052809291908181526020018280546120c590613be6565b80156121125780601f106120e757610100808354040283529160200191612112565b820191906000526020600020905b8154815290600101906020018083116120f557829003601f168201915b5050505050905090565b60606000821415612164576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612278565b600082905060005b6000821461219657808061217f90613c49565b915050600a8261218f9190613a4c565b915061216c565b60008167ffffffffffffffff8111156121b2576121b1613ddd565b5b6040519080825280601f01601f1916602001820160405280156121e45781602001600182028036833780820191505090505b5090505b60008514612271576001826121fd9190613ad7565b9150600a8561220c9190613c92565b603061221891906139f6565b60f81b81838151811061222e5761222d613dae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561226a9190613a4c565b94506121e8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122f283838361190a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561233557612330816125ed565b612374565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612373576123728382612636565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123b7576123b2816127a3565b6123f6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123f5576123f48282612874565b5b5b505050565b61240583836128f3565b6124126000848484612456565b612451576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124489061361a565b60405180910390fd5b505050565b60006124778473ffffffffffffffffffffffffffffffffffffffff166118f7565b156125e0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124a0611a5d565b8786866040518563ffffffff1660e01b81526004016124c29493929190613516565b602060405180830381600087803b1580156124dc57600080fd5b505af192505050801561250d57506040513d601f19601f8201168201806040525081019061250a9190612f84565b60015b612590573d806000811461253d576040519150601f19603f3d011682016040523d82523d6000602084013e612542565b606091505b50600081511415612588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257f9061361a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125e5565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161264384610eef565b61264d9190613ad7565b9050600060076000848152602001908152602001600020549050818114612732576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127b79190613ad7565b90506000600960008481526020019081526020016000205490506000600883815481106127e7576127e6613dae565b5b90600052602060002001549050806008838154811061280957612808613dae565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061285857612857613d7f565b5b6001900381819060005260206000200160009055905550505050565b600061287f83610eef565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295a906137ba565b60405180910390fd5b61296c816119f1565b156129ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a39061365a565b60405180910390fd5b6129b8600083836122e7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a0891906139f6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612acd90613be6565b90600052602060002090601f016020900481019282612aef5760008555612b36565b82601f10612b0857805160ff1916838001178555612b36565b82800160010185558215612b36579182015b82811115612b35578251825591602001919060010190612b1a565b5b509050612b439190612b47565b5090565b5b80821115612b60576000816000905550600101612b48565b5090565b6000612b77612b728461391a565b6138f5565b90508083825260208201905082856020860282011115612b9a57612b99613e11565b5b60005b85811015612bca5781612bb08882612c58565b845260208401935060208301925050600181019050612b9d565b5050509392505050565b6000612be7612be284613946565b6138f5565b905082815260208101848484011115612c0357612c02613e16565b5b612c0e848285613ba4565b509392505050565b6000612c29612c2484613977565b6138f5565b905082815260208101848484011115612c4557612c44613e16565b5b612c50848285613ba4565b509392505050565b600081359050612c67816144d7565b92915050565b600082601f830112612c8257612c81613e0c565b5b8135612c92848260208601612b64565b91505092915050565b600081359050612caa816144ee565b92915050565b600081359050612cbf81614505565b92915050565b600081519050612cd481614505565b92915050565b600082601f830112612cef57612cee613e0c565b5b8135612cff848260208601612bd4565b91505092915050565b600082601f830112612d1d57612d1c613e0c565b5b8135612d2d848260208601612c16565b91505092915050565b600081359050612d458161451c565b92915050565b600060208284031215612d6157612d60613e20565b5b6000612d6f84828501612c58565b91505092915050565b60008060408385031215612d8f57612d8e613e20565b5b6000612d9d85828601612c58565b9250506020612dae85828601612c58565b9150509250929050565b600080600060608486031215612dd157612dd0613e20565b5b6000612ddf86828701612c58565b9350506020612df086828701612c58565b9250506040612e0186828701612d36565b9150509250925092565b60008060008060808587031215612e2557612e24613e20565b5b6000612e3387828801612c58565b9450506020612e4487828801612c58565b9350506040612e5587828801612d36565b925050606085013567ffffffffffffffff811115612e7657612e75613e1b565b5b612e8287828801612cda565b91505092959194509250565b60008060408385031215612ea557612ea4613e20565b5b6000612eb385828601612c58565b9250506020612ec485828601612c9b565b9150509250929050565b60008060408385031215612ee557612ee4613e20565b5b6000612ef385828601612c58565b9250506020612f0485828601612d36565b9150509250929050565b600060208284031215612f2457612f23613e20565b5b600082013567ffffffffffffffff811115612f4257612f41613e1b565b5b612f4e84828501612c6d565b91505092915050565b600060208284031215612f6d57612f6c613e20565b5b6000612f7b84828501612cb0565b91505092915050565b600060208284031215612f9a57612f99613e20565b5b6000612fa884828501612cc5565b91505092915050565b600060208284031215612fc757612fc6613e20565b5b600082013567ffffffffffffffff811115612fe557612fe4613e1b565b5b612ff184828501612d08565b91505092915050565b6000602082840312156130105761300f613e20565b5b600061301e84828501612d36565b91505092915050565b61303081613b0b565b82525050565b61303f81613b1d565b82525050565b6000613050826139a8565b61305a81856139be565b935061306a818560208601613bb3565b61307381613e25565b840191505092915050565b61308781613b92565b82525050565b6000613098826139b3565b6130a281856139da565b93506130b2818560208601613bb3565b6130bb81613e25565b840191505092915050565b60006130d1826139b3565b6130db81856139eb565b93506130eb818560208601613bb3565b80840191505092915050565b6000613104601e836139da565b915061310f82613e36565b602082019050919050565b6000613127601a836139da565b915061313282613e5f565b602082019050919050565b600061314a602b836139da565b915061315582613e88565b604082019050919050565b600061316d6032836139da565b915061317882613ed7565b604082019050919050565b60006131906026836139da565b915061319b82613f26565b604082019050919050565b60006131b3601c836139da565b91506131be82613f75565b602082019050919050565b60006131d66014836139da565b91506131e182613f9e565b602082019050919050565b60006131f96024836139da565b915061320482613fc7565b604082019050919050565b600061321c6019836139da565b915061322782614016565b602082019050919050565b600061323f6014836139da565b915061324a8261403f565b602082019050919050565b6000613262602c836139da565b915061326d82614068565b604082019050919050565b60006132856038836139da565b9150613290826140b7565b604082019050919050565b60006132a8602f836139da565b91506132b382614106565b604082019050919050565b60006132cb602a836139da565b91506132d682614155565b604082019050919050565b60006132ee6029836139da565b91506132f9826141a4565b604082019050919050565b60006133116022836139da565b915061331c826141f3565b604082019050919050565b60006133346020836139da565b915061333f82614242565b602082019050919050565b6000613357602c836139da565b91506133628261426b565b604082019050919050565b600061337a6005836139eb565b9150613385826142ba565b600582019050919050565b600061339d6020836139da565b91506133a8826142e3565b602082019050919050565b60006133c06015836139da565b91506133cb8261430c565b602082019050919050565b60006133e36029836139da565b91506133ee82614335565b604082019050919050565b6000613406602f836139da565b915061341182614384565b604082019050919050565b60006134296021836139da565b9150613434826143d3565b604082019050919050565b600061344c6000836139cf565b915061345782614422565b600082019050919050565b600061346f6031836139da565b915061347a82614425565b604082019050919050565b6000613492602c836139da565b915061349d82614474565b604082019050919050565b6134b181613b88565b82525050565b60006134c382856130c6565b91506134cf82846130c6565b91506134da8261336d565b91508190509392505050565b60006134f18261343f565b9150819050919050565b60006020820190506135106000830184613027565b92915050565b600060808201905061352b6000830187613027565b6135386020830186613027565b61354560408301856134a8565b81810360608301526135578184613045565b905095945050505050565b60006020820190506135776000830184613036565b92915050565b6000602082019050613592600083018461307e565b92915050565b600060208201905081810360008301526135b2818461308d565b905092915050565b600060208201905081810360008301526135d3816130f7565b9050919050565b600060208201905081810360008301526135f38161311a565b9050919050565b600060208201905081810360008301526136138161313d565b9050919050565b6000602082019050818103600083015261363381613160565b9050919050565b6000602082019050818103600083015261365381613183565b9050919050565b60006020820190508181036000830152613673816131a6565b9050919050565b60006020820190508181036000830152613693816131c9565b9050919050565b600060208201905081810360008301526136b3816131ec565b9050919050565b600060208201905081810360008301526136d38161320f565b9050919050565b600060208201905081810360008301526136f381613232565b9050919050565b6000602082019050818103600083015261371381613255565b9050919050565b6000602082019050818103600083015261373381613278565b9050919050565b600060208201905081810360008301526137538161329b565b9050919050565b60006020820190508181036000830152613773816132be565b9050919050565b60006020820190508181036000830152613793816132e1565b9050919050565b600060208201905081810360008301526137b381613304565b9050919050565b600060208201905081810360008301526137d381613327565b9050919050565b600060208201905081810360008301526137f38161334a565b9050919050565b6000602082019050818103600083015261381381613390565b9050919050565b60006020820190508181036000830152613833816133b3565b9050919050565b60006020820190508181036000830152613853816133d6565b9050919050565b60006020820190508181036000830152613873816133f9565b9050919050565b600060208201905081810360008301526138938161341c565b9050919050565b600060208201905081810360008301526138b381613462565b9050919050565b600060208201905081810360008301526138d381613485565b9050919050565b60006020820190506138ef60008301846134a8565b92915050565b60006138ff613910565b905061390b8282613c18565b919050565b6000604051905090565b600067ffffffffffffffff82111561393557613934613ddd565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561396157613960613ddd565b5b61396a82613e25565b9050602081019050919050565b600067ffffffffffffffff82111561399257613991613ddd565b5b61399b82613e25565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a0182613b88565b9150613a0c83613b88565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a4157613a40613cc3565b5b828201905092915050565b6000613a5782613b88565b9150613a6283613b88565b925082613a7257613a71613cf2565b5b828204905092915050565b6000613a8882613b88565b9150613a9383613b88565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613acc57613acb613cc3565b5b828202905092915050565b6000613ae282613b88565b9150613aed83613b88565b925082821015613b0057613aff613cc3565b5b828203905092915050565b6000613b1682613b68565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050613b63826144c3565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613b9d82613b55565b9050919050565b82818337600083830152505050565b60005b83811015613bd1578082015181840152602081019050613bb6565b83811115613be0576000848401525b50505050565b60006002820490506001821680613bfe57607f821691505b60208210811415613c1257613c11613d50565b5b50919050565b613c2182613e25565b810181811067ffffffffffffffff82111715613c4057613c3f613ddd565b5b80604052505050565b6000613c5482613b88565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c8757613c86613cc3565b5b600182019050919050565b6000613c9d82613b88565b9150613ca883613b88565b925082613cb857613cb7613cf2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f496e697469616c204d696e7420616c7265616479204578656375746564210000600082015250565b7f4e6f206d6f7265204e465473206c65667420746f206d696e7421000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f496e73756666696369656e742046756e64732c20436865636b2063757272656e60008201527f7420707269636520746f204d696e740000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d6178696d756d204d696e74732070657220416464726573732072656163686560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616c65206973206e6f74206f70656e20796574210000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600281106144d4576144d3613d21565b5b50565b6144e081613b0b565b81146144eb57600080fd5b50565b6144f781613b1d565b811461450257600080fd5b50565b61450e81613b29565b811461451957600080fd5b50565b61452581613b88565b811461453057600080fd5b5056fea264697066735822122000175fbed61a0d15301ca37200b84317d2eafdeb0f860870c330f95dcfea399d64736f6c63430008070033697066733a2f2f516d5072696664444a326d4d46374c746e575a365558744855504d464a376550694c6e4c4751584c3666795778372f
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c806370a08231116100f7578063b0a1c1c411610095578063c87b56dd11610064578063c87b56dd14610643578063e831574214610680578063e985e9c5146106ab578063f2fde38b146106e8576101cd565b8063b0a1c1c41461059b578063b88d4fde146105c6578063bdb4b848146105ef578063c3b0ce3b1461061a576101cd565b80638da5cb5b116100d15780638da5cb5b1461050057806395d89b411461052b578063a0712d6814610556578063a22cb46514610572576101cd565b806370a0823114610481578063715018a6146104be5780637ad4f78f146104d5576101cd565b80632f745c591161016f57806350e59eb31161013e57806350e59eb3146103c557806355f804b3146103f0578063603f4d52146104195780636352211e14610444576101cd565b80632f745c591461030b5780633ccfd60b1461034857806342842e0e1461035f5780634f6ccce714610388576101cd565b8063095ea7b3116101ab578063095ea7b314610277578063167ff46f146102a057806318160ddd146102b757806323b872dd146102e2576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612f57565b610711565b6040516102069190613562565b60405180910390f35b34801561021b57600080fd5b5061022461078b565b6040516102319190613598565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612ffa565b61081d565b60405161026e91906134fb565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612ece565b6108a2565b005b3480156102ac57600080fd5b506102b56109ba565b005b3480156102c357600080fd5b506102cc610a6a565b6040516102d991906138da565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190612db8565b610a77565b005b34801561031757600080fd5b50610332600480360381019061032d9190612ece565b610ad7565b60405161033f91906138da565b60405180910390f35b34801561035457600080fd5b5061035d610b7c565b005b34801561036b57600080fd5b5061038660048036038101906103819190612db8565b610ca6565b005b34801561039457600080fd5b506103af60048036038101906103aa9190612ffa565b610cc6565b6040516103bc91906138da565b60405180910390f35b3480156103d157600080fd5b506103da610d37565b6040516103e79190613562565b60405180910390f35b3480156103fc57600080fd5b5061041760048036038101906104129190612fb1565b610d90565b005b34801561042557600080fd5b5061042e610e26565b60405161043b919061357d565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190612ffa565b610e3d565b60405161047891906134fb565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190612d4b565b610eef565b6040516104b591906138da565b60405180910390f35b3480156104ca57600080fd5b506104d3610fa7565b005b3480156104e157600080fd5b506104ea61102f565b6040516104f791906138da565b60405180910390f35b34801561050c57600080fd5b50610515611035565b60405161052291906134fb565b60405180910390f35b34801561053757600080fd5b5061054061105f565b60405161054d9190613598565b60405180910390f35b610570600480360381019061056b9190612ffa565b6110f1565b005b34801561057e57600080fd5b5061059960048036038101906105949190612e8e565b611331565b005b3480156105a757600080fd5b506105b06114b2565b6040516105bd91906138da565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190612e0b565b6114ba565b005b3480156105fb57600080fd5b5061060461151c565b60405161061191906138da565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190612f0e565b611526565b005b34801561064f57600080fd5b5061066a60048036038101906106659190612ffa565b6116be565b6040516106779190613598565b60405180910390f35b34801561068c57600080fd5b50610695611765565b6040516106a291906138da565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190612d78565b61176b565b6040516106df9190613562565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a9190612d4b565b6117ff565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078457506107838261190f565b5b9050919050565b60606000805461079a90613be6565b80601f01602080910402602001604051908101604052809291908181526020018280546107c690613be6565b80156108135780601f106107e857610100808354040283529160200191610813565b820191906000526020600020905b8154815290600101906020018083116107f657829003601f168201915b5050505050905090565b6000610828826119f1565b610867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085e906137da565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ad82610e3d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561091e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109159061387a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661093d611a5d565b73ffffffffffffffffffffffffffffffffffffffff16148061096c575061096b81610966611a5d565b61176b565b5b6109ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a29061371a565b60405180910390fd5b6109b58383611a65565b505050565b6109c2611a5d565b73ffffffffffffffffffffffffffffffffffffffff166109e0611035565b73ffffffffffffffffffffffffffffffffffffffff1614610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d906137fa565b60405180910390fd5b6001601060006101000a81548160ff02191690836001811115610a5c57610a5b613d21565b5b021790555042601181905550565b6000600880549050905090565b610a88610a82611a5d565b82611b1e565b610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe9061389a565b60405180910390fd5b610ad2838383611bfc565b505050565b6000610ae283610eef565b8210610b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a906135fa565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b84611a5d565b73ffffffffffffffffffffffffffffffffffffffff16610ba2611035565b73ffffffffffffffffffffffffffffffffffffffff1614610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef906137fa565b60405180910390fd5b6000610c026114b2565b905060008111610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906136da565b60405180910390fd5b610c70610c52611035565b6064606284610c619190613a7d565b610c6b9190613a4c565b611e58565b610ca3601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610c9e6114b2565b611e58565b50565b610cc1838383604051806020016040528060008152506114ba565b505050565b6000610cd0610a6a565b8210610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d08906138ba565b60405180910390fd5b60088281548110610d2557610d24613dae565b5b90600052602060002001549050919050565b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610d885760019050610d8d565b600090505b90565b610d98611a5d565b73ffffffffffffffffffffffffffffffffffffffff16610db6611035565b73ffffffffffffffffffffffffffffffffffffffff1614610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e03906137fa565b60405180910390fd5b80600b9080519060200190610e22929190612ac1565b5050565b6000601060009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd9061377a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f579061375a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610faf611a5d565b73ffffffffffffffffffffffffffffffffffffffff16610fcd611035565b73ffffffffffffffffffffffffffffffffffffffff1614611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a906137fa565b60405180910390fd5b61102d6000611f09565b565b60115481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461106e90613be6565b80601f016020809104026020016040519081016040528092919081815260200182805461109a90613be6565b80156110e75780601f106110bc576101008083540402835291602001916110e7565b820191906000526020600020905b8154815290600101906020018083116110ca57829003601f168201915b5050505050905090565b60018081111561110457611103613d21565b5b601060009054906101000a900460ff16600181111561112657611125613d21565b5b14611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d9061381a565b60405180910390fd5b600c5481611172610a6a565b61117c91906139f6565b11156111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b4906135da565b60405180910390fd5b806111c661151c565b6111d09190613a7d565b341015611212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112099061373a565b60405180910390fd5b600f5481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461126091906139f6565b11156112a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112989061379a565b60405180910390fd5b60005b8181101561132d5760006112b6611fcf565b90506112c23382612010565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461131291906139f6565b9250508190555050808061132590613c49565b9150506112a4565b5050565b611339611a5d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e906136ba565b60405180910390fd5b80600560006113b4611a5d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611461611a5d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a69190613562565b60405180910390a35050565b600047905090565b6114cb6114c5611a5d565b83611b1e565b61150a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115019061389a565b60405180910390fd5b6115168484848461202e565b50505050565b6000600e54905090565b61152e611a5d565b73ffffffffffffffffffffffffffffffffffffffff1661154c611035565b73ffffffffffffffffffffffffffffffffffffffff16146115a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611599906137fa565b60405180910390fd5b602c81516115ae610a6a565b6115b891906139f6565b11156115f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f0906135ba565b60405180910390fd5b60005b81518110156116ba57600061160f611fcf565b905061163583838151811061162757611626613dae565b5b602002602001015182612010565b6001600d600085858151811061164e5761164d613dae565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461169f91906139f6565b925050819055505080806116b290613c49565b9150506115fc565b5050565b60606116c9826119f1565b611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff9061385a565b60405180910390fd5b600061171261208a565b90506000815111611732576040518060200160405280600081525061175d565b8061173c8461211c565b60405160200161174d9291906134b7565b6040516020818303038152906040525b915050919050565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611807611a5d565b73ffffffffffffffffffffffffffffffffffffffff16611825611035565b73ffffffffffffffffffffffffffffffffffffffff161461187b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611872906137fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e29061363a565b60405180910390fd5b6118f481611f09565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119ea57506119e98261227d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ad883610e3d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b29826119f1565b611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f906136fa565b60405180910390fd5b6000611b7383610e3d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611be257508373ffffffffffffffffffffffffffffffffffffffff16611bca8461081d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611bf35750611bf2818561176b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c1c82610e3d565b73ffffffffffffffffffffffffffffffffffffffff1614611c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c699061383a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd99061369a565b60405180910390fd5b611ced8383836122e7565b611cf8600082611a65565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d489190613ad7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d9f91906139f6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611e7e906134e6565b60006040518083038185875af1925050503d8060008114611ebb576040519150601f19603f3d011682016040523d82523d6000602084013e611ec0565b606091505b5050905080611f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efb9061367a565b60405180910390fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080611fda610a6a565b90506000600190505b801561200857600182611ff691906139f6565b9150612001826119f1565b9050611fe3565b819250505090565b61202a8282604051806020016040528060008152506123fb565b5050565b612039848484611bfc565b61204584848484612456565b612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207b9061361a565b60405180910390fd5b50505050565b6060600b805461209990613be6565b80601f01602080910402602001604051908101604052809291908181526020018280546120c590613be6565b80156121125780601f106120e757610100808354040283529160200191612112565b820191906000526020600020905b8154815290600101906020018083116120f557829003601f168201915b5050505050905090565b60606000821415612164576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612278565b600082905060005b6000821461219657808061217f90613c49565b915050600a8261218f9190613a4c565b915061216c565b60008167ffffffffffffffff8111156121b2576121b1613ddd565b5b6040519080825280601f01601f1916602001820160405280156121e45781602001600182028036833780820191505090505b5090505b60008514612271576001826121fd9190613ad7565b9150600a8561220c9190613c92565b603061221891906139f6565b60f81b81838151811061222e5761222d613dae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561226a9190613a4c565b94506121e8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122f283838361190a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561233557612330816125ed565b612374565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612373576123728382612636565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123b7576123b2816127a3565b6123f6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123f5576123f48282612874565b5b5b505050565b61240583836128f3565b6124126000848484612456565b612451576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124489061361a565b60405180910390fd5b505050565b60006124778473ffffffffffffffffffffffffffffffffffffffff166118f7565b156125e0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124a0611a5d565b8786866040518563ffffffff1660e01b81526004016124c29493929190613516565b602060405180830381600087803b1580156124dc57600080fd5b505af192505050801561250d57506040513d601f19601f8201168201806040525081019061250a9190612f84565b60015b612590573d806000811461253d576040519150601f19603f3d011682016040523d82523d6000602084013e612542565b606091505b50600081511415612588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257f9061361a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125e5565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161264384610eef565b61264d9190613ad7565b9050600060076000848152602001908152602001600020549050818114612732576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127b79190613ad7565b90506000600960008481526020019081526020016000205490506000600883815481106127e7576127e6613dae565b5b90600052602060002001549050806008838154811061280957612808613dae565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061285857612857613d7f565b5b6001900381819060005260206000200160009055905550505050565b600061287f83610eef565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295a906137ba565b60405180910390fd5b61296c816119f1565b156129ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a39061365a565b60405180910390fd5b6129b8600083836122e7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a0891906139f6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612acd90613be6565b90600052602060002090601f016020900481019282612aef5760008555612b36565b82601f10612b0857805160ff1916838001178555612b36565b82800160010185558215612b36579182015b82811115612b35578251825591602001919060010190612b1a565b5b509050612b439190612b47565b5090565b5b80821115612b60576000816000905550600101612b48565b5090565b6000612b77612b728461391a565b6138f5565b90508083825260208201905082856020860282011115612b9a57612b99613e11565b5b60005b85811015612bca5781612bb08882612c58565b845260208401935060208301925050600181019050612b9d565b5050509392505050565b6000612be7612be284613946565b6138f5565b905082815260208101848484011115612c0357612c02613e16565b5b612c0e848285613ba4565b509392505050565b6000612c29612c2484613977565b6138f5565b905082815260208101848484011115612c4557612c44613e16565b5b612c50848285613ba4565b509392505050565b600081359050612c67816144d7565b92915050565b600082601f830112612c8257612c81613e0c565b5b8135612c92848260208601612b64565b91505092915050565b600081359050612caa816144ee565b92915050565b600081359050612cbf81614505565b92915050565b600081519050612cd481614505565b92915050565b600082601f830112612cef57612cee613e0c565b5b8135612cff848260208601612bd4565b91505092915050565b600082601f830112612d1d57612d1c613e0c565b5b8135612d2d848260208601612c16565b91505092915050565b600081359050612d458161451c565b92915050565b600060208284031215612d6157612d60613e20565b5b6000612d6f84828501612c58565b91505092915050565b60008060408385031215612d8f57612d8e613e20565b5b6000612d9d85828601612c58565b9250506020612dae85828601612c58565b9150509250929050565b600080600060608486031215612dd157612dd0613e20565b5b6000612ddf86828701612c58565b9350506020612df086828701612c58565b9250506040612e0186828701612d36565b9150509250925092565b60008060008060808587031215612e2557612e24613e20565b5b6000612e3387828801612c58565b9450506020612e4487828801612c58565b9350506040612e5587828801612d36565b925050606085013567ffffffffffffffff811115612e7657612e75613e1b565b5b612e8287828801612cda565b91505092959194509250565b60008060408385031215612ea557612ea4613e20565b5b6000612eb385828601612c58565b9250506020612ec485828601612c9b565b9150509250929050565b60008060408385031215612ee557612ee4613e20565b5b6000612ef385828601612c58565b9250506020612f0485828601612d36565b9150509250929050565b600060208284031215612f2457612f23613e20565b5b600082013567ffffffffffffffff811115612f4257612f41613e1b565b5b612f4e84828501612c6d565b91505092915050565b600060208284031215612f6d57612f6c613e20565b5b6000612f7b84828501612cb0565b91505092915050565b600060208284031215612f9a57612f99613e20565b5b6000612fa884828501612cc5565b91505092915050565b600060208284031215612fc757612fc6613e20565b5b600082013567ffffffffffffffff811115612fe557612fe4613e1b565b5b612ff184828501612d08565b91505092915050565b6000602082840312156130105761300f613e20565b5b600061301e84828501612d36565b91505092915050565b61303081613b0b565b82525050565b61303f81613b1d565b82525050565b6000613050826139a8565b61305a81856139be565b935061306a818560208601613bb3565b61307381613e25565b840191505092915050565b61308781613b92565b82525050565b6000613098826139b3565b6130a281856139da565b93506130b2818560208601613bb3565b6130bb81613e25565b840191505092915050565b60006130d1826139b3565b6130db81856139eb565b93506130eb818560208601613bb3565b80840191505092915050565b6000613104601e836139da565b915061310f82613e36565b602082019050919050565b6000613127601a836139da565b915061313282613e5f565b602082019050919050565b600061314a602b836139da565b915061315582613e88565b604082019050919050565b600061316d6032836139da565b915061317882613ed7565b604082019050919050565b60006131906026836139da565b915061319b82613f26565b604082019050919050565b60006131b3601c836139da565b91506131be82613f75565b602082019050919050565b60006131d66014836139da565b91506131e182613f9e565b602082019050919050565b60006131f96024836139da565b915061320482613fc7565b604082019050919050565b600061321c6019836139da565b915061322782614016565b602082019050919050565b600061323f6014836139da565b915061324a8261403f565b602082019050919050565b6000613262602c836139da565b915061326d82614068565b604082019050919050565b60006132856038836139da565b9150613290826140b7565b604082019050919050565b60006132a8602f836139da565b91506132b382614106565b604082019050919050565b60006132cb602a836139da565b91506132d682614155565b604082019050919050565b60006132ee6029836139da565b91506132f9826141a4565b604082019050919050565b60006133116022836139da565b915061331c826141f3565b604082019050919050565b60006133346020836139da565b915061333f82614242565b602082019050919050565b6000613357602c836139da565b91506133628261426b565b604082019050919050565b600061337a6005836139eb565b9150613385826142ba565b600582019050919050565b600061339d6020836139da565b91506133a8826142e3565b602082019050919050565b60006133c06015836139da565b91506133cb8261430c565b602082019050919050565b60006133e36029836139da565b91506133ee82614335565b604082019050919050565b6000613406602f836139da565b915061341182614384565b604082019050919050565b60006134296021836139da565b9150613434826143d3565b604082019050919050565b600061344c6000836139cf565b915061345782614422565b600082019050919050565b600061346f6031836139da565b915061347a82614425565b604082019050919050565b6000613492602c836139da565b915061349d82614474565b604082019050919050565b6134b181613b88565b82525050565b60006134c382856130c6565b91506134cf82846130c6565b91506134da8261336d565b91508190509392505050565b60006134f18261343f565b9150819050919050565b60006020820190506135106000830184613027565b92915050565b600060808201905061352b6000830187613027565b6135386020830186613027565b61354560408301856134a8565b81810360608301526135578184613045565b905095945050505050565b60006020820190506135776000830184613036565b92915050565b6000602082019050613592600083018461307e565b92915050565b600060208201905081810360008301526135b2818461308d565b905092915050565b600060208201905081810360008301526135d3816130f7565b9050919050565b600060208201905081810360008301526135f38161311a565b9050919050565b600060208201905081810360008301526136138161313d565b9050919050565b6000602082019050818103600083015261363381613160565b9050919050565b6000602082019050818103600083015261365381613183565b9050919050565b60006020820190508181036000830152613673816131a6565b9050919050565b60006020820190508181036000830152613693816131c9565b9050919050565b600060208201905081810360008301526136b3816131ec565b9050919050565b600060208201905081810360008301526136d38161320f565b9050919050565b600060208201905081810360008301526136f381613232565b9050919050565b6000602082019050818103600083015261371381613255565b9050919050565b6000602082019050818103600083015261373381613278565b9050919050565b600060208201905081810360008301526137538161329b565b9050919050565b60006020820190508181036000830152613773816132be565b9050919050565b60006020820190508181036000830152613793816132e1565b9050919050565b600060208201905081810360008301526137b381613304565b9050919050565b600060208201905081810360008301526137d381613327565b9050919050565b600060208201905081810360008301526137f38161334a565b9050919050565b6000602082019050818103600083015261381381613390565b9050919050565b60006020820190508181036000830152613833816133b3565b9050919050565b60006020820190508181036000830152613853816133d6565b9050919050565b60006020820190508181036000830152613873816133f9565b9050919050565b600060208201905081810360008301526138938161341c565b9050919050565b600060208201905081810360008301526138b381613462565b9050919050565b600060208201905081810360008301526138d381613485565b9050919050565b60006020820190506138ef60008301846134a8565b92915050565b60006138ff613910565b905061390b8282613c18565b919050565b6000604051905090565b600067ffffffffffffffff82111561393557613934613ddd565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561396157613960613ddd565b5b61396a82613e25565b9050602081019050919050565b600067ffffffffffffffff82111561399257613991613ddd565b5b61399b82613e25565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a0182613b88565b9150613a0c83613b88565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a4157613a40613cc3565b5b828201905092915050565b6000613a5782613b88565b9150613a6283613b88565b925082613a7257613a71613cf2565b5b828204905092915050565b6000613a8882613b88565b9150613a9383613b88565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613acc57613acb613cc3565b5b828202905092915050565b6000613ae282613b88565b9150613aed83613b88565b925082821015613b0057613aff613cc3565b5b828203905092915050565b6000613b1682613b68565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050613b63826144c3565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613b9d82613b55565b9050919050565b82818337600083830152505050565b60005b83811015613bd1578082015181840152602081019050613bb6565b83811115613be0576000848401525b50505050565b60006002820490506001821680613bfe57607f821691505b60208210811415613c1257613c11613d50565b5b50919050565b613c2182613e25565b810181811067ffffffffffffffff82111715613c4057613c3f613ddd565b5b80604052505050565b6000613c5482613b88565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c8757613c86613cc3565b5b600182019050919050565b6000613c9d82613b88565b9150613ca883613b88565b925082613cb857613cb7613cf2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f496e697469616c204d696e7420616c7265616479204578656375746564210000600082015250565b7f4e6f206d6f7265204e465473206c65667420746f206d696e7421000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f496e73756666696369656e742046756e64732c20436865636b2063757272656e60008201527f7420707269636520746f204d696e740000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d6178696d756d204d696e74732070657220416464726573732072656163686560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616c65206973206e6f74206f70656e20796574210000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600281106144d4576144d3613d21565b5b50565b6144e081613b0b565b81146144eb57600080fd5b50565b6144f781613b1d565b811461450257600080fd5b50565b61450e81613b29565b811461451957600080fd5b50565b61452581613b88565b811461453057600080fd5b5056fea264697066735822122000175fbed61a0d15301ca37200b84317d2eafdeb0f860870c330f95dcfea399d64736f6c63430008070033
Deployed Bytecode Sourcemap
42430:4605:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36297:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23752:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25332:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24855:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45150:126;;;;;;;;;;;;;:::i;:::-;;36937:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26222:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36605:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45705:283;;;;;;;;;;;;;:::i;:::-;;26632:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37127:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46233:194;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43876:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45323:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23446:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23176:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4593:94;;;;;;;;;;;;;:::i;:::-;;43193:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3942:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23921:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44502:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25625:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45570:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26888:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45454:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46586:423;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24096:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42605:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25991:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4842:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36297:224;36399:4;36438:35;36423:50;;;:11;:50;;;;:90;;;;36477:36;36501:11;36477:23;:36::i;:::-;36423:90;36416:97;;36297:224;;;:::o;23752:100::-;23806:13;23839:5;23832:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23752:100;:::o;25332:221::-;25408:7;25436:16;25444:7;25436;:16::i;:::-;25428:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25521:15;:24;25537:7;25521:24;;;;;;;;;;;;;;;;;;;;;25514:31;;25332:221;;;:::o;24855:411::-;24936:13;24952:23;24967:7;24952:14;:23::i;:::-;24936:39;;25000:5;24994:11;;:2;:11;;;;24986:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25094:5;25078:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25103:37;25120:5;25127:12;:10;:12::i;:::-;25103:16;:37::i;:::-;25078:62;25056:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25237:21;25246:2;25250:7;25237:8;:21::i;:::-;24925:341;24855:411;;:::o;45150:126::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45211:14:::1;45198:10;;:27;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;45253:15;45236:14;:32;;;;45150:126::o:0;36937:113::-;36998:7;37025:10;:17;;;;37018:24;;36937:113;:::o;26222:339::-;26417:41;26436:12;:10;:12::i;:::-;26450:7;26417:18;:41::i;:::-;26409:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26525:28;26535:4;26541:2;26545:7;26525:9;:28::i;:::-;26222:339;;;:::o;36605:256::-;36702:7;36738:23;36755:5;36738:16;:23::i;:::-;36730:5;:31;36722:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36827:12;:19;36840:5;36827:19;;;;;;;;;;;;;;;:26;36847:5;36827:26;;;;;;;;;;;;36820:33;;36605:256;;;;:::o;45705:283::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45753:16:::1;45772;:14;:16::i;:::-;45753:35;;45818:1;45807:8;:12;45799:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;45865:52;45883:7;:5;:7::i;:::-;45912:3;45906:2;45895:8;:13;;;;:::i;:::-;45894:21;;;;:::i;:::-;45865:9;:52::i;:::-;45928:32;45938:3;;;;;;;;;;;45943:16;:14;:16::i;:::-;45928:9;:32::i;:::-;45742:246;45705:283::o:0;26632:185::-;26770:39;26787:4;26793:2;26797:7;26770:39;;;;;;;;;;;;:16;:39::i;:::-;26632:185;;;:::o;37127:233::-;37202:7;37238:30;:28;:30::i;:::-;37230:5;:38;37222:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37335:10;37346:5;37335:17;;;;;;;;:::i;:::-;;;;;;;;;;37328:24;;37127:233;;;:::o;46233:194::-;46273:4;46325:1;46294:15;:27;46310:10;46294:27;;;;;;;;;;;;;;;;:32;46290:130;;46350:4;46343:11;;;;46290:130;46403:5;46396:12;;46233:194;;:::o;43876:104::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43965:7:::1;43947:15;:25;;;;;;;;;;;;:::i;:::-;;43876:104:::0;:::o;45323:84::-;45364:5;45389:10;;;;;;;;;;;45382:17;;45323:84;:::o;23446:239::-;23518:7;23538:13;23554:7;:16;23562:7;23554:16;;;;;;;;;;;;;;;;;;;;;23538:32;;23606:1;23589:19;;:5;:19;;;;23581:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23672:5;23665:12;;;23446:239;;;:::o;23176:208::-;23248:7;23293:1;23276:19;;:5;:19;;;;23268:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23360:9;:16;23370:5;23360:16;;;;;;;;;;;;;;;;23353:23;;23176:208;;;:::o;4593:94::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4658:21:::1;4676:1;4658:9;:21::i;:::-;4593:94::o:0;43193:29::-;;;;:::o;3942:87::-;3988:7;4015:6;;;;;;;;;;;4008:13;;3942:87;:::o;23921:104::-;23977:13;24010:7;24003:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23921:104;:::o;44502:615::-;44577:14;44563:28;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:28;;;;;;;;:::i;:::-;;;44555:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;44662:9;;44652:6;44636:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;44628:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;44747:6;44734:10;:8;:10::i;:::-;:19;;;;:::i;:::-;44721:9;:32;;44713:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;44864:7;;44854:6;44824:15;:27;44840:10;44824:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:47;;44816:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;44936:6;44931:169;44952:6;44948:1;:10;44931:169;;;44980:8;44991:9;:7;:9::i;:::-;44980:20;;45015:26;45025:10;45037:3;45015:9;:26::i;:::-;45087:1;45056:15;:27;45072:10;45056:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;44965:135;44960:3;;;;;:::i;:::-;;;;44931:169;;;;44502:615;:::o;25625:295::-;25740:12;:10;:12::i;:::-;25728:24;;:8;:24;;;;25720:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25840:8;25795:18;:32;25814:12;:10;:12::i;:::-;25795:32;;;;;;;;;;;;;;;:42;25828:8;25795:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25893:8;25864:48;;25879:12;:10;:12::i;:::-;25864:48;;;25903:8;25864:48;;;;;;:::i;:::-;;;;;;;;25625:295;;:::o;45570:102::-;45616:7;45643:21;45636:28;;45570:102;:::o;26888:328::-;27063:41;27082:12;:10;:12::i;:::-;27096:7;27063:18;:41::i;:::-;27055:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27169:39;27183:4;27189:2;27193:7;27202:5;27169:13;:39::i;:::-;26888:328;;;;:::o;45454:81::-;45494:4;45518:9;;45511:16;;45454:81;:::o;46586:423::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46715:2:::1;46691:13;:20;46675:13;:11;:13::i;:::-;:36;;;;:::i;:::-;:42;;46667:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;46812:6;46807:195;46828:13;:20;46824:1;:24;46807:195;;;46870:8;46881:9;:7;:9::i;:::-;46870:20;;46905:32;46915:13;46929:1;46915:16;;;;;;;;:::i;:::-;;;;;;;;46933:3;46905:9;:32::i;:::-;46989:1;46952:15;:33;46968:13;46982:1;46968:16;;;;;;;;:::i;:::-;;;;;;;;46952:33;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;46855:147;46850:3;;;;;:::i;:::-;;;;46807:195;;;;46586:423:::0;:::o;24096:355::-;24169:13;24203:16;24211:7;24203;:16::i;:::-;24195:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24286:21;24310:10;:8;:10::i;:::-;24286:34;;24362:1;24344:7;24338:21;:25;:95;;;;;;;;;;;;;;;;;24390:7;24399:18;:7;:16;:18::i;:::-;24373:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24338:95;24331:102;;;24096:355;;;:::o;42605:24::-;;;;:::o;25991:164::-;26088:4;26112:18;:25;26131:5;26112:25;;;;;;;;;;;;;;;:35;26138:8;26112:35;;;;;;;;;;;;;;;;;;;;;;;;;26105:42;;25991:164;;;;:::o;4842:192::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4951:1:::1;4931:22;;:8;:22;;;;4923:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5007:19;5017:8;5007:9;:19::i;:::-;4842:192:::0;:::o;5988:387::-;6048:4;6256:12;6323:7;6311:20;6303:28;;6366:1;6359:4;:8;6352:15;;;5988:387;;;:::o;34818:126::-;;;;:::o;22807:305::-;22909:4;22961:25;22946:40;;;:11;:40;;;;:105;;;;23018:33;23003:48;;;:11;:48;;;;22946:105;:158;;;;23068:36;23092:11;23068:23;:36::i;:::-;22946:158;22926:178;;22807:305;;;:::o;28726:127::-;28791:4;28843:1;28815:30;;:7;:16;28823:7;28815:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28808:37;;28726:127;;;:::o;2730:98::-;2783:7;2810:10;2803:17;;2730:98;:::o;32708:174::-;32810:2;32783:15;:24;32799:7;32783:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32866:7;32862:2;32828:46;;32837:23;32852:7;32837:14;:23::i;:::-;32828:46;;;;;;;;;;;;32708:174;;:::o;29020:348::-;29113:4;29138:16;29146:7;29138;:16::i;:::-;29130:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29214:13;29230:23;29245:7;29230:14;:23::i;:::-;29214:39;;29283:5;29272:16;;:7;:16;;;:51;;;;29316:7;29292:31;;:20;29304:7;29292:11;:20::i;:::-;:31;;;29272:51;:87;;;;29327:32;29344:5;29351:7;29327:16;:32::i;:::-;29272:87;29264:96;;;29020:348;;;;:::o;32012:578::-;32171:4;32144:31;;:23;32159:7;32144:14;:23::i;:::-;:31;;;32136:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32254:1;32240:16;;:2;:16;;;;32232:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32310:39;32331:4;32337:2;32341:7;32310:20;:39::i;:::-;32414:29;32431:1;32435:7;32414:8;:29::i;:::-;32475:1;32456:9;:15;32466:4;32456:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32504:1;32487:9;:13;32497:2;32487:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32535:2;32516:7;:16;32524:7;32516:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32574:7;32570:2;32555:27;;32564:4;32555:27;;;;;;;;;;;;32012:578;;;:::o;45996:182::-;46075:9;46090:8;:13;;46111:6;46090:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46074:48;;;46141:4;46133:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;46063:115;45996:182;;:::o;5042:173::-;5098:16;5117:6;;;;;;;;;;;5098:25;;5143:8;5134:6;;:17;;;;;;;;;;;;;;;;;;5198:8;5167:40;;5188:8;5167:40;;;;;;;;;;;;5087:128;5042:173;:::o;44192:273::-;44233:7;44253:14;44270:13;:11;:13::i;:::-;44253:30;;44294:11;44308:4;44294:18;;44323:98;44330:6;44323:98;;;44366:1;44353:14;;;;;:::i;:::-;;;44391:18;44399:9;44391:7;:18::i;:::-;44382:27;;44323:98;;;44448:9;44441:16;;;;44192:273;:::o;29710:110::-;29786:26;29796:2;29800:7;29786:26;;;;;;;;;;;;:9;:26::i;:::-;29710:110;;:::o;28098:315::-;28255:28;28265:4;28271:2;28275:7;28255:9;:28::i;:::-;28302:48;28325:4;28331:2;28335:7;28344:5;28302:22;:48::i;:::-;28294:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28098:315;;;;:::o;44031:108::-;44083:13;44116:15;44109:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44031:108;:::o;346:723::-;402:13;632:1;623:5;:10;619:53;;;650:10;;;;;;;;;;;;;;;;;;;;;619:53;682:12;697:5;682:20;;713:14;738:78;753:1;745:4;:9;738:78;;771:8;;;;;:::i;:::-;;;;802:2;794:10;;;;;:::i;:::-;;;738:78;;;826:19;858:6;848:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;826:39;;876:154;892:1;883:5;:10;876:154;;920:1;910:11;;;;;:::i;:::-;;;987:2;979:5;:10;;;;:::i;:::-;966:2;:24;;;;:::i;:::-;953:39;;936:6;943;936:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1016:2;1007:11;;;;;:::i;:::-;;;876:154;;;1054:6;1040:21;;;;;346:723;;;;:::o;15928:157::-;16013:4;16052:25;16037:40;;;:11;:40;;;;16030:47;;15928:157;;;:::o;37973:574::-;38082:45;38109:4;38115:2;38119:7;38082:26;:45::i;:::-;38160:1;38144:18;;:4;:18;;;38140:197;;;38179:40;38211:7;38179:31;:40::i;:::-;38140:197;;;38259:2;38251:10;;:4;:10;;;38247:90;;38278:47;38311:4;38317:7;38278:32;:47::i;:::-;38247:90;38140:197;38365:1;38351:16;;:2;:16;;;38347:193;;;38384:45;38421:7;38384:36;:45::i;:::-;38347:193;;;38467:4;38461:10;;:2;:10;;;38457:83;;38488:40;38516:2;38520:7;38488:27;:40::i;:::-;38457:83;38347:193;37973:574;;;:::o;30047:321::-;30177:18;30183:2;30187:7;30177:5;:18::i;:::-;30228:54;30259:1;30263:2;30267:7;30276:5;30228:22;:54::i;:::-;30206:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30047:321;;;:::o;33447:799::-;33602:4;33623:15;:2;:13;;;:15::i;:::-;33619:620;;;33675:2;33659:36;;;33696:12;:10;:12::i;:::-;33710:4;33716:7;33725:5;33659:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33655:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33918:1;33901:6;:13;:18;33897:272;;;33944:60;;;;;;;;;;:::i;:::-;;;;;;;;33897:272;34119:6;34113:13;34104:6;34100:2;34096:15;34089:38;33655:529;33792:41;;;33782:51;;;:6;:51;;;;33775:58;;;;;33619:620;34223:4;34216:11;;33447:799;;;;;;;:::o;39270:164::-;39374:10;:17;;;;39347:15;:24;39363:7;39347:24;;;;;;;;;;;:44;;;;39402:10;39418:7;39402:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39270:164;:::o;40061:988::-;40327:22;40377:1;40352:22;40369:4;40352:16;:22::i;:::-;:26;;;;:::i;:::-;40327:51;;40389:18;40410:17;:26;40428:7;40410:26;;;;;;;;;;;;40389:47;;40557:14;40543:10;:28;40539:328;;40588:19;40610:12;:18;40623:4;40610:18;;;;;;;;;;;;;;;:34;40629:14;40610:34;;;;;;;;;;;;40588:56;;40694:11;40661:12;:18;40674:4;40661:18;;;;;;;;;;;;;;;:30;40680:10;40661:30;;;;;;;;;;;:44;;;;40811:10;40778:17;:30;40796:11;40778:30;;;;;;;;;;;:43;;;;40573:294;40539:328;40963:17;:26;40981:7;40963:26;;;;;;;;;;;40956:33;;;41007:12;:18;41020:4;41007:18;;;;;;;;;;;;;;;:34;41026:14;41007:34;;;;;;;;;;;41000:41;;;40142:907;;40061:988;;:::o;41344:1079::-;41597:22;41642:1;41622:10;:17;;;;:21;;;;:::i;:::-;41597:46;;41654:18;41675:15;:24;41691:7;41675:24;;;;;;;;;;;;41654:45;;42026:19;42048:10;42059:14;42048:26;;;;;;;;:::i;:::-;;;;;;;;;;42026:48;;42112:11;42087:10;42098;42087:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42223:10;42192:15;:28;42208:11;42192:28;;;;;;;;;;;:41;;;;42364:15;:24;42380:7;42364:24;;;;;;;;;;;42357:31;;;42399:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41415:1008;;;41344:1079;:::o;38848:221::-;38933:14;38950:20;38967:2;38950:16;:20::i;:::-;38933:37;;39008:7;38981:12;:16;38994:2;38981:16;;;;;;;;;;;;;;;:24;38998:6;38981:24;;;;;;;;;;;:34;;;;39055:6;39026:17;:26;39044:7;39026:26;;;;;;;;;;;:35;;;;38922:147;38848:221;;:::o;30704:382::-;30798:1;30784:16;;:2;:16;;;;30776:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30857:16;30865:7;30857;:16::i;:::-;30856:17;30848:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30919:45;30948:1;30952:2;30956:7;30919:20;:45::i;:::-;30994:1;30977:9;:13;30987:2;30977:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31025:2;31006:7;:16;31014:7;31006:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31070:7;31066:2;31045:33;;31062:1;31045:33;;;;;;;;;;;;30704:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:119;;;5932:79;;:::i;:::-;5894:119;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5804:468;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:119;;;6409:79;;:::i;:::-;6371:119;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6278:474;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:119;;;6897:79;;:::i;:::-;6859:119;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:117;;;7097:79;;:::i;:::-;7061:117;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6758:539;;;;:::o;7303:327::-;7361:6;7410:2;7398:9;7389:7;7385:23;7381:32;7378:119;;;7416:79;;:::i;:::-;7378:119;7536:1;7561:52;7605:7;7596:6;7585:9;7581:22;7561:52;:::i;:::-;7551:62;;7507:116;7303:327;;;;:::o;7636:349::-;7705:6;7754:2;7742:9;7733:7;7729:23;7725:32;7722:119;;;7760:79;;:::i;:::-;7722:119;7880:1;7905:63;7960:7;7951:6;7940:9;7936:22;7905:63;:::i;:::-;7895:73;;7851:127;7636:349;;;;:::o;7991:509::-;8060:6;8109:2;8097:9;8088:7;8084:23;8080:32;8077:119;;;8115:79;;:::i;:::-;8077:119;8263:1;8252:9;8248:17;8235:31;8293:18;8285:6;8282:30;8279:117;;;8315:79;;:::i;:::-;8279:117;8420:63;8475:7;8466:6;8455:9;8451:22;8420:63;:::i;:::-;8410:73;;8206:287;7991:509;;;;:::o;8506:329::-;8565:6;8614:2;8602:9;8593:7;8589:23;8585:32;8582:119;;;8620:79;;:::i;:::-;8582:119;8740:1;8765:53;8810:7;8801:6;8790:9;8786:22;8765:53;:::i;:::-;8755:63;;8711:117;8506:329;;;;:::o;8841:118::-;8928:24;8946:5;8928:24;:::i;:::-;8923:3;8916:37;8841:118;;:::o;8965:109::-;9046:21;9061:5;9046:21;:::i;:::-;9041:3;9034:34;8965:109;;:::o;9080:360::-;9166:3;9194:38;9226:5;9194:38;:::i;:::-;9248:70;9311:6;9306:3;9248:70;:::i;:::-;9241:77;;9327:52;9372:6;9367:3;9360:4;9353:5;9349:16;9327:52;:::i;:::-;9404:29;9426:6;9404:29;:::i;:::-;9399:3;9395:39;9388:46;;9170:270;9080:360;;;;:::o;9446:147::-;9541:45;9580:5;9541:45;:::i;:::-;9536:3;9529:58;9446:147;;:::o;9599:364::-;9687:3;9715:39;9748:5;9715:39;:::i;:::-;9770:71;9834:6;9829:3;9770:71;:::i;:::-;9763:78;;9850:52;9895:6;9890:3;9883:4;9876:5;9872:16;9850:52;:::i;:::-;9927:29;9949:6;9927:29;:::i;:::-;9922:3;9918:39;9911:46;;9691:272;9599:364;;;;:::o;9969:377::-;10075:3;10103:39;10136:5;10103:39;:::i;:::-;10158:89;10240:6;10235:3;10158:89;:::i;:::-;10151:96;;10256:52;10301:6;10296:3;10289:4;10282:5;10278:16;10256:52;:::i;:::-;10333:6;10328:3;10324:16;10317:23;;10079:267;9969:377;;;;:::o;10352:366::-;10494:3;10515:67;10579:2;10574:3;10515:67;:::i;:::-;10508:74;;10591:93;10680:3;10591:93;:::i;:::-;10709:2;10704:3;10700:12;10693:19;;10352:366;;;:::o;10724:::-;10866:3;10887:67;10951:2;10946:3;10887:67;:::i;:::-;10880:74;;10963:93;11052:3;10963:93;:::i;:::-;11081:2;11076:3;11072:12;11065:19;;10724:366;;;:::o;11096:::-;11238:3;11259:67;11323:2;11318:3;11259:67;:::i;:::-;11252:74;;11335:93;11424:3;11335:93;:::i;:::-;11453:2;11448:3;11444:12;11437:19;;11096:366;;;:::o;11468:::-;11610:3;11631:67;11695:2;11690:3;11631:67;:::i;:::-;11624:74;;11707:93;11796:3;11707:93;:::i;:::-;11825:2;11820:3;11816:12;11809:19;;11468:366;;;:::o;11840:::-;11982:3;12003:67;12067:2;12062:3;12003:67;:::i;:::-;11996:74;;12079:93;12168:3;12079:93;:::i;:::-;12197:2;12192:3;12188:12;12181:19;;11840:366;;;:::o;12212:::-;12354:3;12375:67;12439:2;12434:3;12375:67;:::i;:::-;12368:74;;12451:93;12540:3;12451:93;:::i;:::-;12569:2;12564:3;12560:12;12553:19;;12212:366;;;:::o;12584:::-;12726:3;12747:67;12811:2;12806:3;12747:67;:::i;:::-;12740:74;;12823:93;12912:3;12823:93;:::i;:::-;12941:2;12936:3;12932:12;12925:19;;12584:366;;;:::o;12956:::-;13098:3;13119:67;13183:2;13178:3;13119:67;:::i;:::-;13112:74;;13195:93;13284:3;13195:93;:::i;:::-;13313:2;13308:3;13304:12;13297:19;;12956:366;;;:::o;13328:::-;13470:3;13491:67;13555:2;13550:3;13491:67;:::i;:::-;13484:74;;13567:93;13656:3;13567:93;:::i;:::-;13685:2;13680:3;13676:12;13669:19;;13328:366;;;:::o;13700:::-;13842:3;13863:67;13927:2;13922:3;13863:67;:::i;:::-;13856:74;;13939:93;14028:3;13939:93;:::i;:::-;14057:2;14052:3;14048:12;14041:19;;13700:366;;;:::o;14072:::-;14214:3;14235:67;14299:2;14294:3;14235:67;:::i;:::-;14228:74;;14311:93;14400:3;14311:93;:::i;:::-;14429:2;14424:3;14420:12;14413:19;;14072:366;;;:::o;14444:::-;14586:3;14607:67;14671:2;14666:3;14607:67;:::i;:::-;14600:74;;14683:93;14772:3;14683:93;:::i;:::-;14801:2;14796:3;14792:12;14785:19;;14444:366;;;:::o;14816:::-;14958:3;14979:67;15043:2;15038:3;14979:67;:::i;:::-;14972:74;;15055:93;15144:3;15055:93;:::i;:::-;15173:2;15168:3;15164:12;15157:19;;14816:366;;;:::o;15188:::-;15330:3;15351:67;15415:2;15410:3;15351:67;:::i;:::-;15344:74;;15427:93;15516:3;15427:93;:::i;:::-;15545:2;15540:3;15536:12;15529:19;;15188:366;;;:::o;15560:::-;15702:3;15723:67;15787:2;15782:3;15723:67;:::i;:::-;15716:74;;15799:93;15888:3;15799:93;:::i;:::-;15917:2;15912:3;15908:12;15901:19;;15560:366;;;:::o;15932:::-;16074:3;16095:67;16159:2;16154:3;16095:67;:::i;:::-;16088:74;;16171:93;16260:3;16171:93;:::i;:::-;16289:2;16284:3;16280:12;16273:19;;15932:366;;;:::o;16304:::-;16446:3;16467:67;16531:2;16526:3;16467:67;:::i;:::-;16460:74;;16543:93;16632:3;16543:93;:::i;:::-;16661:2;16656:3;16652:12;16645:19;;16304:366;;;:::o;16676:::-;16818:3;16839:67;16903:2;16898:3;16839:67;:::i;:::-;16832:74;;16915:93;17004:3;16915:93;:::i;:::-;17033:2;17028:3;17024:12;17017:19;;16676:366;;;:::o;17048:400::-;17208:3;17229:84;17311:1;17306:3;17229:84;:::i;:::-;17222:91;;17322:93;17411:3;17322:93;:::i;:::-;17440:1;17435:3;17431:11;17424:18;;17048:400;;;:::o;17454:366::-;17596:3;17617:67;17681:2;17676:3;17617:67;:::i;:::-;17610:74;;17693:93;17782:3;17693:93;:::i;:::-;17811:2;17806:3;17802:12;17795:19;;17454:366;;;:::o;17826:::-;17968:3;17989:67;18053:2;18048:3;17989:67;:::i;:::-;17982:74;;18065:93;18154:3;18065:93;:::i;:::-;18183:2;18178:3;18174:12;18167:19;;17826:366;;;:::o;18198:::-;18340:3;18361:67;18425:2;18420:3;18361:67;:::i;:::-;18354:74;;18437:93;18526:3;18437:93;:::i;:::-;18555:2;18550:3;18546:12;18539:19;;18198:366;;;:::o;18570:::-;18712:3;18733:67;18797:2;18792:3;18733:67;:::i;:::-;18726:74;;18809:93;18898:3;18809:93;:::i;:::-;18927:2;18922:3;18918:12;18911:19;;18570:366;;;:::o;18942:::-;19084:3;19105:67;19169:2;19164:3;19105:67;:::i;:::-;19098:74;;19181:93;19270:3;19181:93;:::i;:::-;19299:2;19294:3;19290:12;19283:19;;18942:366;;;:::o;19314:398::-;19473:3;19494:83;19575:1;19570:3;19494:83;:::i;:::-;19487:90;;19586:93;19675:3;19586:93;:::i;:::-;19704:1;19699:3;19695:11;19688:18;;19314:398;;;:::o;19718:366::-;19860:3;19881:67;19945:2;19940:3;19881:67;:::i;:::-;19874:74;;19957:93;20046:3;19957:93;:::i;:::-;20075:2;20070:3;20066:12;20059:19;;19718:366;;;:::o;20090:::-;20232:3;20253:67;20317:2;20312:3;20253:67;:::i;:::-;20246:74;;20329:93;20418:3;20329:93;:::i;:::-;20447:2;20442:3;20438:12;20431:19;;20090:366;;;:::o;20462:118::-;20549:24;20567:5;20549:24;:::i;:::-;20544:3;20537:37;20462:118;;:::o;20586:701::-;20867:3;20889:95;20980:3;20971:6;20889:95;:::i;:::-;20882:102;;21001:95;21092:3;21083:6;21001:95;:::i;:::-;20994:102;;21113:148;21257:3;21113:148;:::i;:::-;21106:155;;21278:3;21271:10;;20586:701;;;;;:::o;21293:379::-;21477:3;21499:147;21642:3;21499:147;:::i;:::-;21492:154;;21663:3;21656:10;;21293:379;;;:::o;21678:222::-;21771:4;21809:2;21798:9;21794:18;21786:26;;21822:71;21890:1;21879:9;21875:17;21866:6;21822:71;:::i;:::-;21678:222;;;;:::o;21906:640::-;22101:4;22139:3;22128:9;22124:19;22116:27;;22153:71;22221:1;22210:9;22206:17;22197:6;22153:71;:::i;:::-;22234:72;22302:2;22291:9;22287:18;22278:6;22234:72;:::i;:::-;22316;22384:2;22373:9;22369:18;22360:6;22316:72;:::i;:::-;22435:9;22429:4;22425:20;22420:2;22409:9;22405:18;22398:48;22463:76;22534:4;22525:6;22463:76;:::i;:::-;22455:84;;21906:640;;;;;;;:::o;22552:210::-;22639:4;22677:2;22666:9;22662:18;22654:26;;22690:65;22752:1;22741:9;22737:17;22728:6;22690:65;:::i;:::-;22552:210;;;;:::o;22768:238::-;22869:4;22907:2;22896:9;22892:18;22884:26;;22920:79;22996:1;22985:9;22981:17;22972:6;22920:79;:::i;:::-;22768:238;;;;:::o;23012:313::-;23125:4;23163:2;23152:9;23148:18;23140:26;;23212:9;23206:4;23202:20;23198:1;23187:9;23183:17;23176:47;23240:78;23313:4;23304:6;23240:78;:::i;:::-;23232:86;;23012:313;;;;:::o;23331:419::-;23497:4;23535:2;23524:9;23520:18;23512:26;;23584:9;23578:4;23574:20;23570:1;23559:9;23555:17;23548:47;23612:131;23738:4;23612:131;:::i;:::-;23604:139;;23331:419;;;:::o;23756:::-;23922:4;23960:2;23949:9;23945:18;23937:26;;24009:9;24003:4;23999:20;23995:1;23984:9;23980:17;23973:47;24037:131;24163:4;24037:131;:::i;:::-;24029:139;;23756:419;;;:::o;24181:::-;24347:4;24385:2;24374:9;24370:18;24362:26;;24434:9;24428:4;24424:20;24420:1;24409:9;24405:17;24398:47;24462:131;24588:4;24462:131;:::i;:::-;24454:139;;24181:419;;;:::o;24606:::-;24772:4;24810:2;24799:9;24795:18;24787:26;;24859:9;24853:4;24849:20;24845:1;24834:9;24830:17;24823:47;24887:131;25013:4;24887:131;:::i;:::-;24879:139;;24606:419;;;:::o;25031:::-;25197:4;25235:2;25224:9;25220:18;25212:26;;25284:9;25278:4;25274:20;25270:1;25259:9;25255:17;25248:47;25312:131;25438:4;25312:131;:::i;:::-;25304:139;;25031:419;;;:::o;25456:::-;25622:4;25660:2;25649:9;25645:18;25637:26;;25709:9;25703:4;25699:20;25695:1;25684:9;25680:17;25673:47;25737:131;25863:4;25737:131;:::i;:::-;25729:139;;25456:419;;;:::o;25881:::-;26047:4;26085:2;26074:9;26070:18;26062:26;;26134:9;26128:4;26124:20;26120:1;26109:9;26105:17;26098:47;26162:131;26288:4;26162:131;:::i;:::-;26154:139;;25881:419;;;:::o;26306:::-;26472:4;26510:2;26499:9;26495:18;26487:26;;26559:9;26553:4;26549:20;26545:1;26534:9;26530:17;26523:47;26587:131;26713:4;26587:131;:::i;:::-;26579:139;;26306:419;;;:::o;26731:::-;26897:4;26935:2;26924:9;26920:18;26912:26;;26984:9;26978:4;26974:20;26970:1;26959:9;26955:17;26948:47;27012:131;27138:4;27012:131;:::i;:::-;27004:139;;26731:419;;;:::o;27156:::-;27322:4;27360:2;27349:9;27345:18;27337:26;;27409:9;27403:4;27399:20;27395:1;27384:9;27380:17;27373:47;27437:131;27563:4;27437:131;:::i;:::-;27429:139;;27156:419;;;:::o;27581:::-;27747:4;27785:2;27774:9;27770:18;27762:26;;27834:9;27828:4;27824:20;27820:1;27809:9;27805:17;27798:47;27862:131;27988:4;27862:131;:::i;:::-;27854:139;;27581:419;;;:::o;28006:::-;28172:4;28210:2;28199:9;28195:18;28187:26;;28259:9;28253:4;28249:20;28245:1;28234:9;28230:17;28223:47;28287:131;28413:4;28287:131;:::i;:::-;28279:139;;28006:419;;;:::o;28431:::-;28597:4;28635:2;28624:9;28620:18;28612:26;;28684:9;28678:4;28674:20;28670:1;28659:9;28655:17;28648:47;28712:131;28838:4;28712:131;:::i;:::-;28704:139;;28431:419;;;:::o;28856:::-;29022:4;29060:2;29049:9;29045:18;29037:26;;29109:9;29103:4;29099:20;29095:1;29084:9;29080:17;29073:47;29137:131;29263:4;29137:131;:::i;:::-;29129:139;;28856:419;;;:::o;29281:::-;29447:4;29485:2;29474:9;29470:18;29462:26;;29534:9;29528:4;29524:20;29520:1;29509:9;29505:17;29498:47;29562:131;29688:4;29562:131;:::i;:::-;29554:139;;29281:419;;;:::o;29706:::-;29872:4;29910:2;29899:9;29895:18;29887:26;;29959:9;29953:4;29949:20;29945:1;29934:9;29930:17;29923:47;29987:131;30113:4;29987:131;:::i;:::-;29979:139;;29706:419;;;:::o;30131:::-;30297:4;30335:2;30324:9;30320:18;30312:26;;30384:9;30378:4;30374:20;30370:1;30359:9;30355:17;30348:47;30412:131;30538:4;30412:131;:::i;:::-;30404:139;;30131:419;;;:::o;30556:::-;30722:4;30760:2;30749:9;30745:18;30737:26;;30809:9;30803:4;30799:20;30795:1;30784:9;30780:17;30773:47;30837:131;30963:4;30837:131;:::i;:::-;30829:139;;30556:419;;;:::o;30981:::-;31147:4;31185:2;31174:9;31170:18;31162:26;;31234:9;31228:4;31224:20;31220:1;31209:9;31205:17;31198:47;31262:131;31388:4;31262:131;:::i;:::-;31254:139;;30981:419;;;:::o;31406:::-;31572:4;31610:2;31599:9;31595:18;31587:26;;31659:9;31653:4;31649:20;31645:1;31634:9;31630:17;31623:47;31687:131;31813:4;31687:131;:::i;:::-;31679:139;;31406:419;;;:::o;31831:::-;31997:4;32035:2;32024:9;32020:18;32012:26;;32084:9;32078:4;32074:20;32070:1;32059:9;32055:17;32048:47;32112:131;32238:4;32112:131;:::i;:::-;32104:139;;31831:419;;;:::o;32256:::-;32422:4;32460:2;32449:9;32445:18;32437:26;;32509:9;32503:4;32499:20;32495:1;32484:9;32480:17;32473:47;32537:131;32663:4;32537:131;:::i;:::-;32529:139;;32256:419;;;:::o;32681:::-;32847:4;32885:2;32874:9;32870:18;32862:26;;32934:9;32928:4;32924:20;32920:1;32909:9;32905:17;32898:47;32962:131;33088:4;32962:131;:::i;:::-;32954:139;;32681:419;;;:::o;33106:::-;33272:4;33310:2;33299:9;33295:18;33287:26;;33359:9;33353:4;33349:20;33345:1;33334:9;33330:17;33323:47;33387:131;33513:4;33387:131;:::i;:::-;33379:139;;33106:419;;;:::o;33531:::-;33697:4;33735:2;33724:9;33720:18;33712:26;;33784:9;33778:4;33774:20;33770:1;33759:9;33755:17;33748:47;33812:131;33938:4;33812:131;:::i;:::-;33804:139;;33531:419;;;:::o;33956:222::-;34049:4;34087:2;34076:9;34072:18;34064:26;;34100:71;34168:1;34157:9;34153:17;34144:6;34100:71;:::i;:::-;33956:222;;;;:::o;34184:129::-;34218:6;34245:20;;:::i;:::-;34235:30;;34274:33;34302:4;34294:6;34274:33;:::i;:::-;34184:129;;;:::o;34319:75::-;34352:6;34385:2;34379:9;34369:19;;34319:75;:::o;34400:311::-;34477:4;34567:18;34559:6;34556:30;34553:56;;;34589:18;;:::i;:::-;34553:56;34639:4;34631:6;34627:17;34619:25;;34699:4;34693;34689:15;34681:23;;34400:311;;;:::o;34717:307::-;34778:4;34868:18;34860:6;34857:30;34854:56;;;34890:18;;:::i;:::-;34854:56;34928:29;34950:6;34928:29;:::i;:::-;34920:37;;35012:4;35006;35002:15;34994:23;;34717:307;;;:::o;35030:308::-;35092:4;35182:18;35174:6;35171:30;35168:56;;;35204:18;;:::i;:::-;35168:56;35242:29;35264:6;35242:29;:::i;:::-;35234:37;;35326:4;35320;35316:15;35308:23;;35030:308;;;:::o;35344:98::-;35395:6;35429:5;35423:12;35413:22;;35344:98;;;:::o;35448:99::-;35500:6;35534:5;35528:12;35518:22;;35448:99;;;:::o;35553:168::-;35636:11;35670:6;35665:3;35658:19;35710:4;35705:3;35701:14;35686:29;;35553:168;;;;:::o;35727:147::-;35828:11;35865:3;35850:18;;35727:147;;;;:::o;35880:169::-;35964:11;35998:6;35993:3;35986:19;36038:4;36033:3;36029:14;36014:29;;35880:169;;;;:::o;36055:148::-;36157:11;36194:3;36179:18;;36055:148;;;;:::o;36209:305::-;36249:3;36268:20;36286:1;36268:20;:::i;:::-;36263:25;;36302:20;36320:1;36302:20;:::i;:::-;36297:25;;36456:1;36388:66;36384:74;36381:1;36378:81;36375:107;;;36462:18;;:::i;:::-;36375:107;36506:1;36503;36499:9;36492:16;;36209:305;;;;:::o;36520:185::-;36560:1;36577:20;36595:1;36577:20;:::i;:::-;36572:25;;36611:20;36629:1;36611:20;:::i;:::-;36606:25;;36650:1;36640:35;;36655:18;;:::i;:::-;36640:35;36697:1;36694;36690:9;36685:14;;36520:185;;;;:::o;36711:348::-;36751:7;36774:20;36792:1;36774:20;:::i;:::-;36769:25;;36808:20;36826:1;36808:20;:::i;:::-;36803:25;;36996:1;36928:66;36924:74;36921:1;36918:81;36913:1;36906:9;36899:17;36895:105;36892:131;;;37003:18;;:::i;:::-;36892:131;37051:1;37048;37044:9;37033:20;;36711:348;;;;:::o;37065:191::-;37105:4;37125:20;37143:1;37125:20;:::i;:::-;37120:25;;37159:20;37177:1;37159:20;:::i;:::-;37154:25;;37198:1;37195;37192:8;37189:34;;;37203:18;;:::i;:::-;37189:34;37248:1;37245;37241:9;37233:17;;37065:191;;;;:::o;37262:96::-;37299:7;37328:24;37346:5;37328:24;:::i;:::-;37317:35;;37262:96;;;:::o;37364:90::-;37398:7;37441:5;37434:13;37427:21;37416:32;;37364:90;;;:::o;37460:149::-;37496:7;37536:66;37529:5;37525:78;37514:89;;37460:149;;;:::o;37615:131::-;37662:7;37691:5;37680:16;;37697:43;37734:5;37697:43;:::i;:::-;37615:131;;;:::o;37752:126::-;37789:7;37829:42;37822:5;37818:54;37807:65;;37752:126;;;:::o;37884:77::-;37921:7;37950:5;37939:16;;37884:77;;;:::o;37967:131::-;38025:9;38058:34;38086:5;38058:34;:::i;:::-;38045:47;;37967:131;;;:::o;38104:154::-;38188:6;38183:3;38178;38165:30;38250:1;38241:6;38236:3;38232:16;38225:27;38104:154;;;:::o;38264:307::-;38332:1;38342:113;38356:6;38353:1;38350:13;38342:113;;;38441:1;38436:3;38432:11;38426:18;38422:1;38417:3;38413:11;38406:39;38378:2;38375:1;38371:10;38366:15;;38342:113;;;38473:6;38470:1;38467:13;38464:101;;;38553:1;38544:6;38539:3;38535:16;38528:27;38464:101;38313:258;38264:307;;;:::o;38577:320::-;38621:6;38658:1;38652:4;38648:12;38638:22;;38705:1;38699:4;38695:12;38726:18;38716:81;;38782:4;38774:6;38770:17;38760:27;;38716:81;38844:2;38836:6;38833:14;38813:18;38810:38;38807:84;;;38863:18;;:::i;:::-;38807:84;38628:269;38577:320;;;:::o;38903:281::-;38986:27;39008:4;38986:27;:::i;:::-;38978:6;38974:40;39116:6;39104:10;39101:22;39080:18;39068:10;39065:34;39062:62;39059:88;;;39127:18;;:::i;:::-;39059:88;39167:10;39163:2;39156:22;38946:238;38903:281;;:::o;39190:233::-;39229:3;39252:24;39270:5;39252:24;:::i;:::-;39243:33;;39298:66;39291:5;39288:77;39285:103;;;39368:18;;:::i;:::-;39285:103;39415:1;39408:5;39404:13;39397:20;;39190:233;;;:::o;39429:176::-;39461:1;39478:20;39496:1;39478:20;:::i;:::-;39473:25;;39512:20;39530:1;39512:20;:::i;:::-;39507:25;;39551:1;39541:35;;39556:18;;:::i;:::-;39541:35;39597:1;39594;39590:9;39585:14;;39429:176;;;;:::o;39611:180::-;39659:77;39656:1;39649:88;39756:4;39753:1;39746:15;39780:4;39777:1;39770:15;39797:180;39845:77;39842:1;39835:88;39942:4;39939:1;39932:15;39966:4;39963:1;39956:15;39983:180;40031:77;40028:1;40021:88;40128:4;40125:1;40118:15;40152:4;40149:1;40142:15;40169:180;40217:77;40214:1;40207:88;40314:4;40311:1;40304:15;40338:4;40335:1;40328:15;40355:180;40403:77;40400:1;40393:88;40500:4;40497:1;40490:15;40524:4;40521:1;40514:15;40541:180;40589:77;40586:1;40579:88;40686:4;40683:1;40676:15;40710:4;40707:1;40700:15;40727:180;40775:77;40772:1;40765:88;40872:4;40869:1;40862:15;40896:4;40893:1;40886:15;40913:117;41022:1;41019;41012:12;41036:117;41145:1;41142;41135:12;41159:117;41268:1;41265;41258:12;41282:117;41391:1;41388;41381:12;41405:117;41514:1;41511;41504:12;41528:102;41569:6;41620:2;41616:7;41611:2;41604:5;41600:14;41596:28;41586:38;;41528:102;;;:::o;41636:180::-;41776:32;41772:1;41764:6;41760:14;41753:56;41636:180;:::o;41822:176::-;41962:28;41958:1;41950:6;41946:14;41939:52;41822:176;:::o;42004:230::-;42144:34;42140:1;42132:6;42128:14;42121:58;42213:13;42208:2;42200:6;42196:15;42189:38;42004:230;:::o;42240:237::-;42380:34;42376:1;42368:6;42364:14;42357:58;42449:20;42444:2;42436:6;42432:15;42425:45;42240:237;:::o;42483:225::-;42623:34;42619:1;42611:6;42607:14;42600:58;42692:8;42687:2;42679:6;42675:15;42668:33;42483:225;:::o;42714:178::-;42854:30;42850:1;42842:6;42838:14;42831:54;42714:178;:::o;42898:170::-;43038:22;43034:1;43026:6;43022:14;43015:46;42898:170;:::o;43074:223::-;43214:34;43210:1;43202:6;43198:14;43191:58;43283:6;43278:2;43270:6;43266:15;43259:31;43074:223;:::o;43303:175::-;43443:27;43439:1;43431:6;43427:14;43420:51;43303:175;:::o;43484:170::-;43624:22;43620:1;43612:6;43608:14;43601:46;43484:170;:::o;43660:231::-;43800:34;43796:1;43788:6;43784:14;43777:58;43869:14;43864:2;43856:6;43852:15;43845:39;43660:231;:::o;43897:243::-;44037:34;44033:1;44025:6;44021:14;44014:58;44106:26;44101:2;44093:6;44089:15;44082:51;43897:243;:::o;44146:234::-;44286:34;44282:1;44274:6;44270:14;44263:58;44355:17;44350:2;44342:6;44338:15;44331:42;44146:234;:::o;44386:229::-;44526:34;44522:1;44514:6;44510:14;44503:58;44595:12;44590:2;44582:6;44578:15;44571:37;44386:229;:::o;44621:228::-;44761:34;44757:1;44749:6;44745:14;44738:58;44830:11;44825:2;44817:6;44813:15;44806:36;44621:228;:::o;44855:221::-;44995:34;44991:1;44983:6;44979:14;44972:58;45064:4;45059:2;45051:6;45047:15;45040:29;44855:221;:::o;45082:182::-;45222:34;45218:1;45210:6;45206:14;45199:58;45082:182;:::o;45270:231::-;45410:34;45406:1;45398:6;45394:14;45387:58;45479:14;45474:2;45466:6;45462:15;45455:39;45270:231;:::o;45507:155::-;45647:7;45643:1;45635:6;45631:14;45624:31;45507:155;:::o;45668:182::-;45808:34;45804:1;45796:6;45792:14;45785:58;45668:182;:::o;45856:171::-;45996:23;45992:1;45984:6;45980:14;45973:47;45856:171;:::o;46033:228::-;46173:34;46169:1;46161:6;46157:14;46150:58;46242:11;46237:2;46229:6;46225:15;46218:36;46033:228;:::o;46267:234::-;46407:34;46403:1;46395:6;46391:14;46384:58;46476:17;46471:2;46463:6;46459:15;46452:42;46267:234;:::o;46507:220::-;46647:34;46643:1;46635:6;46631:14;46624:58;46716:3;46711:2;46703:6;46699:15;46692:28;46507:220;:::o;46733:114::-;;:::o;46853:236::-;46993:34;46989:1;46981:6;46977:14;46970:58;47062:19;47057:2;47049:6;47045:15;47038:44;46853:236;:::o;47095:231::-;47235:34;47231:1;47223:6;47219:14;47212:58;47304:14;47299:2;47291:6;47287:15;47280:39;47095:231;:::o;47332:115::-;47415:1;47408:5;47405:12;47395:46;;47421:18;;:::i;:::-;47395:46;47332:115;:::o;47453:122::-;47526:24;47544:5;47526:24;:::i;:::-;47519:5;47516:35;47506:63;;47565:1;47562;47555:12;47506:63;47453:122;:::o;47581:116::-;47651:21;47666:5;47651:21;:::i;:::-;47644:5;47641:32;47631:60;;47687:1;47684;47677:12;47631:60;47581:116;:::o;47703:120::-;47775:23;47792:5;47775:23;:::i;:::-;47768:5;47765:34;47755:62;;47813:1;47810;47803:12;47755:62;47703:120;:::o;47829:122::-;47902:24;47920:5;47902:24;:::i;:::-;47895:5;47892:35;47882:63;;47941:1;47938;47931:12;47882:63;47829:122;:::o
Swarm Source
ipfs://00175fbed61a0d15301ca37200b84317d2eafdeb0f860870c330f95dcfea399d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.