ERC-721
NFT
Overview
Max Total Supply
0 HDPUNKS
Holders
1,176
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 HDPUNKSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
HDPunks
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-29 */ // SPDX-License-Identifier: GPL-3.0 /** Created with <3 by https://twitter.com/0xfoobar and mar3k # # ###### ###### # # # # # # ##### # # # # # # # # ## # # # # # # # # # # # # # # # # # # # ####### # # ###### # # # # # ### ##### # # # # # # # # # # # # # # # # # # # # # ## # # # # # # ###### # ##### # # # # ##### https://hdpunks.com */ // 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/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/HDPunks.sol pragma solidity ^0.8.0; interface PunksContract { function balanceOf(address) external view returns (uint256); function punkIndexToAddress(uint256) external view returns (address); } interface WrapperContract { function balanceOf(address) external view returns (uint256); function ownerOf(uint256) external view returns (address); } interface IERC20 { function balanceOf(address) external view returns (uint); function transfer(address, uint) external returns (bool); } contract HDPunks is Ownable, ERC721 { event Mint(address indexed to, uint indexed _punkId); PunksContract public PUNKS = PunksContract(0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB); WrapperContract public WRAPPER = WrapperContract(0xb7F7F6C52F2e2fdb1963Eab30438024864c313F6); uint public constant TOKEN_LIMIT = 10000; uint public numTokens = 0; uint public _mintFee = 0.08 ether; bool public _publicMinting = false; string public _baseTokenURI; string public imageHash; // MD5 hash of the megaimage (100k x 100k pixels) containing 10000 punks // Random index assignment uint internal nonce = 0; uint[TOKEN_LIMIT] internal indices; constructor() payable ERC721("HD Punks", "HDPUNKS") {} /** * @dev Mint several HD Punks in a single transaction. Used in presale minting. */ function mintMany(uint[] calldata _punkIds, address to) external payable { // Take mint fee require(msg.value >= _punkIds.length * mintFee() || to == owner(), "Please include mint fee"); for (uint i = 0; i < _punkIds.length; i++) { _mint(_punkIds[i], to, true); } } /** * @dev Mint one HD Punk, same functionality as mintMany. Used in presale minting. */ function mint(uint _punkId, address to) external payable { // Take mint fee require(msg.value >= mintFee() || to == owner(), "Please include mint fee"); _mint(_punkId, to, true); } /** * @dev Mint `quantity` HDPunks, but chosen randomly. Used in public minting. */ function mintRandom(address to, uint quantity) external payable { require(_publicMinting || to == owner(), "Wait for public minting"); require(msg.sender == tx.origin, "No funny business"); require(msg.value >= quantity * mintFee() || to == owner(), "Please include mint fee"); // TODO: Check that randomness works well for (uint i = 0; i < quantity; i++) { _mint(randomIndex(), msg.sender, false); } } /** * @dev Checks validity of the mint, but not the mint fee. */ function _mint(uint _punkId, address to, bool requireIsOwner) internal { // Check if token already exists require(!_exists(_punkId), "HDPunk already minted"); overwriteIndex(_punkId); if (requireIsOwner) { address punkOwner = PUNKS.punkIndexToAddress(_punkId); if (punkOwner == address(WRAPPER)) { punkOwner = WRAPPER.ownerOf(_punkId); } require(to == punkOwner || to == owner(), "Only the owner can mint"); } else { require(_publicMinting || to == owner(), "Public minting not open"); } _mint(to, _punkId); numTokens += 1; emit Mint(to, _punkId); } function randomIndex() internal view returns (uint) { uint totalSize = TOKEN_LIMIT - numTokens; uint index = uint(keccak256(abi.encodePacked(nonce, msg.sender, block.difficulty, block.timestamp))) % totalSize; uint value = 0; if (indices[index] != 0) { value = indices[index]; // If index taken, see what it points to } else { value = index; } // Use zero-indexing return value; } function overwriteIndex(uint index) internal { uint totalSize = TOKEN_LIMIT - numTokens; // Move last value to selected position if (indices[totalSize - 1] == 0) { // Array position not initialized, so use position indices[index] = totalSize - 1; } else { // Array position holds a value so use that indices[index] = indices[totalSize - 1]; } nonce += 1; } /** * @dev Returns the current minting fee */ function mintFee() public view returns (uint) { return _mintFee; } function setMintFee(uint256 __mintFee) public onlyOwner { _mintFee = __mintFee; } /** * @dev Withdraw the contract balance to the dev address */ function withdraw() public { uint amount = address(this).balance; (bool success,) = owner().call{value: amount}(""); require(success, "Failed to send ether"); } /** * @dev Withdraw ERC20 tokens from the contract */ function withdrawFungible(address _tokenContract) public { IERC20 token = IERC20(_tokenContract); uint256 amount = token.balanceOf(address(this)); token.transfer(owner(), amount); } /** * @dev Withdraw ERC721 tokens from the contract */ function withdrawNonFungible(address _tokenContract, uint256 _tokenId) public { IERC721(_tokenContract).transferFrom(address(this), owner(), _tokenId); } /** * @dev Returns a URI for a given token ID's metadata */ function tokenURI(uint256 _tokenId) public view override returns (string memory) { return string(abi.encodePacked(_baseTokenURI, Strings.toString(_tokenId))); } /** * @dev Updates the base token URI for the metadata */ function setBaseTokenURI(string memory __baseTokenURI) public onlyOwner { _baseTokenURI = __baseTokenURI; } /** * @dev Turn public minting on or off */ function setPublicMinting(bool _val) public onlyOwner { _publicMinting = _val; } /** * @dev Set image hash */ function setImageHash(string memory _imageHash) public onlyOwner { imageHash = _imageHash; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","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":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_punkId","type":"uint256"}],"name":"Mint","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":"PUNKS","outputs":[{"internalType":"contract PunksContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WRAPPER","outputs":[{"internalType":"contract WrapperContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_publicMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"imageHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_punkId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_punkIds","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"mintMany","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintRandom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_imageHash","type":"string"}],"name":"setImageHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__mintFee","type":"uint256"}],"name":"setMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_val","type":"bool"}],"name":"setPublicMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"withdrawFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawNonFungible","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405273b47e3cd837ddf8e4c57f05d70ab865de6e193bbb600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b7f7f6c52f2e2fdb1963eab30438024864c313f6600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060095567011c37937e080000600a556000600b60006101000a81548160ff0219169083151502179055506000600e556040518060400160405280600881526020017f48442050756e6b730000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f484450554e4b530000000000000000000000000000000000000000000000000081525060006200015d6200023560201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508160019080519060200190620002139291906200023d565b5080600290805190602001906200022c9291906200023d565b50505062000352565b600033905090565b8280546200024b90620002ed565b90600052602060002090601f0160209004810192826200026f5760008555620002bb565b82601f106200028a57805160ff1916838001178555620002bb565b82800160010185558215620002bb579182015b82811115620002ba5782518255916020019190600101906200029d565b5b509050620002ca9190620002ce565b5090565b5b80821115620002e9576000816000905550600101620002cf565b5090565b600060028204905060018216806200030657607f821691505b602082108114156200031d576200031c62000323565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61472480620003626000396000f3fe6080604052600436106102045760003560e01c806370a0823111610118578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610706578063eddd0d9c14610743578063f2a08abb1461076c578063f2fde38b14610797578063f7a7c265146107c057610204565b8063b88d4fde1461064a578063c87b56dd14610673578063cfc86f7b146106b0578063e1eb13c1146106db57610204565b80638e499bcf116100e75780638e499bcf1461058457806394bf804d146105af57806394c55587146105cb57806395d89b41146105f6578063a22cb4651461062157610204565b806370a08231146104e9578063715018a614610526578063798c35b71461053d5780638da5cb5b1461055957610204565b8063254a47371161019b5780633ccfd60b1161016a5780633ccfd60b1461041857806342842e0e1461042f57806351605d80146104585780635da8f662146104835780636352211e146104ac57610204565b8063254a47371461037f57806330176e13146103a857806330da111a146103d157806332034d27146103fc57610204565b8063081812fc116101d7578063081812fc146102c5578063095ea7b31461030257806313966db51461032b57806323b872dd1461035657610204565b806301ffc9a714610209578063031bd4c41461024657806304299b2a1461027157806306fdde031461029a575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613208565b6107e9565b60405161023d9190613937565b60405180910390f35b34801561025257600080fd5b5061025b6108cb565b6040516102689190613c6a565b60405180910390f35b34801561027d57600080fd5b506102986004803603810190610293919061325a565b6108d1565b005b3480156102a657600080fd5b506102af610967565b6040516102bc9190613988565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e7919061329b565b6109f9565b6040516102f99190613870565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190613122565b610a7e565b005b34801561033757600080fd5b50610340610b96565b60405161034d9190613c6a565b60405180910390f35b34801561036257600080fd5b5061037d6004803603810190610378919061301c565b610ba0565b005b34801561038b57600080fd5b506103a660048036038101906103a191906131b6565b610c00565b005b3480156103b457600080fd5b506103cf60048036038101906103ca919061325a565b610c99565b005b3480156103dd57600080fd5b506103e6610d2f565b6040516103f39190613952565b60405180910390f35b61041660048036038101906104119190613122565b610d55565b005b34801561042457600080fd5b5061042d610f17565b005b34801561043b57600080fd5b506104566004803603810190610451919061301c565b610fd3565b005b34801561046457600080fd5b5061046d610ff3565b60405161047a9190613988565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613122565b611081565b005b3480156104b857600080fd5b506104d360048036038101906104ce919061329b565b6110fb565b6040516104e09190613870565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b9190612f8e565b6111ad565b60405161051d9190613c6a565b60405180910390f35b34801561053257600080fd5b5061053b611265565b005b6105576004803603810190610552919061315e565b61139f565b005b34801561056557600080fd5b5061056e6114a6565b60405161057b9190613870565b60405180910390f35b34801561059057600080fd5b506105996114cf565b6040516105a69190613c6a565b60405180910390f35b6105c960048036038101906105c491906132ed565b6114d5565b005b3480156105d757600080fd5b506105e061156c565b6040516105ed9190613937565b60405180910390f35b34801561060257600080fd5b5061060b61157f565b6040516106189190613988565b60405180910390f35b34801561062d57600080fd5b50610648600480360381019061064391906130e6565b611611565b005b34801561065657600080fd5b50610671600480360381019061066c919061306b565b611792565b005b34801561067f57600080fd5b5061069a6004803603810190610695919061329b565b6117f4565b6040516106a79190613988565b60405180910390f35b3480156106bc57600080fd5b506106c5611828565b6040516106d29190613988565b60405180910390f35b3480156106e757600080fd5b506106f06118b6565b6040516106fd919061396d565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190612fe0565b6118dc565b60405161073a9190613937565b60405180910390f35b34801561074f57600080fd5b5061076a6004803603810190610765919061329b565b611970565b005b34801561077857600080fd5b506107816119f6565b60405161078e9190613c6a565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b99190612f8e565b6119fc565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190612f8e565b611ba5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c457506108c382611cd1565b5b9050919050565b61271081565b6108d9611d3b565b73ffffffffffffffffffffffffffffffffffffffff166108f76114a6565b73ffffffffffffffffffffffffffffffffffffffff161461094d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094490613b8a565b60405180910390fd5b80600d9080519060200190610963929190612d29565b5050565b60606001805461097690613f82565b80601f01602080910402602001604051908101604052809291908181526020018280546109a290613f82565b80156109ef5780601f106109c4576101008083540402835291602001916109ef565b820191906000526020600020905b8154815290600101906020018083116109d257829003601f168201915b5050505050905090565b6000610a0482611d43565b610a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3a90613b6a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a89826110fb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190613bea565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b19611d3b565b73ffffffffffffffffffffffffffffffffffffffff161480610b485750610b4781610b42611d3b565b6118dc565b5b610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90613aea565b60405180910390fd5b610b918383611daf565b505050565b6000600a54905090565b610bb1610bab611d3b565b82611e68565b610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be790613c0a565b60405180910390fd5b610bfb838383611f46565b505050565b610c08611d3b565b73ffffffffffffffffffffffffffffffffffffffff16610c266114a6565b73ffffffffffffffffffffffffffffffffffffffff1614610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390613b8a565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b610ca1611d3b565b73ffffffffffffffffffffffffffffffffffffffff16610cbf6114a6565b73ffffffffffffffffffffffffffffffffffffffff1614610d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0c90613b8a565b60405180910390fd5b80600c9080519060200190610d2b929190612d29565b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900460ff1680610da25750610d736114a6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd890613aaa565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4690613c4a565b60405180910390fd5b610e57610b96565b81610e629190613df6565b34101580610ea25750610e736114a6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed8906139ca565b60405180910390fd5b60005b81811015610f1257610eff610ef76121a2565b33600061228e565b8080610f0a90613fe5565b915050610ee4565b505050565b60004790506000610f266114a6565b73ffffffffffffffffffffffffffffffffffffffff1682604051610f499061380d565b60006040518083038185875af1925050503d8060008114610f86576040519150601f19603f3d011682016040523d82523d6000602084013e610f8b565b606091505b5050905080610fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc690613baa565b60405180910390fd5b5050565b610fee83838360405180602001604052806000815250611792565b505050565b600d805461100090613f82565b80601f016020809104026020016040519081016040528092919081815260200182805461102c90613f82565b80156110795780601f1061104e57610100808354040283529160200191611079565b820191906000526020600020905b81548152906001019060200180831161105c57829003601f168201915b505050505081565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd306110a66114a6565b846040518463ffffffff1660e01b81526004016110c59392919061388b565b600060405180830381600087803b1580156110df57600080fd5b505af11580156110f3573d6000803e3d6000fd5b505050505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119b90613b2a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590613b0a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61126d611d3b565b73ffffffffffffffffffffffffffffffffffffffff1661128b6114a6565b73ffffffffffffffffffffffffffffffffffffffff16146112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890613b8a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113a7610b96565b838390506113b59190613df6565b341015806113f557506113c66114a6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142b906139ca565b60405180910390fd5b60005b838390508110156114a05761148d84848381811061147e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013583600161228e565b808061149890613fe5565b915050611437565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095481565b6114dd610b96565b3410158061151d57506114ee6114a6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61155c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611553906139ca565b60405180910390fd5b6115688282600161228e565b5050565b600b60009054906101000a900460ff1681565b60606002805461158e90613f82565b80601f01602080910402602001604051908101604052809291908181526020018280546115ba90613f82565b80156116075780601f106115dc57610100808354040283529160200191611607565b820191906000526020600020905b8154815290600101906020018083116115ea57829003601f168201915b5050505050905090565b611619611d3b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90613a8a565b60405180910390fd5b8060066000611694611d3b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611741611d3b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117869190613937565b60405180910390a35050565b6117a361179d611d3b565b83611e68565b6117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d990613c0a565b60405180910390fd5b6117ee84848484612644565b50505050565b6060600c611801836126a0565b6040516020016118129291906137e9565b6040516020818303038152906040529050919050565b600c805461183590613f82565b80601f016020809104026020016040519081016040528092919081815260200182805461186190613f82565b80156118ae5780601f10611883576101008083540402835291602001916118ae565b820191906000526020600020905b81548152906001019060200180831161189157829003601f168201915b505050505081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611978611d3b565b73ffffffffffffffffffffffffffffffffffffffff166119966114a6565b73ffffffffffffffffffffffffffffffffffffffff16146119ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e390613b8a565b60405180910390fd5b80600a8190555050565b600a5481565b611a04611d3b565b73ffffffffffffffffffffffffffffffffffffffff16611a226114a6565b73ffffffffffffffffffffffffffffffffffffffff1614611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f90613b8a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf90613a0a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611be59190613870565b60206040518083038186803b158015611bfd57600080fd5b505afa158015611c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3591906132c4565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611c5b6114a6565b836040518363ffffffff1660e01b8152600401611c7992919061390e565b602060405180830381600087803b158015611c9357600080fd5b505af1158015611ca7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccb91906131df565b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e22836110fb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e7382611d43565b611eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea990613aca565b60405180910390fd5b6000611ebd836110fb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f2c57508373ffffffffffffffffffffffffffffffffffffffff16611f14846109f9565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f3d5750611f3c81856118dc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f66826110fb565b73ffffffffffffffffffffffffffffffffffffffff1614611fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb390613bca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561202c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202390613a6a565b60405180910390fd5b61203783838361284d565b612042600082611daf565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120929190613e50565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e99190613d6f565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000806009546127106121b59190613e50565b9050600081600e543344426040516020016121d39493929190613822565b6040516020818303038152906040528051906020012060001c6121f6919061405c565b9050600080600f836127108110612236577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01541461228157600f826127108110612278577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01549050612285565b8190505b80935050505090565b61229783611d43565b156122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ce90613c2a565b60405180910390fd5b6122e083612852565b801561254a576000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166358178168856040518263ffffffff1660e01b81526004016123439190613c6a565b60206040518083038186803b15801561235b57600080fd5b505afa15801561236f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123939190612fb7565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561249957600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016124469190613c6a565b60206040518083038186803b15801561245e57600080fd5b505afa158015612472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124969190612fb7565b90505b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061250557506124d66114a6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b612544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253b906139aa565b60405180910390fd5b506125d7565b600b60009054906101000a900460ff168061259757506125686114a6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6125d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cd90613a4a565b60405180910390fd5b5b6125e182846129b1565b6001600960008282546125f49190613d6f565b92505081905550828273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a3505050565b61264f848484611f46565b61265b84848484612b7f565b61269a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612691906139ea565b60405180910390fd5b50505050565b606060008214156126e8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612848565b600082905060005b6000821461271a57808061270390613fe5565b915050600a826127139190613dc5565b91506126f0565b60008167ffffffffffffffff81111561275c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561278e5781602001600182028036833780820191505090505b5090505b60008514612841576001826127a79190613e50565b9150600a856127b6919061405c565b60306127c29190613d6f565b60f81b8183815181106127fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561283a9190613dc5565b9450612792565b8093505050505b919050565b505050565b60006009546127106128649190613e50565b90506000600f6001836128779190613e50565b61271081106128af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01541415612909576001816128c49190613e50565b600f8361271081106128ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0181905550612993565b600f6001826129189190613e50565b6127108110612950577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154600f83612710811061298d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01819055505b6001600e60008282546129a69190613d6f565b925050819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1890613b4a565b60405180910390fd5b612a2a81611d43565b15612a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6190613a2a565b60405180910390fd5b612a766000838361284d565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ac69190613d6f565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612ba08473ffffffffffffffffffffffffffffffffffffffff16612d16565b15612d09578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bc9611d3b565b8786866040518563ffffffff1660e01b8152600401612beb94939291906138c2565b602060405180830381600087803b158015612c0557600080fd5b505af1925050508015612c3657506040513d601f19601f82011682018060405250810190612c339190613231565b60015b612cb9573d8060008114612c66576040519150601f19603f3d011682016040523d82523d6000602084013e612c6b565b606091505b50600081511415612cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca8906139ea565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d0e565b600190505b949350505050565b600080823b905060008111915050919050565b828054612d3590613f82565b90600052602060002090601f016020900481019282612d575760008555612d9e565b82601f10612d7057805160ff1916838001178555612d9e565b82800160010185558215612d9e579182015b82811115612d9d578251825591602001919060010190612d82565b5b509050612dab9190612daf565b5090565b5b80821115612dc8576000816000905550600101612db0565b5090565b6000612ddf612dda84613caa565b613c85565b905082815260208101848484011115612df757600080fd5b612e02848285613f40565b509392505050565b6000612e1d612e1884613cdb565b613c85565b905082815260208101848484011115612e3557600080fd5b612e40848285613f40565b509392505050565b600081359050612e5781614692565b92915050565b600081519050612e6c81614692565b92915050565b60008083601f840112612e8457600080fd5b8235905067ffffffffffffffff811115612e9d57600080fd5b602083019150836020820283011115612eb557600080fd5b9250929050565b600081359050612ecb816146a9565b92915050565b600081519050612ee0816146a9565b92915050565b600081359050612ef5816146c0565b92915050565b600081519050612f0a816146c0565b92915050565b600082601f830112612f2157600080fd5b8135612f31848260208601612dcc565b91505092915050565b600082601f830112612f4b57600080fd5b8135612f5b848260208601612e0a565b91505092915050565b600081359050612f73816146d7565b92915050565b600081519050612f88816146d7565b92915050565b600060208284031215612fa057600080fd5b6000612fae84828501612e48565b91505092915050565b600060208284031215612fc957600080fd5b6000612fd784828501612e5d565b91505092915050565b60008060408385031215612ff357600080fd5b600061300185828601612e48565b925050602061301285828601612e48565b9150509250929050565b60008060006060848603121561303157600080fd5b600061303f86828701612e48565b935050602061305086828701612e48565b925050604061306186828701612f64565b9150509250925092565b6000806000806080858703121561308157600080fd5b600061308f87828801612e48565b94505060206130a087828801612e48565b93505060406130b187828801612f64565b925050606085013567ffffffffffffffff8111156130ce57600080fd5b6130da87828801612f10565b91505092959194509250565b600080604083850312156130f957600080fd5b600061310785828601612e48565b925050602061311885828601612ebc565b9150509250929050565b6000806040838503121561313557600080fd5b600061314385828601612e48565b925050602061315485828601612f64565b9150509250929050565b60008060006040848603121561317357600080fd5b600084013567ffffffffffffffff81111561318d57600080fd5b61319986828701612e72565b935093505060206131ac86828701612e48565b9150509250925092565b6000602082840312156131c857600080fd5b60006131d684828501612ebc565b91505092915050565b6000602082840312156131f157600080fd5b60006131ff84828501612ed1565b91505092915050565b60006020828403121561321a57600080fd5b600061322884828501612ee6565b91505092915050565b60006020828403121561324357600080fd5b600061325184828501612efb565b91505092915050565b60006020828403121561326c57600080fd5b600082013567ffffffffffffffff81111561328657600080fd5b61329284828501612f3a565b91505092915050565b6000602082840312156132ad57600080fd5b60006132bb84828501612f64565b91505092915050565b6000602082840312156132d657600080fd5b60006132e484828501612f79565b91505092915050565b6000806040838503121561330057600080fd5b600061330e85828601612f64565b925050602061331f85828601612e48565b9150509250929050565b61333281613e84565b82525050565b61334961334482613e84565b61402e565b82525050565b61335881613e96565b82525050565b600061336982613d21565b6133738185613d37565b9350613383818560208601613f4f565b61338c81614149565b840191505092915050565b6133a081613ef8565b82525050565b6133af81613f1c565b82525050565b60006133c082613d2c565b6133ca8185613d53565b93506133da818560208601613f4f565b6133e381614149565b840191505092915050565b60006133f982613d2c565b6134038185613d64565b9350613413818560208601613f4f565b80840191505092915050565b6000815461342c81613f82565b6134368186613d64565b94506001821660008114613451576001811461346257613495565b60ff19831686528186019350613495565b61346b85613d0c565b60005b8381101561348d5781548189015260018201915060208101905061346e565b838801955050505b50505092915050565b60006134ab601783613d53565b91506134b682614167565b602082019050919050565b60006134ce601783613d53565b91506134d982614190565b602082019050919050565b60006134f1603283613d53565b91506134fc826141b9565b604082019050919050565b6000613514602683613d53565b915061351f82614208565b604082019050919050565b6000613537601c83613d53565b915061354282614257565b602082019050919050565b600061355a601783613d53565b915061356582614280565b602082019050919050565b600061357d602483613d53565b9150613588826142a9565b604082019050919050565b60006135a0601983613d53565b91506135ab826142f8565b602082019050919050565b60006135c3601783613d53565b91506135ce82614321565b602082019050919050565b60006135e6602c83613d53565b91506135f18261434a565b604082019050919050565b6000613609603883613d53565b915061361482614399565b604082019050919050565b600061362c602a83613d53565b9150613637826143e8565b604082019050919050565b600061364f602983613d53565b915061365a82614437565b604082019050919050565b6000613672602083613d53565b915061367d82614486565b602082019050919050565b6000613695602c83613d53565b91506136a0826144af565b604082019050919050565b60006136b8602083613d53565b91506136c3826144fe565b602082019050919050565b60006136db601483613d53565b91506136e682614527565b602082019050919050565b60006136fe602983613d53565b915061370982614550565b604082019050919050565b6000613721602183613d53565b915061372c8261459f565b604082019050919050565b6000613744600083613d48565b915061374f826145ee565b600082019050919050565b6000613767603183613d53565b9150613772826145f1565b604082019050919050565b600061378a601583613d53565b915061379582614640565b602082019050919050565b60006137ad601183613d53565b91506137b882614669565b602082019050919050565b6137cc81613eee565b82525050565b6137e36137de82613eee565b614052565b82525050565b60006137f5828561341f565b915061380182846133ee565b91508190509392505050565b600061381882613737565b9150819050919050565b600061382e82876137d2565b60208201915061383e8286613338565b60148201915061384e82856137d2565b60208201915061385e82846137d2565b60208201915081905095945050505050565b60006020820190506138856000830184613329565b92915050565b60006060820190506138a06000830186613329565b6138ad6020830185613329565b6138ba60408301846137c3565b949350505050565b60006080820190506138d76000830187613329565b6138e46020830186613329565b6138f160408301856137c3565b8181036060830152613903818461335e565b905095945050505050565b60006040820190506139236000830185613329565b61393060208301846137c3565b9392505050565b600060208201905061394c600083018461334f565b92915050565b60006020820190506139676000830184613397565b92915050565b600060208201905061398260008301846133a6565b92915050565b600060208201905081810360008301526139a281846133b5565b905092915050565b600060208201905081810360008301526139c38161349e565b9050919050565b600060208201905081810360008301526139e3816134c1565b9050919050565b60006020820190508181036000830152613a03816134e4565b9050919050565b60006020820190508181036000830152613a2381613507565b9050919050565b60006020820190508181036000830152613a438161352a565b9050919050565b60006020820190508181036000830152613a638161354d565b9050919050565b60006020820190508181036000830152613a8381613570565b9050919050565b60006020820190508181036000830152613aa381613593565b9050919050565b60006020820190508181036000830152613ac3816135b6565b9050919050565b60006020820190508181036000830152613ae3816135d9565b9050919050565b60006020820190508181036000830152613b03816135fc565b9050919050565b60006020820190508181036000830152613b238161361f565b9050919050565b60006020820190508181036000830152613b4381613642565b9050919050565b60006020820190508181036000830152613b6381613665565b9050919050565b60006020820190508181036000830152613b8381613688565b9050919050565b60006020820190508181036000830152613ba3816136ab565b9050919050565b60006020820190508181036000830152613bc3816136ce565b9050919050565b60006020820190508181036000830152613be3816136f1565b9050919050565b60006020820190508181036000830152613c0381613714565b9050919050565b60006020820190508181036000830152613c238161375a565b9050919050565b60006020820190508181036000830152613c438161377d565b9050919050565b60006020820190508181036000830152613c63816137a0565b9050919050565b6000602082019050613c7f60008301846137c3565b92915050565b6000613c8f613ca0565b9050613c9b8282613fb4565b919050565b6000604051905090565b600067ffffffffffffffff821115613cc557613cc461411a565b5b613cce82614149565b9050602081019050919050565b600067ffffffffffffffff821115613cf657613cf561411a565b5b613cff82614149565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d7a82613eee565b9150613d8583613eee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613dba57613db961408d565b5b828201905092915050565b6000613dd082613eee565b9150613ddb83613eee565b925082613deb57613dea6140bc565b5b828204905092915050565b6000613e0182613eee565b9150613e0c83613eee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e4557613e4461408d565b5b828202905092915050565b6000613e5b82613eee565b9150613e6683613eee565b925082821015613e7957613e7861408d565b5b828203905092915050565b6000613e8f82613ece565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613f0382613f0a565b9050919050565b6000613f1582613ece565b9050919050565b6000613f2782613f2e565b9050919050565b6000613f3982613ece565b9050919050565b82818337600083830152505050565b60005b83811015613f6d578082015181840152602081019050613f52565b83811115613f7c576000848401525b50505050565b60006002820490506001821680613f9a57607f821691505b60208210811415613fae57613fad6140eb565b5b50919050565b613fbd82614149565b810181811067ffffffffffffffff82111715613fdc57613fdb61411a565b5b80604052505050565b6000613ff082613eee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140235761402261408d565b5b600182019050919050565b600061403982614040565b9050919050565b600061404b8261415a565b9050919050565b6000819050919050565b600061406782613eee565b915061407283613eee565b925082614082576140816140bc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f6e6c7920746865206f776e65722063616e206d696e74000000000000000000600082015250565b7f506c6561736520696e636c756465206d696e7420666565000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5075626c6963206d696e74696e67206e6f74206f70656e000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5761697420666f72207075626c6963206d696e74696e67000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f484450756e6b20616c7265616479206d696e7465640000000000000000000000600082015250565b7f4e6f2066756e6e7920627573696e657373000000000000000000000000000000600082015250565b61469b81613e84565b81146146a657600080fd5b50565b6146b281613e96565b81146146bd57600080fd5b50565b6146c981613ea2565b81146146d457600080fd5b50565b6146e081613eee565b81146146eb57600080fd5b5056fea2646970667358221220092083f98f088f021b16f4cc0580924d01118747ef7c5887f92def684ec5173364736f6c63430008040033
Deployed Bytecode
0x6080604052600436106102045760003560e01c806370a0823111610118578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610706578063eddd0d9c14610743578063f2a08abb1461076c578063f2fde38b14610797578063f7a7c265146107c057610204565b8063b88d4fde1461064a578063c87b56dd14610673578063cfc86f7b146106b0578063e1eb13c1146106db57610204565b80638e499bcf116100e75780638e499bcf1461058457806394bf804d146105af57806394c55587146105cb57806395d89b41146105f6578063a22cb4651461062157610204565b806370a08231146104e9578063715018a614610526578063798c35b71461053d5780638da5cb5b1461055957610204565b8063254a47371161019b5780633ccfd60b1161016a5780633ccfd60b1461041857806342842e0e1461042f57806351605d80146104585780635da8f662146104835780636352211e146104ac57610204565b8063254a47371461037f57806330176e13146103a857806330da111a146103d157806332034d27146103fc57610204565b8063081812fc116101d7578063081812fc146102c5578063095ea7b31461030257806313966db51461032b57806323b872dd1461035657610204565b806301ffc9a714610209578063031bd4c41461024657806304299b2a1461027157806306fdde031461029a575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613208565b6107e9565b60405161023d9190613937565b60405180910390f35b34801561025257600080fd5b5061025b6108cb565b6040516102689190613c6a565b60405180910390f35b34801561027d57600080fd5b506102986004803603810190610293919061325a565b6108d1565b005b3480156102a657600080fd5b506102af610967565b6040516102bc9190613988565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e7919061329b565b6109f9565b6040516102f99190613870565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190613122565b610a7e565b005b34801561033757600080fd5b50610340610b96565b60405161034d9190613c6a565b60405180910390f35b34801561036257600080fd5b5061037d6004803603810190610378919061301c565b610ba0565b005b34801561038b57600080fd5b506103a660048036038101906103a191906131b6565b610c00565b005b3480156103b457600080fd5b506103cf60048036038101906103ca919061325a565b610c99565b005b3480156103dd57600080fd5b506103e6610d2f565b6040516103f39190613952565b60405180910390f35b61041660048036038101906104119190613122565b610d55565b005b34801561042457600080fd5b5061042d610f17565b005b34801561043b57600080fd5b506104566004803603810190610451919061301c565b610fd3565b005b34801561046457600080fd5b5061046d610ff3565b60405161047a9190613988565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613122565b611081565b005b3480156104b857600080fd5b506104d360048036038101906104ce919061329b565b6110fb565b6040516104e09190613870565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b9190612f8e565b6111ad565b60405161051d9190613c6a565b60405180910390f35b34801561053257600080fd5b5061053b611265565b005b6105576004803603810190610552919061315e565b61139f565b005b34801561056557600080fd5b5061056e6114a6565b60405161057b9190613870565b60405180910390f35b34801561059057600080fd5b506105996114cf565b6040516105a69190613c6a565b60405180910390f35b6105c960048036038101906105c491906132ed565b6114d5565b005b3480156105d757600080fd5b506105e061156c565b6040516105ed9190613937565b60405180910390f35b34801561060257600080fd5b5061060b61157f565b6040516106189190613988565b60405180910390f35b34801561062d57600080fd5b50610648600480360381019061064391906130e6565b611611565b005b34801561065657600080fd5b50610671600480360381019061066c919061306b565b611792565b005b34801561067f57600080fd5b5061069a6004803603810190610695919061329b565b6117f4565b6040516106a79190613988565b60405180910390f35b3480156106bc57600080fd5b506106c5611828565b6040516106d29190613988565b60405180910390f35b3480156106e757600080fd5b506106f06118b6565b6040516106fd919061396d565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190612fe0565b6118dc565b60405161073a9190613937565b60405180910390f35b34801561074f57600080fd5b5061076a6004803603810190610765919061329b565b611970565b005b34801561077857600080fd5b506107816119f6565b60405161078e9190613c6a565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b99190612f8e565b6119fc565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190612f8e565b611ba5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c457506108c382611cd1565b5b9050919050565b61271081565b6108d9611d3b565b73ffffffffffffffffffffffffffffffffffffffff166108f76114a6565b73ffffffffffffffffffffffffffffffffffffffff161461094d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094490613b8a565b60405180910390fd5b80600d9080519060200190610963929190612d29565b5050565b60606001805461097690613f82565b80601f01602080910402602001604051908101604052809291908181526020018280546109a290613f82565b80156109ef5780601f106109c4576101008083540402835291602001916109ef565b820191906000526020600020905b8154815290600101906020018083116109d257829003601f168201915b5050505050905090565b6000610a0482611d43565b610a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3a90613b6a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a89826110fb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190613bea565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b19611d3b565b73ffffffffffffffffffffffffffffffffffffffff161480610b485750610b4781610b42611d3b565b6118dc565b5b610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90613aea565b60405180910390fd5b610b918383611daf565b505050565b6000600a54905090565b610bb1610bab611d3b565b82611e68565b610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be790613c0a565b60405180910390fd5b610bfb838383611f46565b505050565b610c08611d3b565b73ffffffffffffffffffffffffffffffffffffffff16610c266114a6565b73ffffffffffffffffffffffffffffffffffffffff1614610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390613b8a565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b610ca1611d3b565b73ffffffffffffffffffffffffffffffffffffffff16610cbf6114a6565b73ffffffffffffffffffffffffffffffffffffffff1614610d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0c90613b8a565b60405180910390fd5b80600c9080519060200190610d2b929190612d29565b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900460ff1680610da25750610d736114a6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd890613aaa565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4690613c4a565b60405180910390fd5b610e57610b96565b81610e629190613df6565b34101580610ea25750610e736114a6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed8906139ca565b60405180910390fd5b60005b81811015610f1257610eff610ef76121a2565b33600061228e565b8080610f0a90613fe5565b915050610ee4565b505050565b60004790506000610f266114a6565b73ffffffffffffffffffffffffffffffffffffffff1682604051610f499061380d565b60006040518083038185875af1925050503d8060008114610f86576040519150601f19603f3d011682016040523d82523d6000602084013e610f8b565b606091505b5050905080610fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc690613baa565b60405180910390fd5b5050565b610fee83838360405180602001604052806000815250611792565b505050565b600d805461100090613f82565b80601f016020809104026020016040519081016040528092919081815260200182805461102c90613f82565b80156110795780601f1061104e57610100808354040283529160200191611079565b820191906000526020600020905b81548152906001019060200180831161105c57829003601f168201915b505050505081565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd306110a66114a6565b846040518463ffffffff1660e01b81526004016110c59392919061388b565b600060405180830381600087803b1580156110df57600080fd5b505af11580156110f3573d6000803e3d6000fd5b505050505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119b90613b2a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590613b0a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61126d611d3b565b73ffffffffffffffffffffffffffffffffffffffff1661128b6114a6565b73ffffffffffffffffffffffffffffffffffffffff16146112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890613b8a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113a7610b96565b838390506113b59190613df6565b341015806113f557506113c66114a6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142b906139ca565b60405180910390fd5b60005b838390508110156114a05761148d84848381811061147e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013583600161228e565b808061149890613fe5565b915050611437565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095481565b6114dd610b96565b3410158061151d57506114ee6114a6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61155c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611553906139ca565b60405180910390fd5b6115688282600161228e565b5050565b600b60009054906101000a900460ff1681565b60606002805461158e90613f82565b80601f01602080910402602001604051908101604052809291908181526020018280546115ba90613f82565b80156116075780601f106115dc57610100808354040283529160200191611607565b820191906000526020600020905b8154815290600101906020018083116115ea57829003601f168201915b5050505050905090565b611619611d3b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90613a8a565b60405180910390fd5b8060066000611694611d3b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611741611d3b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117869190613937565b60405180910390a35050565b6117a361179d611d3b565b83611e68565b6117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d990613c0a565b60405180910390fd5b6117ee84848484612644565b50505050565b6060600c611801836126a0565b6040516020016118129291906137e9565b6040516020818303038152906040529050919050565b600c805461183590613f82565b80601f016020809104026020016040519081016040528092919081815260200182805461186190613f82565b80156118ae5780601f10611883576101008083540402835291602001916118ae565b820191906000526020600020905b81548152906001019060200180831161189157829003601f168201915b505050505081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611978611d3b565b73ffffffffffffffffffffffffffffffffffffffff166119966114a6565b73ffffffffffffffffffffffffffffffffffffffff16146119ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e390613b8a565b60405180910390fd5b80600a8190555050565b600a5481565b611a04611d3b565b73ffffffffffffffffffffffffffffffffffffffff16611a226114a6565b73ffffffffffffffffffffffffffffffffffffffff1614611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f90613b8a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf90613a0a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611be59190613870565b60206040518083038186803b158015611bfd57600080fd5b505afa158015611c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3591906132c4565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611c5b6114a6565b836040518363ffffffff1660e01b8152600401611c7992919061390e565b602060405180830381600087803b158015611c9357600080fd5b505af1158015611ca7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccb91906131df565b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e22836110fb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e7382611d43565b611eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea990613aca565b60405180910390fd5b6000611ebd836110fb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f2c57508373ffffffffffffffffffffffffffffffffffffffff16611f14846109f9565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f3d5750611f3c81856118dc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f66826110fb565b73ffffffffffffffffffffffffffffffffffffffff1614611fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb390613bca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561202c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202390613a6a565b60405180910390fd5b61203783838361284d565b612042600082611daf565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120929190613e50565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e99190613d6f565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000806009546127106121b59190613e50565b9050600081600e543344426040516020016121d39493929190613822565b6040516020818303038152906040528051906020012060001c6121f6919061405c565b9050600080600f836127108110612236577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01541461228157600f826127108110612278577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01549050612285565b8190505b80935050505090565b61229783611d43565b156122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ce90613c2a565b60405180910390fd5b6122e083612852565b801561254a576000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166358178168856040518263ffffffff1660e01b81526004016123439190613c6a565b60206040518083038186803b15801561235b57600080fd5b505afa15801561236f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123939190612fb7565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561249957600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016124469190613c6a565b60206040518083038186803b15801561245e57600080fd5b505afa158015612472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124969190612fb7565b90505b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061250557506124d66114a6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b612544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253b906139aa565b60405180910390fd5b506125d7565b600b60009054906101000a900460ff168061259757506125686114a6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6125d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cd90613a4a565b60405180910390fd5b5b6125e182846129b1565b6001600960008282546125f49190613d6f565b92505081905550828273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a3505050565b61264f848484611f46565b61265b84848484612b7f565b61269a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612691906139ea565b60405180910390fd5b50505050565b606060008214156126e8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612848565b600082905060005b6000821461271a57808061270390613fe5565b915050600a826127139190613dc5565b91506126f0565b60008167ffffffffffffffff81111561275c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561278e5781602001600182028036833780820191505090505b5090505b60008514612841576001826127a79190613e50565b9150600a856127b6919061405c565b60306127c29190613d6f565b60f81b8183815181106127fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561283a9190613dc5565b9450612792565b8093505050505b919050565b505050565b60006009546127106128649190613e50565b90506000600f6001836128779190613e50565b61271081106128af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01541415612909576001816128c49190613e50565b600f8361271081106128ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0181905550612993565b600f6001826129189190613e50565b6127108110612950577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154600f83612710811061298d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01819055505b6001600e60008282546129a69190613d6f565b925050819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1890613b4a565b60405180910390fd5b612a2a81611d43565b15612a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6190613a2a565b60405180910390fd5b612a766000838361284d565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ac69190613d6f565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612ba08473ffffffffffffffffffffffffffffffffffffffff16612d16565b15612d09578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bc9611d3b565b8786866040518563ffffffff1660e01b8152600401612beb94939291906138c2565b602060405180830381600087803b158015612c0557600080fd5b505af1925050508015612c3657506040513d601f19601f82011682018060405250810190612c339190613231565b60015b612cb9573d8060008114612c66576040519150601f19603f3d011682016040523d82523d6000602084013e612c6b565b606091505b50600081511415612cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca8906139ea565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d0e565b600190505b949350505050565b600080823b905060008111915050919050565b828054612d3590613f82565b90600052602060002090601f016020900481019282612d575760008555612d9e565b82601f10612d7057805160ff1916838001178555612d9e565b82800160010185558215612d9e579182015b82811115612d9d578251825591602001919060010190612d82565b5b509050612dab9190612daf565b5090565b5b80821115612dc8576000816000905550600101612db0565b5090565b6000612ddf612dda84613caa565b613c85565b905082815260208101848484011115612df757600080fd5b612e02848285613f40565b509392505050565b6000612e1d612e1884613cdb565b613c85565b905082815260208101848484011115612e3557600080fd5b612e40848285613f40565b509392505050565b600081359050612e5781614692565b92915050565b600081519050612e6c81614692565b92915050565b60008083601f840112612e8457600080fd5b8235905067ffffffffffffffff811115612e9d57600080fd5b602083019150836020820283011115612eb557600080fd5b9250929050565b600081359050612ecb816146a9565b92915050565b600081519050612ee0816146a9565b92915050565b600081359050612ef5816146c0565b92915050565b600081519050612f0a816146c0565b92915050565b600082601f830112612f2157600080fd5b8135612f31848260208601612dcc565b91505092915050565b600082601f830112612f4b57600080fd5b8135612f5b848260208601612e0a565b91505092915050565b600081359050612f73816146d7565b92915050565b600081519050612f88816146d7565b92915050565b600060208284031215612fa057600080fd5b6000612fae84828501612e48565b91505092915050565b600060208284031215612fc957600080fd5b6000612fd784828501612e5d565b91505092915050565b60008060408385031215612ff357600080fd5b600061300185828601612e48565b925050602061301285828601612e48565b9150509250929050565b60008060006060848603121561303157600080fd5b600061303f86828701612e48565b935050602061305086828701612e48565b925050604061306186828701612f64565b9150509250925092565b6000806000806080858703121561308157600080fd5b600061308f87828801612e48565b94505060206130a087828801612e48565b93505060406130b187828801612f64565b925050606085013567ffffffffffffffff8111156130ce57600080fd5b6130da87828801612f10565b91505092959194509250565b600080604083850312156130f957600080fd5b600061310785828601612e48565b925050602061311885828601612ebc565b9150509250929050565b6000806040838503121561313557600080fd5b600061314385828601612e48565b925050602061315485828601612f64565b9150509250929050565b60008060006040848603121561317357600080fd5b600084013567ffffffffffffffff81111561318d57600080fd5b61319986828701612e72565b935093505060206131ac86828701612e48565b9150509250925092565b6000602082840312156131c857600080fd5b60006131d684828501612ebc565b91505092915050565b6000602082840312156131f157600080fd5b60006131ff84828501612ed1565b91505092915050565b60006020828403121561321a57600080fd5b600061322884828501612ee6565b91505092915050565b60006020828403121561324357600080fd5b600061325184828501612efb565b91505092915050565b60006020828403121561326c57600080fd5b600082013567ffffffffffffffff81111561328657600080fd5b61329284828501612f3a565b91505092915050565b6000602082840312156132ad57600080fd5b60006132bb84828501612f64565b91505092915050565b6000602082840312156132d657600080fd5b60006132e484828501612f79565b91505092915050565b6000806040838503121561330057600080fd5b600061330e85828601612f64565b925050602061331f85828601612e48565b9150509250929050565b61333281613e84565b82525050565b61334961334482613e84565b61402e565b82525050565b61335881613e96565b82525050565b600061336982613d21565b6133738185613d37565b9350613383818560208601613f4f565b61338c81614149565b840191505092915050565b6133a081613ef8565b82525050565b6133af81613f1c565b82525050565b60006133c082613d2c565b6133ca8185613d53565b93506133da818560208601613f4f565b6133e381614149565b840191505092915050565b60006133f982613d2c565b6134038185613d64565b9350613413818560208601613f4f565b80840191505092915050565b6000815461342c81613f82565b6134368186613d64565b94506001821660008114613451576001811461346257613495565b60ff19831686528186019350613495565b61346b85613d0c565b60005b8381101561348d5781548189015260018201915060208101905061346e565b838801955050505b50505092915050565b60006134ab601783613d53565b91506134b682614167565b602082019050919050565b60006134ce601783613d53565b91506134d982614190565b602082019050919050565b60006134f1603283613d53565b91506134fc826141b9565b604082019050919050565b6000613514602683613d53565b915061351f82614208565b604082019050919050565b6000613537601c83613d53565b915061354282614257565b602082019050919050565b600061355a601783613d53565b915061356582614280565b602082019050919050565b600061357d602483613d53565b9150613588826142a9565b604082019050919050565b60006135a0601983613d53565b91506135ab826142f8565b602082019050919050565b60006135c3601783613d53565b91506135ce82614321565b602082019050919050565b60006135e6602c83613d53565b91506135f18261434a565b604082019050919050565b6000613609603883613d53565b915061361482614399565b604082019050919050565b600061362c602a83613d53565b9150613637826143e8565b604082019050919050565b600061364f602983613d53565b915061365a82614437565b604082019050919050565b6000613672602083613d53565b915061367d82614486565b602082019050919050565b6000613695602c83613d53565b91506136a0826144af565b604082019050919050565b60006136b8602083613d53565b91506136c3826144fe565b602082019050919050565b60006136db601483613d53565b91506136e682614527565b602082019050919050565b60006136fe602983613d53565b915061370982614550565b604082019050919050565b6000613721602183613d53565b915061372c8261459f565b604082019050919050565b6000613744600083613d48565b915061374f826145ee565b600082019050919050565b6000613767603183613d53565b9150613772826145f1565b604082019050919050565b600061378a601583613d53565b915061379582614640565b602082019050919050565b60006137ad601183613d53565b91506137b882614669565b602082019050919050565b6137cc81613eee565b82525050565b6137e36137de82613eee565b614052565b82525050565b60006137f5828561341f565b915061380182846133ee565b91508190509392505050565b600061381882613737565b9150819050919050565b600061382e82876137d2565b60208201915061383e8286613338565b60148201915061384e82856137d2565b60208201915061385e82846137d2565b60208201915081905095945050505050565b60006020820190506138856000830184613329565b92915050565b60006060820190506138a06000830186613329565b6138ad6020830185613329565b6138ba60408301846137c3565b949350505050565b60006080820190506138d76000830187613329565b6138e46020830186613329565b6138f160408301856137c3565b8181036060830152613903818461335e565b905095945050505050565b60006040820190506139236000830185613329565b61393060208301846137c3565b9392505050565b600060208201905061394c600083018461334f565b92915050565b60006020820190506139676000830184613397565b92915050565b600060208201905061398260008301846133a6565b92915050565b600060208201905081810360008301526139a281846133b5565b905092915050565b600060208201905081810360008301526139c38161349e565b9050919050565b600060208201905081810360008301526139e3816134c1565b9050919050565b60006020820190508181036000830152613a03816134e4565b9050919050565b60006020820190508181036000830152613a2381613507565b9050919050565b60006020820190508181036000830152613a438161352a565b9050919050565b60006020820190508181036000830152613a638161354d565b9050919050565b60006020820190508181036000830152613a8381613570565b9050919050565b60006020820190508181036000830152613aa381613593565b9050919050565b60006020820190508181036000830152613ac3816135b6565b9050919050565b60006020820190508181036000830152613ae3816135d9565b9050919050565b60006020820190508181036000830152613b03816135fc565b9050919050565b60006020820190508181036000830152613b238161361f565b9050919050565b60006020820190508181036000830152613b4381613642565b9050919050565b60006020820190508181036000830152613b6381613665565b9050919050565b60006020820190508181036000830152613b8381613688565b9050919050565b60006020820190508181036000830152613ba3816136ab565b9050919050565b60006020820190508181036000830152613bc3816136ce565b9050919050565b60006020820190508181036000830152613be3816136f1565b9050919050565b60006020820190508181036000830152613c0381613714565b9050919050565b60006020820190508181036000830152613c238161375a565b9050919050565b60006020820190508181036000830152613c438161377d565b9050919050565b60006020820190508181036000830152613c63816137a0565b9050919050565b6000602082019050613c7f60008301846137c3565b92915050565b6000613c8f613ca0565b9050613c9b8282613fb4565b919050565b6000604051905090565b600067ffffffffffffffff821115613cc557613cc461411a565b5b613cce82614149565b9050602081019050919050565b600067ffffffffffffffff821115613cf657613cf561411a565b5b613cff82614149565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d7a82613eee565b9150613d8583613eee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613dba57613db961408d565b5b828201905092915050565b6000613dd082613eee565b9150613ddb83613eee565b925082613deb57613dea6140bc565b5b828204905092915050565b6000613e0182613eee565b9150613e0c83613eee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e4557613e4461408d565b5b828202905092915050565b6000613e5b82613eee565b9150613e6683613eee565b925082821015613e7957613e7861408d565b5b828203905092915050565b6000613e8f82613ece565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613f0382613f0a565b9050919050565b6000613f1582613ece565b9050919050565b6000613f2782613f2e565b9050919050565b6000613f3982613ece565b9050919050565b82818337600083830152505050565b60005b83811015613f6d578082015181840152602081019050613f52565b83811115613f7c576000848401525b50505050565b60006002820490506001821680613f9a57607f821691505b60208210811415613fae57613fad6140eb565b5b50919050565b613fbd82614149565b810181811067ffffffffffffffff82111715613fdc57613fdb61411a565b5b80604052505050565b6000613ff082613eee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140235761402261408d565b5b600182019050919050565b600061403982614040565b9050919050565b600061404b8261415a565b9050919050565b6000819050919050565b600061406782613eee565b915061407283613eee565b925082614082576140816140bc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f6e6c7920746865206f776e65722063616e206d696e74000000000000000000600082015250565b7f506c6561736520696e636c756465206d696e7420666565000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5075626c6963206d696e74696e67206e6f74206f70656e000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5761697420666f72207075626c6963206d696e74696e67000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f484450756e6b20616c7265616479206d696e7465640000000000000000000000600082015250565b7f4e6f2066756e6e7920627573696e657373000000000000000000000000000000600082015250565b61469b81613e84565b81146146a657600080fd5b50565b6146b281613e96565b81146146bd57600080fd5b50565b6146c981613ea2565b81146146d457600080fd5b50565b6146e081613eee565b81146146eb57600080fd5b5056fea2646970667358221220092083f98f088f021b16f4cc0580924d01118747ef7c5887f92def684ec5173364736f6c63430008040033
Deployed Bytecode Sourcemap
35790:5734:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21110:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36088:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41413:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22042:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23502:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23039:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39737:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24392:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41265:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41075:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35896:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37413:474;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40008:192;;;;;;;;;;;;;:::i;:::-;;24768:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36284:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40566:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21736:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21466:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34659:148;;;;;;;;;;;;;:::i;:::-;;36659:319;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34008:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36137:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37092:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36209:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22211:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23795:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24990:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40818:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36250:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35989:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24161:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39825:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36169:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34962:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40279:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21110:292;21212:4;21251:25;21236:40;;;:11;:40;;;;:105;;;;21308:33;21293:48;;;:11;:48;;;;21236:105;:158;;;;21358:36;21382:11;21358:23;:36::i;:::-;21236:158;21229:165;;21110:292;;;:::o;36088:40::-;36123:5;36088:40;:::o;41413:106::-;34239:12;:10;:12::i;:::-;34228:23;;:7;:5;:7::i;:::-;:23;;;34220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41501:10:::1;41489:9;:22;;;;;;;;;;;;:::i;:::-;;41413:106:::0;:::o;22042:100::-;22096:13;22129:5;22122:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22042:100;:::o;23502:221::-;23578:7;23606:16;23614:7;23606;:16::i;:::-;23598:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23691:15;:24;23707:7;23691:24;;;;;;;;;;;;;;;;;;;;;23684:31;;23502:221;;;:::o;23039:397::-;23120:13;23136:23;23151:7;23136:14;:23::i;:::-;23120:39;;23184:5;23178:11;;:2;:11;;;;23170:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23264:5;23248:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23273:37;23290:5;23297:12;:10;:12::i;:::-;23273:16;:37::i;:::-;23248:62;23240:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;23407:21;23416:2;23420:7;23407:8;:21::i;:::-;23039:397;;;:::o;39737:80::-;39777:4;39801:8;;39794:15;;39737:80;:::o;24392:305::-;24553:41;24572:12;:10;:12::i;:::-;24586:7;24553:18;:41::i;:::-;24545:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24661:28;24671:4;24677:2;24681:7;24661:9;:28::i;:::-;24392:305;;;:::o;41265:94::-;34239:12;:10;:12::i;:::-;34228:23;;:7;:5;:7::i;:::-;:23;;;34220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41347:4:::1;41330:14;;:21;;;;;;;;;;;;;;;;;;41265:94:::0;:::o;41075:121::-;34239:12;:10;:12::i;:::-;34228:23;;:7;:5;:7::i;:::-;:23;;;34220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41174:14:::1;41158:13;:30;;;;;;;;;;;;:::i;:::-;;41075:121:::0;:::o;35896:86::-;;;;;;;;;;;;;:::o;37413:474::-;37496:14;;;;;;;;;;;:31;;;;37520:7;:5;:7::i;:::-;37514:13;;:2;:13;;;37496:31;37488:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37588:9;37574:23;;:10;:23;;;37566:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;37662:9;:7;:9::i;:::-;37651:8;:20;;;;:::i;:::-;37638:9;:33;;:50;;;;37681:7;:5;:7::i;:::-;37675:13;;:2;:13;;;37638:50;37630:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;37783:6;37778:102;37799:8;37795:1;:12;37778:102;;;37829:39;37835:13;:11;:13::i;:::-;37850:10;37862:5;37829;:39::i;:::-;37809:3;;;;;:::i;:::-;;;;37778:102;;;;37413:474;;:::o;40008:192::-;40046:11;40060:21;40046:35;;40093:12;40110:7;:5;:7::i;:::-;:12;;40130:6;40110:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40092:49;;;40160:7;40152:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;40008:192;;:::o;24768:151::-;24872:39;24889:4;24895:2;24899:7;24872:39;;;;;;;;;;;;:16;:39::i;:::-;24768:151;;;:::o;36284:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40566:167::-;40663:14;40655:36;;;40700:4;40707:7;:5;:7::i;:::-;40716:8;40655:70;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40566:167;;:::o;21736:239::-;21808:7;21828:13;21844:7;:16;21852:7;21844:16;;;;;;;;;;;;;;;;;;;;;21828:32;;21896:1;21879:19;;:5;:19;;;;21871:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21962:5;21955:12;;;21736:239;;;:::o;21466:208::-;21538:7;21583:1;21566:19;;:5;:19;;;;21558:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21650:9;:16;21660:5;21650:16;;;;;;;;;;;;;;;;21643:23;;21466:208;;;:::o;34659:148::-;34239:12;:10;:12::i;:::-;34228:23;;:7;:5;:7::i;:::-;:23;;;34220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34766:1:::1;34729:40;;34750:6;::::0;::::1;;;;;;;;34729:40;;;;;;;;;;;;34797:1;34780:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;34659:148::o:0;36659:319::-;36808:9;:7;:9::i;:::-;36790:8;;:15;;:27;;;;:::i;:::-;36777:9;:40;;:57;;;;36827:7;:5;:7::i;:::-;36821:13;;:2;:13;;;36777:57;36769:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;36878:6;36873:98;36894:8;;:15;;36890:1;:19;36873:98;;;36931:28;36937:8;;36946:1;36937:11;;;;;;;;;;;;;;;;;;;;;36950:2;36954:4;36931:5;:28::i;:::-;36911:3;;;;;:::i;:::-;;;;36873:98;;;;36659:319;;;:::o;34008:87::-;34054:7;34081:6;;;;;;;;;;;34074:13;;34008:87;:::o;36137:25::-;;;;:::o;37092:212::-;37207:9;:7;:9::i;:::-;37194;:22;;:39;;;;37226:7;:5;:7::i;:::-;37220:13;;:2;:13;;;37194:39;37186:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;37272:24;37278:7;37287:2;37291:4;37272:5;:24::i;:::-;37092:212;;:::o;36209:34::-;;;;;;;;;;;;;:::o;22211:104::-;22267:13;22300:7;22293:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22211:104;:::o;23795:295::-;23910:12;:10;:12::i;:::-;23898:24;;:8;:24;;;;23890:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24010:8;23965:18;:32;23984:12;:10;:12::i;:::-;23965:32;;;;;;;;;;;;;;;:42;23998:8;23965:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24063:8;24034:48;;24049:12;:10;:12::i;:::-;24034:48;;;24073:8;24034:48;;;;;;:::i;:::-;;;;;;;;23795:295;;:::o;24990:285::-;25122:41;25141:12;:10;:12::i;:::-;25155:7;25122:18;:41::i;:::-;25114:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25228:39;25242:4;25248:2;25252:7;25261:5;25228:13;:39::i;:::-;24990:285;;;;:::o;40818:174::-;40884:13;40941;40956:26;40973:8;40956:16;:26::i;:::-;40924:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40910:74;;40818:174;;;:::o;36250:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35989:92::-;;;;;;;;;;;;;:::o;24161:164::-;24258:4;24282:18;:25;24301:5;24282:25;;;;;;;;;;;;;;;:35;24308:8;24282:35;;;;;;;;;;;;;;;;;;;;;;;;;24275:42;;24161:164;;;;:::o;39825:95::-;34239:12;:10;:12::i;:::-;34228:23;;:7;:5;:7::i;:::-;:23;;;34220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39903:9:::1;39892:8;:20;;;;39825:95:::0;:::o;36169:33::-;;;;:::o;34962:244::-;34239:12;:10;:12::i;:::-;34228:23;;:7;:5;:7::i;:::-;:23;;;34220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35071:1:::1;35051:22;;:8;:22;;;;35043:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35161:8;35132:38;;35153:6;::::0;::::1;;;;;;;;35132:38;;;;;;;;;;;;35190:8;35181:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;34962:244:::0;:::o;40279:207::-;40345:12;40367:14;40345:37;;40391:14;40408:5;:15;;;40432:4;40408:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40391:47;;40447:5;:14;;;40462:7;:5;:7::i;:::-;40471:6;40447:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40279:207;;;:::o;19608:157::-;19693:4;19732:25;19717:40;;;:11;:40;;;;19710:47;;19608:157;;;:::o;16398:98::-;16451:7;16478:10;16471:17;;16398:98;:::o;26742:127::-;26807:4;26859:1;26831:30;;:7;:16;26839:7;26831:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26824:37;;26742:127;;;:::o;30619:174::-;30721:2;30694:15;:24;30710:7;30694:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30777:7;30773:2;30739:46;;30748:23;30763:7;30748:14;:23::i;:::-;30739:46;;;;;;;;;;;;30619:174;;:::o;27036:348::-;27129:4;27154:16;27162:7;27154;:16::i;:::-;27146:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27230:13;27246:23;27261:7;27246:14;:23::i;:::-;27230:39;;27299:5;27288:16;;:7;:16;;;:51;;;;27332:7;27308:31;;:20;27320:7;27308:11;:20::i;:::-;:31;;;27288:51;:87;;;;27343:32;27360:5;27367:7;27343:16;:32::i;:::-;27288:87;27280:96;;;27036:348;;;;:::o;29957:544::-;30082:4;30055:31;;:23;30070:7;30055:14;:23::i;:::-;:31;;;30047:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30165:1;30151:16;;:2;:16;;;;30143:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30221:39;30242:4;30248:2;30252:7;30221:20;:39::i;:::-;30325:29;30342:1;30346:7;30325:8;:29::i;:::-;30386:1;30367:9;:15;30377:4;30367:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30415:1;30398:9;:13;30408:2;30398:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30446:2;30427:7;:16;30435:7;30427:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30485:7;30481:2;30466:27;;30475:4;30466:27;;;;;;;;;;;;29957:544;;;:::o;38706:485::-;38752:4;38769:14;38800:9;;36123:5;38786:23;;;;:::i;:::-;38769:40;;38820:10;38923:9;38865:5;;38872:10;38884:16;38902:15;38848:70;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38838:81;;;;;;38833:87;;:99;;;;:::i;:::-;38820:112;;38943:10;38990:1;38972:7;38980:5;38972:14;;;;;;;;;;;;;;;;;:19;38968:161;;39016:7;39024:5;39016:14;;;;;;;;;;;;;;;;;39008:22;;38968:161;;;39112:5;39104:13;;38968:161;39178:5;39171:12;;;;;38706:485;:::o;37977:721::-;38110:16;38118:7;38110;:16::i;:::-;38109:17;38101:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;38163:23;38178:7;38163:14;:23::i;:::-;38203:14;38199:403;;;38234:17;38254:5;;;;;;;;;;;:24;;;38279:7;38254:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38234:53;;38327:7;;;;;;;;;;;38306:29;;:9;:29;;;38302:106;;;38368:7;;;;;;;;;;;:15;;;38384:7;38368:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38356:36;;38302:106;38436:9;38430:15;;:2;:15;;;:32;;;;38455:7;:5;:7::i;:::-;38449:13;;:2;:13;;;38430:32;38422:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38199:403;;;;38531:14;;;;;;;;;;;:31;;;;38555:7;:5;:7::i;:::-;38549:13;;:2;:13;;;38531:31;38523:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38199:403;38614:18;38620:2;38624:7;38614:5;:18::i;:::-;38656:1;38643:9;;:14;;;;;;;:::i;:::-;;;;;;;;38682:7;38678:2;38673:17;;;;;;;;;;;;37977:721;;;:::o;26157:272::-;26271:28;26281:4;26287:2;26291:7;26271:9;:28::i;:::-;26318:48;26341:4;26347:2;26351:7;26360:5;26318:22;:48::i;:::-;26310:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26157:272;;;;:::o;17053:723::-;17109:13;17339:1;17330:5;:10;17326:53;;;17357:10;;;;;;;;;;;;;;;;;;;;;17326:53;17389:12;17404:5;17389:20;;17420:14;17445:78;17460:1;17452:4;:9;17445:78;;17478:8;;;;;:::i;:::-;;;;17509:2;17501:10;;;;;:::i;:::-;;;17445:78;;;17533:19;17565:6;17555:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17533:39;;17583:154;17599:1;17590:5;:10;17583:154;;17627:1;17617:11;;;;;:::i;:::-;;;17694:2;17686:5;:10;;;;:::i;:::-;17673:2;:24;;;;:::i;:::-;17660:39;;17643:6;17650;17643:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17723:2;17714:11;;;;;:::i;:::-;;;17583:154;;;17761:6;17747:21;;;;;17053:723;;;;:::o;32814:93::-;;;;:::o;39199:467::-;39255:14;39286:9;;36123:5;39272:23;;;;:::i;:::-;39255:40;;39385:1;39359:7;39379:1;39367:9;:13;;;;:::i;:::-;39359:22;;;;;;;;;;;;;;;;;:27;39355:283;;;39496:1;39484:9;:13;;;;:::i;:::-;39467:7;39475:5;39467:14;;;;;;;;;;;;;;;;:30;;;;39355:283;;;39604:7;39624:1;39612:9;:13;;;;:::i;:::-;39604:22;;;;;;;;;;;;;;;;;39587:7;39595:5;39587:14;;;;;;;;;;;;;;;;:39;;;;39355:283;39657:1;39648:5;;:10;;;;;;;:::i;:::-;;;;;;;;39199:467;;:::o;28649:382::-;28743:1;28729:16;;:2;:16;;;;28721:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28802:16;28810:7;28802;:16::i;:::-;28801:17;28793:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28864:45;28893:1;28897:2;28901:7;28864:20;:45::i;:::-;28939:1;28922:9;:13;28932:2;28922:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28970:2;28951:7;:16;28959:7;28951:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29015:7;29011:2;28990:33;;29007:1;28990:33;;;;;;;;;;;;28649:382;;:::o;31358:843::-;31479:4;31505:15;:2;:13;;;:15::i;:::-;31501:693;;;31557:2;31541:36;;;31578:12;:10;:12::i;:::-;31592:4;31598:7;31607:5;31541:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31537:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31804:1;31787:6;:13;:18;31783:341;;;31830:60;;;;;;;;;;:::i;:::-;;;;;;;;31783:341;32074:6;32068:13;32059:6;32055:2;32051:15;32044:38;31537:602;31674:45;;;31664:55;;;:6;:55;;;;31657:62;;;;;31501:693;32178:4;32171:11;;31358:843;;;;;;;:::o;8515:422::-;8575:4;8783:12;8894:7;8882:20;8874:28;;8928:1;8921:4;:8;8914:15;;;8515:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:143::-;909:5;940:6;934:13;925:22;;956:33;983:5;956:33;:::i;:::-;915:80;;;;:::o;1018:367::-;1091:8;1101:6;1151:3;1144:4;1136:6;1132:17;1128:27;1118:2;;1169:1;1166;1159:12;1118:2;1205:6;1192:20;1182:30;;1235:18;1227:6;1224:30;1221:2;;;1267:1;1264;1257:12;1221:2;1304:4;1296:6;1292:17;1280:29;;1358:3;1350:4;1342:6;1338:17;1328:8;1324:32;1321:41;1318:2;;;1375:1;1372;1365:12;1318:2;1108:277;;;;;:::o;1391:133::-;1434:5;1472:6;1459:20;1450:29;;1488:30;1512:5;1488:30;:::i;:::-;1440:84;;;;:::o;1530:137::-;1584:5;1615:6;1609:13;1600:22;;1631:30;1655:5;1631:30;:::i;:::-;1590:77;;;;:::o;1673:137::-;1718:5;1756:6;1743:20;1734:29;;1772:32;1798:5;1772:32;:::i;:::-;1724:86;;;;:::o;1816:141::-;1872:5;1903:6;1897:13;1888:22;;1919:32;1945:5;1919:32;:::i;:::-;1878:79;;;;:::o;1976:271::-;2031:5;2080:3;2073:4;2065:6;2061:17;2057:27;2047:2;;2098:1;2095;2088:12;2047:2;2138:6;2125:20;2163:78;2237:3;2229:6;2222:4;2214:6;2210:17;2163:78;:::i;:::-;2154:87;;2037:210;;;;;:::o;2267:273::-;2323:5;2372:3;2365:4;2357:6;2353:17;2349:27;2339:2;;2390:1;2387;2380:12;2339:2;2430:6;2417:20;2455:79;2530:3;2522:6;2515:4;2507:6;2503:17;2455:79;:::i;:::-;2446:88;;2329:211;;;;;:::o;2546:139::-;2592:5;2630:6;2617:20;2608:29;;2646:33;2673:5;2646:33;:::i;:::-;2598:87;;;;:::o;2691:143::-;2748:5;2779:6;2773:13;2764:22;;2795:33;2822:5;2795:33;:::i;:::-;2754:80;;;;:::o;2840:262::-;2899:6;2948:2;2936:9;2927:7;2923:23;2919:32;2916:2;;;2964:1;2961;2954:12;2916:2;3007:1;3032:53;3077:7;3068:6;3057:9;3053:22;3032:53;:::i;:::-;3022:63;;2978:117;2906:196;;;;:::o;3108:284::-;3178:6;3227:2;3215:9;3206:7;3202:23;3198:32;3195:2;;;3243:1;3240;3233:12;3195:2;3286:1;3311:64;3367:7;3358:6;3347:9;3343:22;3311:64;:::i;:::-;3301:74;;3257:128;3185:207;;;;:::o;3398:407::-;3466:6;3474;3523:2;3511:9;3502:7;3498:23;3494:32;3491:2;;;3539:1;3536;3529:12;3491:2;3582:1;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3553:117;3709:2;3735:53;3780:7;3771:6;3760:9;3756:22;3735:53;:::i;:::-;3725:63;;3680:118;3481:324;;;;;:::o;3811:552::-;3888:6;3896;3904;3953:2;3941:9;3932:7;3928:23;3924:32;3921:2;;;3969:1;3966;3959:12;3921:2;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;3911:452;;;;;:::o;4369:809::-;4464:6;4472;4480;4488;4537:3;4525:9;4516:7;4512:23;4508:33;4505:2;;;4554:1;4551;4544:12;4505:2;4597:1;4622:53;4667:7;4658:6;4647:9;4643:22;4622:53;:::i;:::-;4612:63;;4568:117;4724:2;4750:53;4795:7;4786:6;4775:9;4771:22;4750:53;:::i;:::-;4740:63;;4695:118;4852:2;4878:53;4923:7;4914:6;4903:9;4899:22;4878:53;:::i;:::-;4868:63;;4823:118;5008:2;4997:9;4993:18;4980:32;5039:18;5031:6;5028:30;5025:2;;;5071:1;5068;5061:12;5025:2;5099:62;5153:7;5144:6;5133:9;5129:22;5099:62;:::i;:::-;5089:72;;4951:220;4495:683;;;;;;;:::o;5184:401::-;5249:6;5257;5306:2;5294:9;5285:7;5281:23;5277:32;5274:2;;;5322:1;5319;5312:12;5274:2;5365:1;5390:53;5435:7;5426:6;5415:9;5411:22;5390:53;:::i;:::-;5380:63;;5336:117;5492:2;5518:50;5560:7;5551:6;5540:9;5536:22;5518:50;:::i;:::-;5508:60;;5463:115;5264:321;;;;;:::o;5591:407::-;5659:6;5667;5716:2;5704:9;5695:7;5691:23;5687:32;5684:2;;;5732:1;5729;5722:12;5684:2;5775:1;5800:53;5845:7;5836:6;5825:9;5821:22;5800:53;:::i;:::-;5790:63;;5746:117;5902:2;5928:53;5973:7;5964:6;5953:9;5949:22;5928:53;:::i;:::-;5918:63;;5873:118;5674:324;;;;;:::o;6004:570::-;6099:6;6107;6115;6164:2;6152:9;6143:7;6139:23;6135:32;6132:2;;;6180:1;6177;6170:12;6132:2;6251:1;6240:9;6236:17;6223:31;6281:18;6273:6;6270:30;6267:2;;;6313:1;6310;6303:12;6267:2;6349:80;6421:7;6412:6;6401:9;6397:22;6349:80;:::i;:::-;6331:98;;;;6194:245;6478:2;6504:53;6549:7;6540:6;6529:9;6525:22;6504:53;:::i;:::-;6494:63;;6449:118;6122:452;;;;;:::o;6580:256::-;6636:6;6685:2;6673:9;6664:7;6660:23;6656:32;6653:2;;;6701:1;6698;6691:12;6653:2;6744:1;6769:50;6811:7;6802:6;6791:9;6787:22;6769:50;:::i;:::-;6759:60;;6715:114;6643:193;;;;:::o;6842:278::-;6909:6;6958:2;6946:9;6937:7;6933:23;6929:32;6926:2;;;6974:1;6971;6964:12;6926:2;7017:1;7042:61;7095:7;7086:6;7075:9;7071:22;7042:61;:::i;:::-;7032:71;;6988:125;6916:204;;;;:::o;7126:260::-;7184:6;7233:2;7221:9;7212:7;7208:23;7204:32;7201:2;;;7249:1;7246;7239:12;7201:2;7292:1;7317:52;7361:7;7352:6;7341:9;7337:22;7317:52;:::i;:::-;7307:62;;7263:116;7191:195;;;;:::o;7392:282::-;7461:6;7510:2;7498:9;7489:7;7485:23;7481:32;7478:2;;;7526:1;7523;7516:12;7478:2;7569:1;7594:63;7649:7;7640:6;7629:9;7625:22;7594:63;:::i;:::-;7584:73;;7540:127;7468:206;;;;:::o;7680:375::-;7749:6;7798:2;7786:9;7777:7;7773:23;7769:32;7766:2;;;7814:1;7811;7804:12;7766:2;7885:1;7874:9;7870:17;7857:31;7915:18;7907:6;7904:30;7901:2;;;7947:1;7944;7937:12;7901:2;7975:63;8030:7;8021:6;8010:9;8006:22;7975:63;:::i;:::-;7965:73;;7828:220;7756:299;;;;:::o;8061:262::-;8120:6;8169:2;8157:9;8148:7;8144:23;8140:32;8137:2;;;8185:1;8182;8175:12;8137:2;8228:1;8253:53;8298:7;8289:6;8278:9;8274:22;8253:53;:::i;:::-;8243:63;;8199:117;8127:196;;;;:::o;8329:284::-;8399:6;8448:2;8436:9;8427:7;8423:23;8419:32;8416:2;;;8464:1;8461;8454:12;8416:2;8507:1;8532:64;8588:7;8579:6;8568:9;8564:22;8532:64;:::i;:::-;8522:74;;8478:128;8406:207;;;;:::o;8619:407::-;8687:6;8695;8744:2;8732:9;8723:7;8719:23;8715:32;8712:2;;;8760:1;8757;8750:12;8712:2;8803:1;8828:53;8873:7;8864:6;8853:9;8849:22;8828:53;:::i;:::-;8818:63;;8774:117;8930:2;8956:53;9001:7;8992:6;8981:9;8977:22;8956:53;:::i;:::-;8946:63;;8901:118;8702:324;;;;;:::o;9032:118::-;9119:24;9137:5;9119:24;:::i;:::-;9114:3;9107:37;9097:53;;:::o;9156:157::-;9261:45;9281:24;9299:5;9281:24;:::i;:::-;9261:45;:::i;:::-;9256:3;9249:58;9239:74;;:::o;9319:109::-;9400:21;9415:5;9400:21;:::i;:::-;9395:3;9388:34;9378:50;;:::o;9434:360::-;9520:3;9548:38;9580:5;9548:38;:::i;:::-;9602:70;9665:6;9660:3;9602:70;:::i;:::-;9595:77;;9681:52;9726:6;9721:3;9714:4;9707:5;9703:16;9681:52;:::i;:::-;9758:29;9780:6;9758:29;:::i;:::-;9753:3;9749:39;9742:46;;9524:270;;;;;:::o;9800:175::-;9909:59;9962:5;9909:59;:::i;:::-;9904:3;9897:72;9887:88;;:::o;9981:179::-;10092:61;10147:5;10092:61;:::i;:::-;10087:3;10080:74;10070:90;;:::o;10166:364::-;10254:3;10282:39;10315:5;10282:39;:::i;:::-;10337:71;10401:6;10396:3;10337:71;:::i;:::-;10330:78;;10417:52;10462:6;10457:3;10450:4;10443:5;10439:16;10417:52;:::i;:::-;10494:29;10516:6;10494:29;:::i;:::-;10489:3;10485:39;10478:46;;10258:272;;;;;:::o;10536:377::-;10642:3;10670:39;10703:5;10670:39;:::i;:::-;10725:89;10807:6;10802:3;10725:89;:::i;:::-;10718:96;;10823:52;10868:6;10863:3;10856:4;10849:5;10845:16;10823:52;:::i;:::-;10900:6;10895:3;10891:16;10884:23;;10646:267;;;;;:::o;10943:845::-;11046:3;11083:5;11077:12;11112:36;11138:9;11112:36;:::i;:::-;11164:89;11246:6;11241:3;11164:89;:::i;:::-;11157:96;;11284:1;11273:9;11269:17;11300:1;11295:137;;;;11446:1;11441:341;;;;11262:520;;11295:137;11379:4;11375:9;11364;11360:25;11355:3;11348:38;11415:6;11410:3;11406:16;11399:23;;11295:137;;11441:341;11508:38;11540:5;11508:38;:::i;:::-;11568:1;11582:154;11596:6;11593:1;11590:13;11582:154;;;11670:7;11664:14;11660:1;11655:3;11651:11;11644:35;11720:1;11711:7;11707:15;11696:26;;11618:4;11615:1;11611:12;11606:17;;11582:154;;;11765:6;11760:3;11756:16;11749:23;;11448:334;;11262:520;;11050:738;;;;;;:::o;11794:366::-;11936:3;11957:67;12021:2;12016:3;11957:67;:::i;:::-;11950:74;;12033:93;12122:3;12033:93;:::i;:::-;12151:2;12146:3;12142:12;12135:19;;11940:220;;;:::o;12166:366::-;12308:3;12329:67;12393:2;12388:3;12329:67;:::i;:::-;12322:74;;12405:93;12494:3;12405:93;:::i;:::-;12523:2;12518:3;12514:12;12507:19;;12312:220;;;:::o;12538:366::-;12680:3;12701:67;12765:2;12760:3;12701:67;:::i;:::-;12694:74;;12777:93;12866:3;12777:93;:::i;:::-;12895:2;12890:3;12886:12;12879:19;;12684:220;;;:::o;12910:366::-;13052:3;13073:67;13137:2;13132:3;13073:67;:::i;:::-;13066:74;;13149:93;13238:3;13149:93;:::i;:::-;13267:2;13262:3;13258:12;13251:19;;13056:220;;;:::o;13282:366::-;13424:3;13445:67;13509:2;13504:3;13445:67;:::i;:::-;13438:74;;13521:93;13610:3;13521:93;:::i;:::-;13639:2;13634:3;13630:12;13623:19;;13428:220;;;:::o;13654:366::-;13796:3;13817:67;13881:2;13876:3;13817:67;:::i;:::-;13810:74;;13893:93;13982:3;13893:93;:::i;:::-;14011:2;14006:3;14002:12;13995:19;;13800:220;;;:::o;14026:366::-;14168:3;14189:67;14253:2;14248:3;14189:67;:::i;:::-;14182:74;;14265:93;14354:3;14265:93;:::i;:::-;14383:2;14378:3;14374:12;14367:19;;14172:220;;;:::o;14398:366::-;14540:3;14561:67;14625:2;14620:3;14561:67;:::i;:::-;14554:74;;14637:93;14726:3;14637:93;:::i;:::-;14755:2;14750:3;14746:12;14739:19;;14544:220;;;:::o;14770:366::-;14912:3;14933:67;14997:2;14992:3;14933:67;:::i;:::-;14926:74;;15009:93;15098:3;15009:93;:::i;:::-;15127:2;15122:3;15118:12;15111:19;;14916:220;;;:::o;15142:366::-;15284:3;15305:67;15369:2;15364:3;15305:67;:::i;:::-;15298:74;;15381:93;15470:3;15381:93;:::i;:::-;15499:2;15494:3;15490:12;15483:19;;15288:220;;;:::o;15514:366::-;15656:3;15677:67;15741:2;15736:3;15677:67;:::i;:::-;15670:74;;15753:93;15842:3;15753:93;:::i;:::-;15871:2;15866:3;15862:12;15855:19;;15660:220;;;:::o;15886:366::-;16028:3;16049:67;16113:2;16108:3;16049:67;:::i;:::-;16042:74;;16125:93;16214:3;16125:93;:::i;:::-;16243:2;16238:3;16234:12;16227:19;;16032:220;;;:::o;16258:366::-;16400:3;16421:67;16485:2;16480:3;16421:67;:::i;:::-;16414:74;;16497:93;16586:3;16497:93;:::i;:::-;16615:2;16610:3;16606:12;16599:19;;16404:220;;;:::o;16630:366::-;16772:3;16793:67;16857:2;16852:3;16793:67;:::i;:::-;16786:74;;16869:93;16958:3;16869:93;:::i;:::-;16987:2;16982:3;16978:12;16971:19;;16776:220;;;:::o;17002:366::-;17144:3;17165:67;17229:2;17224:3;17165:67;:::i;:::-;17158:74;;17241:93;17330:3;17241:93;:::i;:::-;17359:2;17354:3;17350:12;17343:19;;17148:220;;;:::o;17374:366::-;17516:3;17537:67;17601:2;17596:3;17537:67;:::i;:::-;17530:74;;17613:93;17702:3;17613:93;:::i;:::-;17731:2;17726:3;17722:12;17715:19;;17520:220;;;:::o;17746:366::-;17888:3;17909:67;17973:2;17968:3;17909:67;:::i;:::-;17902:74;;17985:93;18074:3;17985:93;:::i;:::-;18103:2;18098:3;18094:12;18087:19;;17892:220;;;:::o;18118:366::-;18260:3;18281:67;18345:2;18340:3;18281:67;:::i;:::-;18274:74;;18357:93;18446:3;18357:93;:::i;:::-;18475:2;18470:3;18466:12;18459:19;;18264:220;;;:::o;18490:366::-;18632:3;18653:67;18717:2;18712:3;18653:67;:::i;:::-;18646:74;;18729:93;18818:3;18729:93;:::i;:::-;18847:2;18842:3;18838:12;18831:19;;18636:220;;;:::o;18862:398::-;19021:3;19042:83;19123:1;19118:3;19042:83;:::i;:::-;19035:90;;19134:93;19223:3;19134:93;:::i;:::-;19252:1;19247:3;19243:11;19236:18;;19025:235;;;:::o;19266:366::-;19408:3;19429:67;19493:2;19488:3;19429:67;:::i;:::-;19422:74;;19505:93;19594:3;19505:93;:::i;:::-;19623:2;19618:3;19614:12;19607:19;;19412:220;;;:::o;19638:366::-;19780:3;19801:67;19865:2;19860:3;19801:67;:::i;:::-;19794:74;;19877:93;19966:3;19877:93;:::i;:::-;19995:2;19990:3;19986:12;19979:19;;19784:220;;;:::o;20010:366::-;20152:3;20173:67;20237:2;20232:3;20173:67;:::i;:::-;20166:74;;20249:93;20338:3;20249:93;:::i;:::-;20367:2;20362:3;20358:12;20351:19;;20156:220;;;:::o;20382:118::-;20469:24;20487:5;20469:24;:::i;:::-;20464:3;20457:37;20447:53;;:::o;20506:157::-;20611:45;20631:24;20649:5;20631:24;:::i;:::-;20611:45;:::i;:::-;20606:3;20599:58;20589:74;;:::o;20669:429::-;20846:3;20868:92;20956:3;20947:6;20868:92;:::i;:::-;20861:99;;20977:95;21068:3;21059:6;20977:95;:::i;:::-;20970:102;;21089:3;21082:10;;20850:248;;;;;:::o;21104:379::-;21288:3;21310:147;21453:3;21310:147;:::i;:::-;21303:154;;21474:3;21467:10;;21292:191;;;:::o;21489:679::-;21685:3;21700:75;21771:3;21762:6;21700:75;:::i;:::-;21800:2;21795:3;21791:12;21784:19;;21813:75;21884:3;21875:6;21813:75;:::i;:::-;21913:2;21908:3;21904:12;21897:19;;21926:75;21997:3;21988:6;21926:75;:::i;:::-;22026:2;22021:3;22017:12;22010:19;;22039:75;22110:3;22101:6;22039:75;:::i;:::-;22139:2;22134:3;22130:12;22123:19;;22159:3;22152:10;;21689:479;;;;;;;:::o;22174:222::-;22267:4;22305:2;22294:9;22290:18;22282:26;;22318:71;22386:1;22375:9;22371:17;22362:6;22318:71;:::i;:::-;22272:124;;;;:::o;22402:442::-;22551:4;22589:2;22578:9;22574:18;22566:26;;22602:71;22670:1;22659:9;22655:17;22646:6;22602:71;:::i;:::-;22683:72;22751:2;22740:9;22736:18;22727:6;22683:72;:::i;:::-;22765;22833:2;22822:9;22818:18;22809:6;22765:72;:::i;:::-;22556:288;;;;;;:::o;22850:640::-;23045:4;23083:3;23072:9;23068:19;23060:27;;23097:71;23165:1;23154:9;23150:17;23141:6;23097:71;:::i;:::-;23178:72;23246:2;23235:9;23231:18;23222:6;23178:72;:::i;:::-;23260;23328:2;23317:9;23313:18;23304:6;23260:72;:::i;:::-;23379:9;23373:4;23369:20;23364:2;23353:9;23349:18;23342:48;23407:76;23478:4;23469:6;23407:76;:::i;:::-;23399:84;;23050:440;;;;;;;:::o;23496:332::-;23617:4;23655:2;23644:9;23640:18;23632:26;;23668:71;23736:1;23725:9;23721:17;23712:6;23668:71;:::i;:::-;23749:72;23817:2;23806:9;23802:18;23793:6;23749:72;:::i;:::-;23622:206;;;;;:::o;23834:210::-;23921:4;23959:2;23948:9;23944:18;23936:26;;23972:65;24034:1;24023:9;24019:17;24010:6;23972:65;:::i;:::-;23926:118;;;;:::o;24050:266::-;24165:4;24203:2;24192:9;24188:18;24180:26;;24216:93;24306:1;24295:9;24291:17;24282:6;24216:93;:::i;:::-;24170:146;;;;:::o;24322:270::-;24439:4;24477:2;24466:9;24462:18;24454:26;;24490:95;24582:1;24571:9;24567:17;24558:6;24490:95;:::i;:::-;24444:148;;;;:::o;24598:313::-;24711:4;24749:2;24738:9;24734:18;24726:26;;24798:9;24792:4;24788:20;24784:1;24773:9;24769:17;24762:47;24826:78;24899:4;24890:6;24826:78;:::i;:::-;24818:86;;24716:195;;;;:::o;24917:419::-;25083:4;25121:2;25110:9;25106:18;25098:26;;25170:9;25164:4;25160:20;25156:1;25145:9;25141:17;25134:47;25198:131;25324:4;25198:131;:::i;:::-;25190:139;;25088:248;;;:::o;25342:419::-;25508:4;25546:2;25535:9;25531:18;25523:26;;25595:9;25589:4;25585:20;25581:1;25570:9;25566:17;25559:47;25623:131;25749:4;25623:131;:::i;:::-;25615:139;;25513:248;;;:::o;25767:419::-;25933:4;25971:2;25960:9;25956:18;25948:26;;26020:9;26014:4;26010:20;26006:1;25995:9;25991:17;25984:47;26048:131;26174:4;26048:131;:::i;:::-;26040:139;;25938:248;;;:::o;26192:419::-;26358:4;26396:2;26385:9;26381:18;26373:26;;26445:9;26439:4;26435:20;26431:1;26420:9;26416:17;26409:47;26473:131;26599:4;26473:131;:::i;:::-;26465:139;;26363:248;;;:::o;26617:419::-;26783:4;26821:2;26810:9;26806:18;26798:26;;26870:9;26864:4;26860:20;26856:1;26845:9;26841:17;26834:47;26898:131;27024:4;26898:131;:::i;:::-;26890:139;;26788:248;;;:::o;27042:419::-;27208:4;27246:2;27235:9;27231:18;27223:26;;27295:9;27289:4;27285:20;27281:1;27270:9;27266:17;27259:47;27323:131;27449:4;27323:131;:::i;:::-;27315:139;;27213:248;;;:::o;27467:419::-;27633:4;27671:2;27660:9;27656:18;27648:26;;27720:9;27714:4;27710:20;27706:1;27695:9;27691:17;27684:47;27748:131;27874:4;27748:131;:::i;:::-;27740:139;;27638:248;;;:::o;27892:419::-;28058:4;28096:2;28085:9;28081:18;28073:26;;28145:9;28139:4;28135:20;28131:1;28120:9;28116:17;28109:47;28173:131;28299:4;28173:131;:::i;:::-;28165:139;;28063:248;;;:::o;28317:419::-;28483:4;28521:2;28510:9;28506:18;28498:26;;28570:9;28564:4;28560:20;28556:1;28545:9;28541:17;28534:47;28598:131;28724:4;28598:131;:::i;:::-;28590:139;;28488:248;;;:::o;28742:419::-;28908:4;28946:2;28935:9;28931:18;28923:26;;28995:9;28989:4;28985:20;28981:1;28970:9;28966:17;28959:47;29023:131;29149:4;29023:131;:::i;:::-;29015:139;;28913:248;;;:::o;29167:419::-;29333:4;29371:2;29360:9;29356:18;29348:26;;29420:9;29414:4;29410:20;29406:1;29395:9;29391:17;29384:47;29448:131;29574:4;29448:131;:::i;:::-;29440:139;;29338:248;;;:::o;29592:419::-;29758:4;29796:2;29785:9;29781:18;29773:26;;29845:9;29839:4;29835:20;29831:1;29820:9;29816:17;29809:47;29873:131;29999:4;29873:131;:::i;:::-;29865:139;;29763:248;;;:::o;30017:419::-;30183:4;30221:2;30210:9;30206:18;30198:26;;30270:9;30264:4;30260:20;30256:1;30245:9;30241:17;30234:47;30298:131;30424:4;30298:131;:::i;:::-;30290:139;;30188:248;;;:::o;30442:419::-;30608:4;30646:2;30635:9;30631:18;30623:26;;30695:9;30689:4;30685:20;30681:1;30670:9;30666:17;30659:47;30723:131;30849:4;30723:131;:::i;:::-;30715:139;;30613:248;;;:::o;30867:419::-;31033:4;31071:2;31060:9;31056:18;31048:26;;31120:9;31114:4;31110:20;31106:1;31095:9;31091:17;31084:47;31148:131;31274:4;31148:131;:::i;:::-;31140:139;;31038:248;;;:::o;31292:419::-;31458:4;31496:2;31485:9;31481:18;31473:26;;31545:9;31539:4;31535:20;31531:1;31520:9;31516:17;31509:47;31573:131;31699:4;31573:131;:::i;:::-;31565:139;;31463:248;;;:::o;31717:419::-;31883:4;31921:2;31910:9;31906:18;31898:26;;31970:9;31964:4;31960:20;31956:1;31945:9;31941:17;31934:47;31998:131;32124:4;31998:131;:::i;:::-;31990:139;;31888:248;;;:::o;32142:419::-;32308:4;32346:2;32335:9;32331:18;32323:26;;32395:9;32389:4;32385:20;32381:1;32370:9;32366:17;32359:47;32423:131;32549:4;32423:131;:::i;:::-;32415:139;;32313:248;;;:::o;32567:419::-;32733:4;32771:2;32760:9;32756:18;32748:26;;32820:9;32814:4;32810:20;32806:1;32795:9;32791:17;32784:47;32848:131;32974:4;32848:131;:::i;:::-;32840:139;;32738:248;;;:::o;32992:419::-;33158:4;33196:2;33185:9;33181:18;33173:26;;33245:9;33239:4;33235:20;33231:1;33220:9;33216:17;33209:47;33273:131;33399:4;33273:131;:::i;:::-;33265:139;;33163:248;;;:::o;33417:419::-;33583:4;33621:2;33610:9;33606:18;33598:26;;33670:9;33664:4;33660:20;33656:1;33645:9;33641:17;33634:47;33698:131;33824:4;33698:131;:::i;:::-;33690:139;;33588:248;;;:::o;33842:419::-;34008:4;34046:2;34035:9;34031:18;34023:26;;34095:9;34089:4;34085:20;34081:1;34070:9;34066:17;34059:47;34123:131;34249:4;34123:131;:::i;:::-;34115:139;;34013:248;;;:::o;34267:222::-;34360:4;34398:2;34387:9;34383:18;34375:26;;34411:71;34479:1;34468:9;34464:17;34455:6;34411:71;:::i;:::-;34365:124;;;;:::o;34495:129::-;34529:6;34556:20;;:::i;:::-;34546:30;;34585:33;34613:4;34605:6;34585:33;:::i;:::-;34536:88;;;:::o;34630:75::-;34663:6;34696:2;34690:9;34680:19;;34670:35;:::o;34711:307::-;34772:4;34862:18;34854:6;34851:30;34848:2;;;34884:18;;:::i;:::-;34848:2;34922:29;34944:6;34922:29;:::i;:::-;34914:37;;35006:4;35000;34996:15;34988:23;;34777:241;;;:::o;35024:308::-;35086:4;35176:18;35168:6;35165:30;35162:2;;;35198:18;;:::i;:::-;35162:2;35236:29;35258:6;35236:29;:::i;:::-;35228:37;;35320:4;35314;35310:15;35302:23;;35091:241;;;:::o;35338:141::-;35387:4;35410:3;35402:11;;35433:3;35430:1;35423:14;35467:4;35464:1;35454:18;35446:26;;35392:87;;;:::o;35485:98::-;35536:6;35570:5;35564:12;35554:22;;35543:40;;;:::o;35589:99::-;35641:6;35675:5;35669:12;35659:22;;35648:40;;;:::o;35694:168::-;35777:11;35811:6;35806:3;35799:19;35851:4;35846:3;35842:14;35827:29;;35789:73;;;;:::o;35868:147::-;35969:11;36006:3;35991:18;;35981:34;;;;:::o;36021:169::-;36105:11;36139:6;36134:3;36127:19;36179:4;36174:3;36170:14;36155:29;;36117:73;;;;:::o;36196:148::-;36298:11;36335:3;36320:18;;36310:34;;;;:::o;36350:305::-;36390:3;36409:20;36427:1;36409:20;:::i;:::-;36404:25;;36443:20;36461:1;36443:20;:::i;:::-;36438:25;;36597:1;36529:66;36525:74;36522:1;36519:81;36516:2;;;36603:18;;:::i;:::-;36516:2;36647:1;36644;36640:9;36633:16;;36394:261;;;;:::o;36661:185::-;36701:1;36718:20;36736:1;36718:20;:::i;:::-;36713:25;;36752:20;36770:1;36752:20;:::i;:::-;36747:25;;36791:1;36781:2;;36796:18;;:::i;:::-;36781:2;36838:1;36835;36831:9;36826:14;;36703:143;;;;:::o;36852:348::-;36892:7;36915:20;36933:1;36915:20;:::i;:::-;36910:25;;36949:20;36967:1;36949:20;:::i;:::-;36944:25;;37137:1;37069:66;37065:74;37062:1;37059:81;37054:1;37047:9;37040:17;37036:105;37033:2;;;37144:18;;:::i;:::-;37033:2;37192:1;37189;37185:9;37174:20;;36900:300;;;;:::o;37206:191::-;37246:4;37266:20;37284:1;37266:20;:::i;:::-;37261:25;;37300:20;37318:1;37300:20;:::i;:::-;37295:25;;37339:1;37336;37333:8;37330:2;;;37344:18;;:::i;:::-;37330:2;37389:1;37386;37382:9;37374:17;;37251:146;;;;:::o;37403:96::-;37440:7;37469:24;37487:5;37469:24;:::i;:::-;37458:35;;37448:51;;;:::o;37505:90::-;37539:7;37582:5;37575:13;37568:21;37557:32;;37547:48;;;:::o;37601:149::-;37637:7;37677:66;37670:5;37666:78;37655:89;;37645:105;;;:::o;37756:126::-;37793:7;37833:42;37826:5;37822:54;37811:65;;37801:81;;;:::o;37888:77::-;37925:7;37954:5;37943:16;;37933:32;;;:::o;37971:170::-;38043:9;38076:59;38129:5;38076:59;:::i;:::-;38063:72;;38053:88;;;:::o;38147:135::-;38219:9;38252:24;38270:5;38252:24;:::i;:::-;38239:37;;38229:53;;;:::o;38288:174::-;38362:9;38395:61;38450:5;38395:61;:::i;:::-;38382:74;;38372:90;;;:::o;38468:137::-;38542:9;38575:24;38593:5;38575:24;:::i;:::-;38562:37;;38552:53;;;:::o;38611:154::-;38695:6;38690:3;38685;38672:30;38757:1;38748:6;38743:3;38739:16;38732:27;38662:103;;;:::o;38771:307::-;38839:1;38849:113;38863:6;38860:1;38857:13;38849:113;;;38948:1;38943:3;38939:11;38933:18;38929:1;38924:3;38920:11;38913:39;38885:2;38882:1;38878:10;38873:15;;38849:113;;;38980:6;38977:1;38974:13;38971:2;;;39060:1;39051:6;39046:3;39042:16;39035:27;38971:2;38820:258;;;;:::o;39084:320::-;39128:6;39165:1;39159:4;39155:12;39145:22;;39212:1;39206:4;39202:12;39233:18;39223:2;;39289:4;39281:6;39277:17;39267:27;;39223:2;39351;39343:6;39340:14;39320:18;39317:38;39314:2;;;39370:18;;:::i;:::-;39314:2;39135:269;;;;:::o;39410:281::-;39493:27;39515:4;39493:27;:::i;:::-;39485:6;39481:40;39623:6;39611:10;39608:22;39587:18;39575:10;39572:34;39569:62;39566:2;;;39634:18;;:::i;:::-;39566:2;39674:10;39670:2;39663:22;39453:238;;;:::o;39697:233::-;39736:3;39759:24;39777:5;39759:24;:::i;:::-;39750:33;;39805:66;39798:5;39795:77;39792:2;;;39875:18;;:::i;:::-;39792:2;39922:1;39915:5;39911:13;39904:20;;39740:190;;;:::o;39936:100::-;39975:7;40004:26;40024:5;40004:26;:::i;:::-;39993:37;;39983:53;;;:::o;40042:94::-;40081:7;40110:20;40124:5;40110:20;:::i;:::-;40099:31;;40089:47;;;:::o;40142:79::-;40181:7;40210:5;40199:16;;40189:32;;;:::o;40227:176::-;40259:1;40276:20;40294:1;40276:20;:::i;:::-;40271:25;;40310:20;40328:1;40310:20;:::i;:::-;40305:25;;40349:1;40339:2;;40354:18;;:::i;:::-;40339:2;40395:1;40392;40388:9;40383:14;;40261:142;;;;:::o;40409:180::-;40457:77;40454:1;40447:88;40554:4;40551:1;40544:15;40578:4;40575:1;40568:15;40595:180;40643:77;40640:1;40633:88;40740:4;40737:1;40730:15;40764:4;40761:1;40754:15;40781:180;40829:77;40826:1;40819:88;40926:4;40923:1;40916:15;40950:4;40947:1;40940:15;40967:180;41015:77;41012:1;41005:88;41112:4;41109:1;41102:15;41136:4;41133:1;41126:15;41153:102;41194:6;41245:2;41241:7;41236:2;41229:5;41225:14;41221:28;41211:38;;41201:54;;;:::o;41261:94::-;41294:8;41342:5;41338:2;41334:14;41313:35;;41303:52;;;:::o;41361:173::-;41501:25;41497:1;41489:6;41485:14;41478:49;41467:67;:::o;41540:173::-;41680:25;41676:1;41668:6;41664:14;41657:49;41646:67;:::o;41719:237::-;41859:34;41855:1;41847:6;41843:14;41836:58;41928:20;41923:2;41915:6;41911:15;41904:45;41825:131;:::o;41962:225::-;42102:34;42098:1;42090:6;42086:14;42079:58;42171:8;42166:2;42158:6;42154:15;42147:33;42068:119;:::o;42193:178::-;42333:30;42329:1;42321:6;42317:14;42310:54;42299:72;:::o;42377:173::-;42517:25;42513:1;42505:6;42501:14;42494:49;42483:67;:::o;42556:223::-;42696:34;42692:1;42684:6;42680:14;42673:58;42765:6;42760:2;42752:6;42748:15;42741:31;42662:117;:::o;42785:175::-;42925:27;42921:1;42913:6;42909:14;42902:51;42891:69;:::o;42966:173::-;43106:25;43102:1;43094:6;43090:14;43083:49;43072:67;:::o;43145:231::-;43285:34;43281:1;43273:6;43269:14;43262:58;43354:14;43349:2;43341:6;43337:15;43330:39;43251:125;:::o;43382:243::-;43522:34;43518:1;43510:6;43506:14;43499:58;43591:26;43586:2;43578:6;43574:15;43567:51;43488:137;:::o;43631:229::-;43771:34;43767:1;43759:6;43755:14;43748:58;43840:12;43835:2;43827:6;43823:15;43816:37;43737:123;:::o;43866:228::-;44006:34;44002:1;43994:6;43990:14;43983:58;44075:11;44070:2;44062:6;44058:15;44051:36;43972:122;:::o;44100:182::-;44240:34;44236:1;44228:6;44224:14;44217:58;44206:76;:::o;44288:231::-;44428:34;44424:1;44416:6;44412:14;44405:58;44497:14;44492:2;44484:6;44480:15;44473:39;44394:125;:::o;44525:182::-;44665:34;44661:1;44653:6;44649:14;44642:58;44631:76;:::o;44713:170::-;44853:22;44849:1;44841:6;44837:14;44830:46;44819:64;:::o;44889:228::-;45029:34;45025:1;45017:6;45013:14;45006:58;45098:11;45093:2;45085:6;45081:15;45074:36;44995:122;:::o;45123:220::-;45263:34;45259:1;45251:6;45247:14;45240:58;45332:3;45327:2;45319:6;45315:15;45308:28;45229:114;:::o;45349:::-;45455:8;:::o;45469:236::-;45609:34;45605:1;45597:6;45593:14;45586:58;45678:19;45673:2;45665:6;45661:15;45654:44;45575:130;:::o;45711:171::-;45851:23;45847:1;45839:6;45835:14;45828:47;45817:65;:::o;45888:167::-;46028:19;46024:1;46016:6;46012:14;46005:43;45994:61;:::o;46061:122::-;46134:24;46152:5;46134:24;:::i;:::-;46127:5;46124:35;46114:2;;46173:1;46170;46163:12;46114:2;46104:79;:::o;46189:116::-;46259:21;46274:5;46259:21;:::i;:::-;46252:5;46249:32;46239:2;;46295:1;46292;46285:12;46239:2;46229:76;:::o;46311:120::-;46383:23;46400:5;46383:23;:::i;:::-;46376:5;46373:34;46363:2;;46421:1;46418;46411:12;46363:2;46353:78;:::o;46437:122::-;46510:24;46528:5;46510:24;:::i;:::-;46503:5;46500:35;46490:2;;46549:1;46546;46539:12;46490:2;46480:79;:::o
Swarm Source
ipfs://092083f98f088f021b16f4cc0580924d01118747ef7c5887f92def684ec51733
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.