ERC-721
Overview
Max Total Supply
192 PZMN
Holders
163
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 PZMNLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Pete_Zzaman
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-23 */ // Sources flattened with hardhat v2.11.2 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (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: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden 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 token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-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` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/finance/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. The distribution of shares is set at the * time of contract deployment and can't be updated thereafter. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Getter for the amount of payee's releasable Ether. */ function releasable(address account) public view returns (uint256) { uint256 totalReceived = address(this).balance + totalReleased(); return _pendingPayment(account, totalReceived, released(account)); } /** * @dev Getter for the amount of payee's releasable `token` tokens. `token` should be the address of an * IERC20 contract. */ function releasable(IERC20 token, address account) public view returns (uint256) { uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); return _pendingPayment(account, totalReceived, released(token, account)); } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(account); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(token, account); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File contracts/Pete_Zzaman.sol /* .:^!7???7!~~~~!!77777!~^:. .:~!77!~^:. ^!77??JJJ??~.:^~!7!~. :!77!^:. ^P5YPPGGGGGP5B~ :~??: .~77!^. ^G#&@@&&&@@&#P: :J~ ^7?~: .^7J555Y?7~: ?^ .!?!: .Y :7?^ J! ^??^ ^Y ^??: 5: ^J?: ?! ^J?: ^5 :??: P: :?J^ J7 .?J~ ~Y :?Y~ :P :?J~ :P ^JJ^ :G .!J7: :G .~7?~. :G .~7?!: ^G .~??!: ~P .^!?7~. JJ ?5?7!7??!^. P~ 7PPY^. .. !P 75Y?J7. 7Y^ ~P: .^7??!~:. 7Y. .^7Y?. .^!7???7!~^:. .. .^~!J5?!?B .:~!7??J??7!!~^:. !?77!~^~5!~?7 .:^^~!!!77???77!~~^^:... ?Y7^. :: ..::^~~!777??77777!!!~~^^::..... ...:!?P! ....::^~~!!777777??????7!!!!!!!!!!!!~~~~~~^: */ pragma solidity ^0.8.4; contract Pete_Zzaman is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable, PaymentSplitter { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; constructor(address[] memory _payees, uint256[] memory _shares) payable ERC721("Pete_Zzaman", "PZMN") PaymentSplitter(_payees, _shares) {} function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function safeMint(address to, string memory uri) public onlyOwner { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); _setTokenURI(tokenId, uri); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) whenNotPaused { super._beforeTokenTransfer(from, to, tokenId); } // The following functions are overrides required by Solidity. function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_shares","type":"uint256[]"}],"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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","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":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405260405162005af338038062005af3833981810160405281019062000029919062000780565b81816040518060400160405280600b81526020017f506574655f5a7a616d616e0000000000000000000000000000000000000000008152506040518060400160405280600481526020017f505a4d4e000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000af9291906200055e565b508060019080519060200190620000c89291906200055e565b5050506000600b60006101000a81548160ff02191690831515021790555062000106620000fa6200025660201b60201c565b6200025e60201b60201c565b80518251146200014d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001449062000927565b60405180910390fd5b600082511162000194576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018b906200096b565b60405180910390fd5b60005b82518110156200024b5762000235838281518110620001df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183838151811062000221577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516200032460201b60201c565b8080620002429062000b4e565b91505062000197565b505050505062000dad565b600033905090565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000397576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038e9062000905565b60405180910390fd5b60008111620003dd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003d4906200098d565b60405180910390fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000462576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004599062000949565b60405180910390fd5b6010829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c5462000519919062000a47565b600c819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac828260405162000552929190620008d8565b60405180910390a15050565b8280546200056c9062000ae2565b90600052602060002090601f016020900481019282620005905760008555620005dc565b82601f10620005ab57805160ff1916838001178555620005dc565b82800160010185558215620005dc579182015b82811115620005db578251825591602001919060010190620005be565b5b509050620005eb9190620005ef565b5090565b5b808211156200060a576000816000905550600101620005f0565b5090565b6000620006256200061f84620009d8565b620009af565b905080838252602082019050828560208602820111156200064557600080fd5b60005b858110156200067957816200065e8882620006f8565b84526020840193506020830192505060018101905062000648565b5050509392505050565b60006200069a620006948462000a07565b620009af565b90508083825260208201905082856020860282011115620006ba57600080fd5b60005b85811015620006ee5781620006d3888262000769565b845260208401935060208301925050600181019050620006bd565b5050509392505050565b600081519050620007098162000d79565b92915050565b600082601f8301126200072157600080fd5b8151620007338482602086016200060e565b91505092915050565b600082601f8301126200074e57600080fd5b81516200076084826020860162000683565b91505092915050565b6000815190506200077a8162000d93565b92915050565b600080604083850312156200079457600080fd5b600083015167ffffffffffffffff811115620007af57600080fd5b620007bd858286016200070f565b925050602083015167ffffffffffffffff811115620007db57600080fd5b620007e9858286016200073c565b9150509250929050565b620007fe8162000aa4565b82525050565b600062000813602c8362000a36565b9150620008208262000c3a565b604082019050919050565b60006200083a60328362000a36565b9150620008478262000c89565b604082019050919050565b600062000861602b8362000a36565b91506200086e8262000cd8565b604082019050919050565b600062000888601a8362000a36565b9150620008958262000d27565b602082019050919050565b6000620008af601d8362000a36565b9150620008bc8262000d50565b602082019050919050565b620008d28162000ad8565b82525050565b6000604082019050620008ef6000830185620007f3565b620008fe6020830184620008c7565b9392505050565b60006020820190508181036000830152620009208162000804565b9050919050565b6000602082019050818103600083015262000942816200082b565b9050919050565b60006020820190508181036000830152620009648162000852565b9050919050565b60006020820190508181036000830152620009868162000879565b9050919050565b60006020820190508181036000830152620009a881620008a0565b9050919050565b6000620009bb620009ce565b9050620009c9828262000b18565b919050565b6000604051905090565b600067ffffffffffffffff821115620009f657620009f562000bfa565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000a255762000a2462000bfa565b5b602082029050602081019050919050565b600082825260208201905092915050565b600062000a548262000ad8565b915062000a618362000ad8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000a995762000a9862000b9c565b5b828201905092915050565b600062000ab18262000ab8565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000afb57607f821691505b6020821081141562000b125762000b1162000bcb565b5b50919050565b62000b238262000c29565b810181811067ffffffffffffffff8211171562000b455762000b4462000bfa565b5b80604052505050565b600062000b5b8262000ad8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000b915762000b9062000b9c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b62000d848162000aa4565b811462000d9057600080fd5b50565b62000d9e8162000ad8565b811462000daa57600080fd5b50565b614d368062000dbd6000396000f3fe6080604052600436106101fd5760003560e01c8063715018a61161010d578063b88d4fde116100a0578063d204c45e1161006f578063d204c45e146107c8578063d79779b2146107f1578063e33b7de31461082e578063e985e9c514610859578063f2fde38b1461089657610244565b8063b88d4fde146106e8578063c45ac05014610711578063c87b56dd1461074e578063ce7c2ac21461078b57610244565b806395d89b41116100dc57806395d89b411461061a5780639852595c14610645578063a22cb46514610682578063a3f8eace146106ab57610244565b8063715018a6146105845780638456cb591461059b5780638b83209b146105b25780638da5cb5b146105ef57610244565b80633a98ef391161019057806348b750441161015f57806348b75044146104795780634f6ccce7146104a25780635c975abb146104df5780636352211e1461050a57806370a082311461054757610244565b80633a98ef39146103d15780633f4ba83a146103fc578063406072a91461041357806342842e0e1461045057610244565b806318160ddd116101cc57806318160ddd14610317578063191655871461034257806323b872dd1461036b5780632f745c591461039457610244565b806301ffc9a71461024957806306fdde0314610286578063081812fc146102b1578063095ea7b3146102ee57610244565b36610244577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061022b6108bf565b3460405161023a929190613dcd565b60405180910390a1005b600080fd5b34801561025557600080fd5b50610270600480360381019061026b9190613746565b6108c7565b60405161027d9190613df6565b60405180910390f35b34801561029257600080fd5b5061029b6108d9565b6040516102a89190613e11565b60405180910390f35b3480156102bd57600080fd5b506102d860048036038101906102d391906137fd565b61096b565b6040516102e59190613d3d565b60405180910390f35b3480156102fa57600080fd5b50610315600480360381019061031091906136e1565b6109b1565b005b34801561032357600080fd5b5061032c610ac9565b6040516103399190614153565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190613522565b610ad6565b005b34801561037757600080fd5b50610392600480360381019061038d9190613587565b610c5f565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906136e1565b610cbf565b6040516103c89190614153565b60405180910390f35b3480156103dd57600080fd5b506103e6610d64565b6040516103f39190614153565b60405180910390f35b34801561040857600080fd5b50610411610d6e565b005b34801561041f57600080fd5b5061043a600480360381019061043591906137c1565b610d80565b6040516104479190614153565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190613587565b610e07565b005b34801561048557600080fd5b506104a0600480360381019061049b91906137c1565b610e27565b005b3480156104ae57600080fd5b506104c960048036038101906104c491906137fd565b611044565b6040516104d69190614153565b60405180910390f35b3480156104eb57600080fd5b506104f46110db565b6040516105019190613df6565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906137fd565b6110f2565b60405161053e9190613d3d565b60405180910390f35b34801561055357600080fd5b5061056e600480360381019061056991906134f9565b6111a4565b60405161057b9190614153565b60405180910390f35b34801561059057600080fd5b5061059961125c565b005b3480156105a757600080fd5b506105b0611270565b005b3480156105be57600080fd5b506105d960048036038101906105d491906137fd565b611282565b6040516105e69190613d3d565b60405180910390f35b3480156105fb57600080fd5b506106046112f0565b6040516106119190613d3d565b60405180910390f35b34801561062657600080fd5b5061062f61131a565b60405161063c9190613e11565b60405180910390f35b34801561065157600080fd5b5061066c600480360381019061066791906134f9565b6113ac565b6040516106799190614153565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a49190613651565b6113f5565b005b3480156106b757600080fd5b506106d260048036038101906106cd91906134f9565b61140b565b6040516106df9190614153565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a91906135d6565b61143e565b005b34801561071d57600080fd5b50610738600480360381019061073391906137c1565b6114a0565b6040516107459190614153565b60405180910390f35b34801561075a57600080fd5b50610775600480360381019061077091906137fd565b61155e565b6040516107829190613e11565b60405180910390f35b34801561079757600080fd5b506107b260048036038101906107ad91906134f9565b611570565b6040516107bf9190614153565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea919061368d565b6115b9565b005b3480156107fd57600080fd5b5061081860048036038101906108139190613798565b6115f2565b6040516108259190614153565b60405180910390f35b34801561083a57600080fd5b5061084361163b565b6040516108509190614153565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b919061354b565b611645565b60405161088d9190613df6565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b891906134f9565b6116d9565b005b600033905090565b60006108d28261175d565b9050919050565b6060600080546108e890614468565b80601f016020809104026020016040519081016040528092919081815260200182805461091490614468565b80156109615780601f1061093657610100808354040283529160200191610961565b820191906000526020600020905b81548152906001019060200180831161094457829003601f168201915b5050505050905090565b6000610976826117d7565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109bc826110f2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a24906140b3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4c6108bf565b73ffffffffffffffffffffffffffffffffffffffff161480610a7b5750610a7a81610a756108bf565b611645565b5b610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab190614033565b60405180910390fd5b610ac48383611822565b505050565b6000600880549050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4f90613ef3565b60405180910390fd5b6000610b638261140b565b90506000811415610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba090613fb3565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bf89190614243565b9250508190555080600d6000828254610c119190614243565b92505081905550610c2282826118db565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568282604051610c53929190613d58565b60405180910390a15050565b610c70610c6a6108bf565b826119cf565b610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca690614133565b60405180910390fd5b610cba838383611a64565b505050565b6000610cca836111a4565b8210610d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0290613e53565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600c54905090565b610d76611ccb565b610d7e611d49565b565b6000601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e228383836040518060200160405280600081525061143e565b505050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090613ef3565b60405180910390fd5b6000610eb583836114a0565b90506000811415610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef290613fb3565b60405180910390fd5b80601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f879190614243565b9250508190555080601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fdd9190614243565b92505081905550610fef838383611dac565b8273ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8383604051611037929190613dcd565b60405180910390a2505050565b600061104e610ac9565b821061108f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611086906140f3565b60405180910390fd5b600882815481106110c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561119b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119290614093565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c90613ff3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611264611ccb565b61126e6000611e32565b565b611278611ccb565b611280611ef8565b565b6000601082815481106112be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461132990614468565b80601f016020809104026020016040519081016040528092919081815260200182805461135590614468565b80156113a25780601f10611377576101008083540402835291602001916113a2565b820191906000526020600020905b81548152906001019060200180831161138557829003601f168201915b5050505050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114076114006108bf565b8383611f5b565b5050565b60008061141661163b565b476114219190614243565b90506114368382611431866113ac565b6120c8565b915050919050565b61144f6114496108bf565b836119cf565b61148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590614133565b60405180910390fd5b61149a84848484612136565b50505050565b6000806114ac846115f2565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114e59190613d3d565b60206040518083038186803b1580156114fd57600080fd5b505afa158015611511573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115359190613826565b61153f9190614243565b905061155583826115508787610d80565b6120c8565b91505092915050565b606061156982612192565b9050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115c1611ccb565b60006115cd60136122a5565b90506115d960136122b3565b6115e383826122c9565b6115ed81836122e7565b505050565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600d54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116e1611ccb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890613e93565b60405180910390fd5b61175a81611e32565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117d057506117cf8261235b565b5b9050919050565b6117e08161243d565b61181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614093565b60405180910390fd5b50565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611895836110f2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8047101561191e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191590613f73565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161194490613d28565b60006040518083038185875af1925050503d8060008114611981576040519150601f19603f3d011682016040523d82523d6000602084013e611986565b606091505b50509050806119ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c190613f53565b60405180910390fd5b505050565b6000806119db836110f2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a1d5750611a1c8185611645565b5b80611a5b57508373ffffffffffffffffffffffffffffffffffffffff16611a438461096b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a84826110f2565b73ffffffffffffffffffffffffffffffffffffffff1614611ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad190613eb3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4190613f13565b60405180910390fd5b611b558383836124a9565b611b60600082611822565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bb09190614324565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c079190614243565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cc68383836124c1565b505050565b611cd36108bf565b73ffffffffffffffffffffffffffffffffffffffff16611cf16112f0565b73ffffffffffffffffffffffffffffffffffffffff1614611d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e90614073565b60405180910390fd5b565b611d516124c6565b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611d956108bf565b604051611da29190613d3d565b60405180910390a1565b611e2d8363a9059cbb60e01b8484604051602401611dcb929190613dcd565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061250f565b505050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f006125d6565b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f446108bf565b604051611f519190613d3d565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc190613f33565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120bb9190613df6565b60405180910390a3505050565b600081600c54600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561211991906142ca565b6121239190614299565b61212d9190614324565b90509392505050565b612141848484611a64565b61214d84848484612620565b61218c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218390613e73565b60405180910390fd5b50505050565b606061219d826117d7565b6000600a600084815260200190815260200160002080546121bd90614468565b80601f01602080910402602001604051908101604052809291908181526020018280546121e990614468565b80156122365780601f1061220b57610100808354040283529160200191612236565b820191906000526020600020905b81548152906001019060200180831161221957829003601f168201915b5050505050905060006122476127b7565b905060008151141561225d5781925050506122a0565b60008251111561229257808260405160200161227a929190613d04565b604051602081830303815290604052925050506122a0565b61229b846127ce565b925050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6122e3828260405180602001604052806000815250612836565b5050565b6122f08261243d565b61232f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232690614013565b60405180910390fd5b80600a600084815260200190815260200160002090805190602001906123569291906132c9565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061242657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612436575061243582612891565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6124b16125d6565b6124bc8383836128fb565b505050565b505050565b6124ce6110db565b61250d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250490613e33565b60405180910390fd5b565b6000612571826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a0f9092919063ffffffff16565b90506000815111156125d15780806020019051810190612591919061371d565b6125d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c790614113565b60405180910390fd5b5b505050565b6125de6110db565b1561261e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261590613fd3565b60405180910390fd5b565b60006126418473ffffffffffffffffffffffffffffffffffffffff16612a27565b156127aa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261266a6108bf565b8786866040518563ffffffff1660e01b815260040161268c9493929190613d81565b602060405180830381600087803b1580156126a657600080fd5b505af19250505080156126d757506040513d601f19601f820116820180604052508101906126d4919061376f565b60015b61275a573d8060008114612707576040519150601f19603f3d011682016040523d82523d6000602084013e61270c565b606091505b50600081511415612752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274990613e73565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127af565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606127d9826117d7565b60006127e36127b7565b90506000815111612803576040518060200160405280600081525061282e565b8061280d84612a4a565b60405160200161281e929190613d04565b6040516020818303038152906040525b915050919050565b6128408383612bf7565b61284d6000848484612620565b61288c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288390613e73565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612906838383612dd1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129495761294481612dd6565b612988565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612987576129868382612e1f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129cb576129c681612f8c565b612a0a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a0957612a0882826130cf565b5b5b505050565b6060612a1e848460008561314e565b90509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415612a92576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bf2565b600082905060005b60008214612ac4578080612aad906144cb565b915050600a82612abd9190614299565b9150612a9a565b60008167ffffffffffffffff811115612b06577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b385781602001600182028036833780820191505090505b5090505b60008514612beb57600182612b519190614324565b9150600a85612b609190614514565b6030612b6c9190614243565b60f81b818381518110612ba8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612be49190614299565b9450612b3c565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5e90614053565b60405180910390fd5b612c708161243d565b15612cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca790613ed3565b60405180910390fd5b612cbc600083836124a9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d0c9190614243565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612dcd600083836124c1565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e2c846111a4565b612e369190614324565b9050600060076000848152602001908152602001600020549050818114612f1b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612fa09190614324565b9050600060096000848152602001908152602001600020549050600060088381548110612ff6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061303e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806130b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006130da836111a4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b606082471015613193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318a90613f93565b60405180910390fd5b61319c85612a27565b6131db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d2906140d3565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132049190613ced565b60006040518083038185875af1925050503d8060008114613241576040519150601f19603f3d011682016040523d82523d6000602084013e613246565b606091505b5091509150613256828286613262565b92505050949350505050565b60608315613272578290506132c2565b6000835111156132855782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b99190613e11565b60405180910390fd5b9392505050565b8280546132d590614468565b90600052602060002090601f0160209004810192826132f7576000855561333e565b82601f1061331057805160ff191683800117855561333e565b8280016001018555821561333e579182015b8281111561333d578251825591602001919060010190613322565b5b50905061334b919061334f565b5090565b5b80821115613368576000816000905550600101613350565b5090565b600061337f61337a84614193565b61416e565b90508281526020810184848401111561339757600080fd5b6133a2848285614426565b509392505050565b60006133bd6133b8846141c4565b61416e565b9050828152602081018484840111156133d557600080fd5b6133e0848285614426565b509392505050565b6000813590506133f781614c76565b92915050565b60008135905061340c81614c8d565b92915050565b60008135905061342181614ca4565b92915050565b60008151905061343681614ca4565b92915050565b60008135905061344b81614cbb565b92915050565b60008151905061346081614cbb565b92915050565b600082601f83011261347757600080fd5b813561348784826020860161336c565b91505092915050565b60008135905061349f81614cd2565b92915050565b600082601f8301126134b657600080fd5b81356134c68482602086016133aa565b91505092915050565b6000813590506134de81614ce9565b92915050565b6000815190506134f381614ce9565b92915050565b60006020828403121561350b57600080fd5b6000613519848285016133e8565b91505092915050565b60006020828403121561353457600080fd5b6000613542848285016133fd565b91505092915050565b6000806040838503121561355e57600080fd5b600061356c858286016133e8565b925050602061357d858286016133e8565b9150509250929050565b60008060006060848603121561359c57600080fd5b60006135aa868287016133e8565b93505060206135bb868287016133e8565b92505060406135cc868287016134cf565b9150509250925092565b600080600080608085870312156135ec57600080fd5b60006135fa878288016133e8565b945050602061360b878288016133e8565b935050604061361c878288016134cf565b925050606085013567ffffffffffffffff81111561363957600080fd5b61364587828801613466565b91505092959194509250565b6000806040838503121561366457600080fd5b6000613672858286016133e8565b925050602061368385828601613412565b9150509250929050565b600080604083850312156136a057600080fd5b60006136ae858286016133e8565b925050602083013567ffffffffffffffff8111156136cb57600080fd5b6136d7858286016134a5565b9150509250929050565b600080604083850312156136f457600080fd5b6000613702858286016133e8565b9250506020613713858286016134cf565b9150509250929050565b60006020828403121561372f57600080fd5b600061373d84828501613427565b91505092915050565b60006020828403121561375857600080fd5b60006137668482850161343c565b91505092915050565b60006020828403121561378157600080fd5b600061378f84828501613451565b91505092915050565b6000602082840312156137aa57600080fd5b60006137b884828501613490565b91505092915050565b600080604083850312156137d457600080fd5b60006137e285828601613490565b92505060206137f3858286016133e8565b9150509250929050565b60006020828403121561380f57600080fd5b600061381d848285016134cf565b91505092915050565b60006020828403121561383857600080fd5b6000613846848285016134e4565b91505092915050565b613858816143f0565b82525050565b61386781614358565b82525050565b6138768161437c565b82525050565b6000613887826141f5565b613891818561420b565b93506138a1818560208601614435565b6138aa81614601565b840191505092915050565b60006138c0826141f5565b6138ca818561421c565b93506138da818560208601614435565b80840191505092915050565b60006138f182614200565b6138fb8185614227565b935061390b818560208601614435565b61391481614601565b840191505092915050565b600061392a82614200565b6139348185614238565b9350613944818560208601614435565b80840191505092915050565b600061395d601483614227565b915061396882614612565b602082019050919050565b6000613980602b83614227565b915061398b8261463b565b604082019050919050565b60006139a3603283614227565b91506139ae8261468a565b604082019050919050565b60006139c6602683614227565b91506139d1826146d9565b604082019050919050565b60006139e9602583614227565b91506139f482614728565b604082019050919050565b6000613a0c601c83614227565b9150613a1782614777565b602082019050919050565b6000613a2f602683614227565b9150613a3a826147a0565b604082019050919050565b6000613a52602483614227565b9150613a5d826147ef565b604082019050919050565b6000613a75601983614227565b9150613a808261483e565b602082019050919050565b6000613a98603a83614227565b9150613aa382614867565b604082019050919050565b6000613abb601d83614227565b9150613ac6826148b6565b602082019050919050565b6000613ade602683614227565b9150613ae9826148df565b604082019050919050565b6000613b01602b83614227565b9150613b0c8261492e565b604082019050919050565b6000613b24601083614227565b9150613b2f8261497d565b602082019050919050565b6000613b47602983614227565b9150613b52826149a6565b604082019050919050565b6000613b6a602e83614227565b9150613b75826149f5565b604082019050919050565b6000613b8d603e83614227565b9150613b9882614a44565b604082019050919050565b6000613bb0602083614227565b9150613bbb82614a93565b602082019050919050565b6000613bd3602083614227565b9150613bde82614abc565b602082019050919050565b6000613bf6601883614227565b9150613c0182614ae5565b602082019050919050565b6000613c19602183614227565b9150613c2482614b0e565b604082019050919050565b6000613c3c60008361421c565b9150613c4782614b5d565b600082019050919050565b6000613c5f601d83614227565b9150613c6a82614b60565b602082019050919050565b6000613c82602c83614227565b9150613c8d82614b89565b604082019050919050565b6000613ca5602a83614227565b9150613cb082614bd8565b604082019050919050565b6000613cc8602e83614227565b9150613cd382614c27565b604082019050919050565b613ce7816143e6565b82525050565b6000613cf982846138b5565b915081905092915050565b6000613d10828561391f565b9150613d1c828461391f565b91508190509392505050565b6000613d3382613c2f565b9150819050919050565b6000602082019050613d52600083018461385e565b92915050565b6000604082019050613d6d600083018561384f565b613d7a6020830184613cde565b9392505050565b6000608082019050613d96600083018761385e565b613da3602083018661385e565b613db06040830185613cde565b8181036060830152613dc2818461387c565b905095945050505050565b6000604082019050613de2600083018561385e565b613def6020830184613cde565b9392505050565b6000602082019050613e0b600083018461386d565b92915050565b60006020820190508181036000830152613e2b81846138e6565b905092915050565b60006020820190508181036000830152613e4c81613950565b9050919050565b60006020820190508181036000830152613e6c81613973565b9050919050565b60006020820190508181036000830152613e8c81613996565b9050919050565b60006020820190508181036000830152613eac816139b9565b9050919050565b60006020820190508181036000830152613ecc816139dc565b9050919050565b60006020820190508181036000830152613eec816139ff565b9050919050565b60006020820190508181036000830152613f0c81613a22565b9050919050565b60006020820190508181036000830152613f2c81613a45565b9050919050565b60006020820190508181036000830152613f4c81613a68565b9050919050565b60006020820190508181036000830152613f6c81613a8b565b9050919050565b60006020820190508181036000830152613f8c81613aae565b9050919050565b60006020820190508181036000830152613fac81613ad1565b9050919050565b60006020820190508181036000830152613fcc81613af4565b9050919050565b60006020820190508181036000830152613fec81613b17565b9050919050565b6000602082019050818103600083015261400c81613b3a565b9050919050565b6000602082019050818103600083015261402c81613b5d565b9050919050565b6000602082019050818103600083015261404c81613b80565b9050919050565b6000602082019050818103600083015261406c81613ba3565b9050919050565b6000602082019050818103600083015261408c81613bc6565b9050919050565b600060208201905081810360008301526140ac81613be9565b9050919050565b600060208201905081810360008301526140cc81613c0c565b9050919050565b600060208201905081810360008301526140ec81613c52565b9050919050565b6000602082019050818103600083015261410c81613c75565b9050919050565b6000602082019050818103600083015261412c81613c98565b9050919050565b6000602082019050818103600083015261414c81613cbb565b9050919050565b60006020820190506141686000830184613cde565b92915050565b6000614178614189565b9050614184828261449a565b919050565b6000604051905090565b600067ffffffffffffffff8211156141ae576141ad6145d2565b5b6141b782614601565b9050602081019050919050565b600067ffffffffffffffff8211156141df576141de6145d2565b5b6141e882614601565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061424e826143e6565b9150614259836143e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561428e5761428d614545565b5b828201905092915050565b60006142a4826143e6565b91506142af836143e6565b9250826142bf576142be614574565b5b828204905092915050565b60006142d5826143e6565b91506142e0836143e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561431957614318614545565b5b828202905092915050565b600061432f826143e6565b915061433a836143e6565b92508282101561434d5761434c614545565b5b828203905092915050565b6000614363826143c6565b9050919050565b6000614375826143c6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006143bf82614358565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006143fb82614402565b9050919050565b600061440d82614414565b9050919050565b600061441f826143c6565b9050919050565b82818337600083830152505050565b60005b83811015614453578082015181840152602081019050614438565b83811115614462576000848401525b50505050565b6000600282049050600182168061448057607f821691505b60208210811415614494576144936145a3565b5b50919050565b6144a382614601565b810181811067ffffffffffffffff821117156144c2576144c16145d2565b5b80604052505050565b60006144d6826143e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561450957614508614545565b5b600182019050919050565b600061451f826143e6565b915061452a836143e6565b92508261453a57614539614574565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b614c7f81614358565b8114614c8a57600080fd5b50565b614c968161436a565b8114614ca157600080fd5b50565b614cad8161437c565b8114614cb857600080fd5b50565b614cc481614388565b8114614ccf57600080fd5b50565b614cdb816143b4565b8114614ce657600080fd5b50565b614cf2816143e6565b8114614cfd57600080fd5b5056fea2646970667358221220c100234af20a98a80ddf79631b0924c03fa0b8c8baa8f1e4b770caf8cb0a56a564736f6c63430008040033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000d493d02df12ec7096895ec612ab297b9756ebcfe000000000000000000000000c3c2adf381caff20852db28d624bff1690284c8c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032
Deployed Bytecode
0x6080604052600436106101fd5760003560e01c8063715018a61161010d578063b88d4fde116100a0578063d204c45e1161006f578063d204c45e146107c8578063d79779b2146107f1578063e33b7de31461082e578063e985e9c514610859578063f2fde38b1461089657610244565b8063b88d4fde146106e8578063c45ac05014610711578063c87b56dd1461074e578063ce7c2ac21461078b57610244565b806395d89b41116100dc57806395d89b411461061a5780639852595c14610645578063a22cb46514610682578063a3f8eace146106ab57610244565b8063715018a6146105845780638456cb591461059b5780638b83209b146105b25780638da5cb5b146105ef57610244565b80633a98ef391161019057806348b750441161015f57806348b75044146104795780634f6ccce7146104a25780635c975abb146104df5780636352211e1461050a57806370a082311461054757610244565b80633a98ef39146103d15780633f4ba83a146103fc578063406072a91461041357806342842e0e1461045057610244565b806318160ddd116101cc57806318160ddd14610317578063191655871461034257806323b872dd1461036b5780632f745c591461039457610244565b806301ffc9a71461024957806306fdde0314610286578063081812fc146102b1578063095ea7b3146102ee57610244565b36610244577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061022b6108bf565b3460405161023a929190613dcd565b60405180910390a1005b600080fd5b34801561025557600080fd5b50610270600480360381019061026b9190613746565b6108c7565b60405161027d9190613df6565b60405180910390f35b34801561029257600080fd5b5061029b6108d9565b6040516102a89190613e11565b60405180910390f35b3480156102bd57600080fd5b506102d860048036038101906102d391906137fd565b61096b565b6040516102e59190613d3d565b60405180910390f35b3480156102fa57600080fd5b50610315600480360381019061031091906136e1565b6109b1565b005b34801561032357600080fd5b5061032c610ac9565b6040516103399190614153565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190613522565b610ad6565b005b34801561037757600080fd5b50610392600480360381019061038d9190613587565b610c5f565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906136e1565b610cbf565b6040516103c89190614153565b60405180910390f35b3480156103dd57600080fd5b506103e6610d64565b6040516103f39190614153565b60405180910390f35b34801561040857600080fd5b50610411610d6e565b005b34801561041f57600080fd5b5061043a600480360381019061043591906137c1565b610d80565b6040516104479190614153565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190613587565b610e07565b005b34801561048557600080fd5b506104a0600480360381019061049b91906137c1565b610e27565b005b3480156104ae57600080fd5b506104c960048036038101906104c491906137fd565b611044565b6040516104d69190614153565b60405180910390f35b3480156104eb57600080fd5b506104f46110db565b6040516105019190613df6565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906137fd565b6110f2565b60405161053e9190613d3d565b60405180910390f35b34801561055357600080fd5b5061056e600480360381019061056991906134f9565b6111a4565b60405161057b9190614153565b60405180910390f35b34801561059057600080fd5b5061059961125c565b005b3480156105a757600080fd5b506105b0611270565b005b3480156105be57600080fd5b506105d960048036038101906105d491906137fd565b611282565b6040516105e69190613d3d565b60405180910390f35b3480156105fb57600080fd5b506106046112f0565b6040516106119190613d3d565b60405180910390f35b34801561062657600080fd5b5061062f61131a565b60405161063c9190613e11565b60405180910390f35b34801561065157600080fd5b5061066c600480360381019061066791906134f9565b6113ac565b6040516106799190614153565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a49190613651565b6113f5565b005b3480156106b757600080fd5b506106d260048036038101906106cd91906134f9565b61140b565b6040516106df9190614153565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a91906135d6565b61143e565b005b34801561071d57600080fd5b50610738600480360381019061073391906137c1565b6114a0565b6040516107459190614153565b60405180910390f35b34801561075a57600080fd5b50610775600480360381019061077091906137fd565b61155e565b6040516107829190613e11565b60405180910390f35b34801561079757600080fd5b506107b260048036038101906107ad91906134f9565b611570565b6040516107bf9190614153565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea919061368d565b6115b9565b005b3480156107fd57600080fd5b5061081860048036038101906108139190613798565b6115f2565b6040516108259190614153565b60405180910390f35b34801561083a57600080fd5b5061084361163b565b6040516108509190614153565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b919061354b565b611645565b60405161088d9190613df6565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b891906134f9565b6116d9565b005b600033905090565b60006108d28261175d565b9050919050565b6060600080546108e890614468565b80601f016020809104026020016040519081016040528092919081815260200182805461091490614468565b80156109615780601f1061093657610100808354040283529160200191610961565b820191906000526020600020905b81548152906001019060200180831161094457829003601f168201915b5050505050905090565b6000610976826117d7565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109bc826110f2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a24906140b3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4c6108bf565b73ffffffffffffffffffffffffffffffffffffffff161480610a7b5750610a7a81610a756108bf565b611645565b5b610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab190614033565b60405180910390fd5b610ac48383611822565b505050565b6000600880549050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4f90613ef3565b60405180910390fd5b6000610b638261140b565b90506000811415610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba090613fb3565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bf89190614243565b9250508190555080600d6000828254610c119190614243565b92505081905550610c2282826118db565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568282604051610c53929190613d58565b60405180910390a15050565b610c70610c6a6108bf565b826119cf565b610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca690614133565b60405180910390fd5b610cba838383611a64565b505050565b6000610cca836111a4565b8210610d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0290613e53565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600c54905090565b610d76611ccb565b610d7e611d49565b565b6000601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e228383836040518060200160405280600081525061143e565b505050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090613ef3565b60405180910390fd5b6000610eb583836114a0565b90506000811415610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef290613fb3565b60405180910390fd5b80601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f879190614243565b9250508190555080601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fdd9190614243565b92505081905550610fef838383611dac565b8273ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8383604051611037929190613dcd565b60405180910390a2505050565b600061104e610ac9565b821061108f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611086906140f3565b60405180910390fd5b600882815481106110c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561119b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119290614093565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c90613ff3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611264611ccb565b61126e6000611e32565b565b611278611ccb565b611280611ef8565b565b6000601082815481106112be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461132990614468565b80601f016020809104026020016040519081016040528092919081815260200182805461135590614468565b80156113a25780601f10611377576101008083540402835291602001916113a2565b820191906000526020600020905b81548152906001019060200180831161138557829003601f168201915b5050505050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114076114006108bf565b8383611f5b565b5050565b60008061141661163b565b476114219190614243565b90506114368382611431866113ac565b6120c8565b915050919050565b61144f6114496108bf565b836119cf565b61148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590614133565b60405180910390fd5b61149a84848484612136565b50505050565b6000806114ac846115f2565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114e59190613d3d565b60206040518083038186803b1580156114fd57600080fd5b505afa158015611511573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115359190613826565b61153f9190614243565b905061155583826115508787610d80565b6120c8565b91505092915050565b606061156982612192565b9050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115c1611ccb565b60006115cd60136122a5565b90506115d960136122b3565b6115e383826122c9565b6115ed81836122e7565b505050565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600d54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116e1611ccb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890613e93565b60405180910390fd5b61175a81611e32565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117d057506117cf8261235b565b5b9050919050565b6117e08161243d565b61181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614093565b60405180910390fd5b50565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611895836110f2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8047101561191e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191590613f73565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161194490613d28565b60006040518083038185875af1925050503d8060008114611981576040519150601f19603f3d011682016040523d82523d6000602084013e611986565b606091505b50509050806119ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c190613f53565b60405180910390fd5b505050565b6000806119db836110f2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a1d5750611a1c8185611645565b5b80611a5b57508373ffffffffffffffffffffffffffffffffffffffff16611a438461096b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a84826110f2565b73ffffffffffffffffffffffffffffffffffffffff1614611ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad190613eb3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4190613f13565b60405180910390fd5b611b558383836124a9565b611b60600082611822565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bb09190614324565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c079190614243565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cc68383836124c1565b505050565b611cd36108bf565b73ffffffffffffffffffffffffffffffffffffffff16611cf16112f0565b73ffffffffffffffffffffffffffffffffffffffff1614611d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e90614073565b60405180910390fd5b565b611d516124c6565b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611d956108bf565b604051611da29190613d3d565b60405180910390a1565b611e2d8363a9059cbb60e01b8484604051602401611dcb929190613dcd565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061250f565b505050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f006125d6565b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f446108bf565b604051611f519190613d3d565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc190613f33565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120bb9190613df6565b60405180910390a3505050565b600081600c54600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561211991906142ca565b6121239190614299565b61212d9190614324565b90509392505050565b612141848484611a64565b61214d84848484612620565b61218c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218390613e73565b60405180910390fd5b50505050565b606061219d826117d7565b6000600a600084815260200190815260200160002080546121bd90614468565b80601f01602080910402602001604051908101604052809291908181526020018280546121e990614468565b80156122365780601f1061220b57610100808354040283529160200191612236565b820191906000526020600020905b81548152906001019060200180831161221957829003601f168201915b5050505050905060006122476127b7565b905060008151141561225d5781925050506122a0565b60008251111561229257808260405160200161227a929190613d04565b604051602081830303815290604052925050506122a0565b61229b846127ce565b925050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6122e3828260405180602001604052806000815250612836565b5050565b6122f08261243d565b61232f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232690614013565b60405180910390fd5b80600a600084815260200190815260200160002090805190602001906123569291906132c9565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061242657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612436575061243582612891565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6124b16125d6565b6124bc8383836128fb565b505050565b505050565b6124ce6110db565b61250d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250490613e33565b60405180910390fd5b565b6000612571826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a0f9092919063ffffffff16565b90506000815111156125d15780806020019051810190612591919061371d565b6125d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c790614113565b60405180910390fd5b5b505050565b6125de6110db565b1561261e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261590613fd3565b60405180910390fd5b565b60006126418473ffffffffffffffffffffffffffffffffffffffff16612a27565b156127aa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261266a6108bf565b8786866040518563ffffffff1660e01b815260040161268c9493929190613d81565b602060405180830381600087803b1580156126a657600080fd5b505af19250505080156126d757506040513d601f19601f820116820180604052508101906126d4919061376f565b60015b61275a573d8060008114612707576040519150601f19603f3d011682016040523d82523d6000602084013e61270c565b606091505b50600081511415612752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274990613e73565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127af565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606127d9826117d7565b60006127e36127b7565b90506000815111612803576040518060200160405280600081525061282e565b8061280d84612a4a565b60405160200161281e929190613d04565b6040516020818303038152906040525b915050919050565b6128408383612bf7565b61284d6000848484612620565b61288c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288390613e73565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612906838383612dd1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129495761294481612dd6565b612988565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612987576129868382612e1f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129cb576129c681612f8c565b612a0a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a0957612a0882826130cf565b5b5b505050565b6060612a1e848460008561314e565b90509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415612a92576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bf2565b600082905060005b60008214612ac4578080612aad906144cb565b915050600a82612abd9190614299565b9150612a9a565b60008167ffffffffffffffff811115612b06577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b385781602001600182028036833780820191505090505b5090505b60008514612beb57600182612b519190614324565b9150600a85612b609190614514565b6030612b6c9190614243565b60f81b818381518110612ba8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612be49190614299565b9450612b3c565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5e90614053565b60405180910390fd5b612c708161243d565b15612cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca790613ed3565b60405180910390fd5b612cbc600083836124a9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d0c9190614243565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612dcd600083836124c1565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e2c846111a4565b612e369190614324565b9050600060076000848152602001908152602001600020549050818114612f1b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612fa09190614324565b9050600060096000848152602001908152602001600020549050600060088381548110612ff6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061303e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806130b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006130da836111a4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b606082471015613193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318a90613f93565b60405180910390fd5b61319c85612a27565b6131db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d2906140d3565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132049190613ced565b60006040518083038185875af1925050503d8060008114613241576040519150601f19603f3d011682016040523d82523d6000602084013e613246565b606091505b5091509150613256828286613262565b92505050949350505050565b60608315613272578290506132c2565b6000835111156132855782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b99190613e11565b60405180910390fd5b9392505050565b8280546132d590614468565b90600052602060002090601f0160209004810192826132f7576000855561333e565b82601f1061331057805160ff191683800117855561333e565b8280016001018555821561333e579182015b8281111561333d578251825591602001919060010190613322565b5b50905061334b919061334f565b5090565b5b80821115613368576000816000905550600101613350565b5090565b600061337f61337a84614193565b61416e565b90508281526020810184848401111561339757600080fd5b6133a2848285614426565b509392505050565b60006133bd6133b8846141c4565b61416e565b9050828152602081018484840111156133d557600080fd5b6133e0848285614426565b509392505050565b6000813590506133f781614c76565b92915050565b60008135905061340c81614c8d565b92915050565b60008135905061342181614ca4565b92915050565b60008151905061343681614ca4565b92915050565b60008135905061344b81614cbb565b92915050565b60008151905061346081614cbb565b92915050565b600082601f83011261347757600080fd5b813561348784826020860161336c565b91505092915050565b60008135905061349f81614cd2565b92915050565b600082601f8301126134b657600080fd5b81356134c68482602086016133aa565b91505092915050565b6000813590506134de81614ce9565b92915050565b6000815190506134f381614ce9565b92915050565b60006020828403121561350b57600080fd5b6000613519848285016133e8565b91505092915050565b60006020828403121561353457600080fd5b6000613542848285016133fd565b91505092915050565b6000806040838503121561355e57600080fd5b600061356c858286016133e8565b925050602061357d858286016133e8565b9150509250929050565b60008060006060848603121561359c57600080fd5b60006135aa868287016133e8565b93505060206135bb868287016133e8565b92505060406135cc868287016134cf565b9150509250925092565b600080600080608085870312156135ec57600080fd5b60006135fa878288016133e8565b945050602061360b878288016133e8565b935050604061361c878288016134cf565b925050606085013567ffffffffffffffff81111561363957600080fd5b61364587828801613466565b91505092959194509250565b6000806040838503121561366457600080fd5b6000613672858286016133e8565b925050602061368385828601613412565b9150509250929050565b600080604083850312156136a057600080fd5b60006136ae858286016133e8565b925050602083013567ffffffffffffffff8111156136cb57600080fd5b6136d7858286016134a5565b9150509250929050565b600080604083850312156136f457600080fd5b6000613702858286016133e8565b9250506020613713858286016134cf565b9150509250929050565b60006020828403121561372f57600080fd5b600061373d84828501613427565b91505092915050565b60006020828403121561375857600080fd5b60006137668482850161343c565b91505092915050565b60006020828403121561378157600080fd5b600061378f84828501613451565b91505092915050565b6000602082840312156137aa57600080fd5b60006137b884828501613490565b91505092915050565b600080604083850312156137d457600080fd5b60006137e285828601613490565b92505060206137f3858286016133e8565b9150509250929050565b60006020828403121561380f57600080fd5b600061381d848285016134cf565b91505092915050565b60006020828403121561383857600080fd5b6000613846848285016134e4565b91505092915050565b613858816143f0565b82525050565b61386781614358565b82525050565b6138768161437c565b82525050565b6000613887826141f5565b613891818561420b565b93506138a1818560208601614435565b6138aa81614601565b840191505092915050565b60006138c0826141f5565b6138ca818561421c565b93506138da818560208601614435565b80840191505092915050565b60006138f182614200565b6138fb8185614227565b935061390b818560208601614435565b61391481614601565b840191505092915050565b600061392a82614200565b6139348185614238565b9350613944818560208601614435565b80840191505092915050565b600061395d601483614227565b915061396882614612565b602082019050919050565b6000613980602b83614227565b915061398b8261463b565b604082019050919050565b60006139a3603283614227565b91506139ae8261468a565b604082019050919050565b60006139c6602683614227565b91506139d1826146d9565b604082019050919050565b60006139e9602583614227565b91506139f482614728565b604082019050919050565b6000613a0c601c83614227565b9150613a1782614777565b602082019050919050565b6000613a2f602683614227565b9150613a3a826147a0565b604082019050919050565b6000613a52602483614227565b9150613a5d826147ef565b604082019050919050565b6000613a75601983614227565b9150613a808261483e565b602082019050919050565b6000613a98603a83614227565b9150613aa382614867565b604082019050919050565b6000613abb601d83614227565b9150613ac6826148b6565b602082019050919050565b6000613ade602683614227565b9150613ae9826148df565b604082019050919050565b6000613b01602b83614227565b9150613b0c8261492e565b604082019050919050565b6000613b24601083614227565b9150613b2f8261497d565b602082019050919050565b6000613b47602983614227565b9150613b52826149a6565b604082019050919050565b6000613b6a602e83614227565b9150613b75826149f5565b604082019050919050565b6000613b8d603e83614227565b9150613b9882614a44565b604082019050919050565b6000613bb0602083614227565b9150613bbb82614a93565b602082019050919050565b6000613bd3602083614227565b9150613bde82614abc565b602082019050919050565b6000613bf6601883614227565b9150613c0182614ae5565b602082019050919050565b6000613c19602183614227565b9150613c2482614b0e565b604082019050919050565b6000613c3c60008361421c565b9150613c4782614b5d565b600082019050919050565b6000613c5f601d83614227565b9150613c6a82614b60565b602082019050919050565b6000613c82602c83614227565b9150613c8d82614b89565b604082019050919050565b6000613ca5602a83614227565b9150613cb082614bd8565b604082019050919050565b6000613cc8602e83614227565b9150613cd382614c27565b604082019050919050565b613ce7816143e6565b82525050565b6000613cf982846138b5565b915081905092915050565b6000613d10828561391f565b9150613d1c828461391f565b91508190509392505050565b6000613d3382613c2f565b9150819050919050565b6000602082019050613d52600083018461385e565b92915050565b6000604082019050613d6d600083018561384f565b613d7a6020830184613cde565b9392505050565b6000608082019050613d96600083018761385e565b613da3602083018661385e565b613db06040830185613cde565b8181036060830152613dc2818461387c565b905095945050505050565b6000604082019050613de2600083018561385e565b613def6020830184613cde565b9392505050565b6000602082019050613e0b600083018461386d565b92915050565b60006020820190508181036000830152613e2b81846138e6565b905092915050565b60006020820190508181036000830152613e4c81613950565b9050919050565b60006020820190508181036000830152613e6c81613973565b9050919050565b60006020820190508181036000830152613e8c81613996565b9050919050565b60006020820190508181036000830152613eac816139b9565b9050919050565b60006020820190508181036000830152613ecc816139dc565b9050919050565b60006020820190508181036000830152613eec816139ff565b9050919050565b60006020820190508181036000830152613f0c81613a22565b9050919050565b60006020820190508181036000830152613f2c81613a45565b9050919050565b60006020820190508181036000830152613f4c81613a68565b9050919050565b60006020820190508181036000830152613f6c81613a8b565b9050919050565b60006020820190508181036000830152613f8c81613aae565b9050919050565b60006020820190508181036000830152613fac81613ad1565b9050919050565b60006020820190508181036000830152613fcc81613af4565b9050919050565b60006020820190508181036000830152613fec81613b17565b9050919050565b6000602082019050818103600083015261400c81613b3a565b9050919050565b6000602082019050818103600083015261402c81613b5d565b9050919050565b6000602082019050818103600083015261404c81613b80565b9050919050565b6000602082019050818103600083015261406c81613ba3565b9050919050565b6000602082019050818103600083015261408c81613bc6565b9050919050565b600060208201905081810360008301526140ac81613be9565b9050919050565b600060208201905081810360008301526140cc81613c0c565b9050919050565b600060208201905081810360008301526140ec81613c52565b9050919050565b6000602082019050818103600083015261410c81613c75565b9050919050565b6000602082019050818103600083015261412c81613c98565b9050919050565b6000602082019050818103600083015261414c81613cbb565b9050919050565b60006020820190506141686000830184613cde565b92915050565b6000614178614189565b9050614184828261449a565b919050565b6000604051905090565b600067ffffffffffffffff8211156141ae576141ad6145d2565b5b6141b782614601565b9050602081019050919050565b600067ffffffffffffffff8211156141df576141de6145d2565b5b6141e882614601565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061424e826143e6565b9150614259836143e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561428e5761428d614545565b5b828201905092915050565b60006142a4826143e6565b91506142af836143e6565b9250826142bf576142be614574565b5b828204905092915050565b60006142d5826143e6565b91506142e0836143e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561431957614318614545565b5b828202905092915050565b600061432f826143e6565b915061433a836143e6565b92508282101561434d5761434c614545565b5b828203905092915050565b6000614363826143c6565b9050919050565b6000614375826143c6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006143bf82614358565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006143fb82614402565b9050919050565b600061440d82614414565b9050919050565b600061441f826143c6565b9050919050565b82818337600083830152505050565b60005b83811015614453578082015181840152602081019050614438565b83811115614462576000848401525b50505050565b6000600282049050600182168061448057607f821691505b60208210811415614494576144936145a3565b5b50919050565b6144a382614601565b810181811067ffffffffffffffff821117156144c2576144c16145d2565b5b80604052505050565b60006144d6826143e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561450957614508614545565b5b600182019050919050565b600061451f826143e6565b915061452a836143e6565b92508261453a57614539614574565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b614c7f81614358565b8114614c8a57600080fd5b50565b614c968161436a565b8114614ca157600080fd5b50565b614cad8161437c565b8114614cb857600080fd5b50565b614cc481614388565b8114614ccf57600080fd5b50565b614cdb816143b4565b8114614ce657600080fd5b50565b614cf2816143e6565b8114614cfd57600080fd5b5056fea2646970667358221220c100234af20a98a80ddf79631b0924c03fa0b8c8baa8f1e4b770caf8cb0a56a564736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000d493d02df12ec7096895ec612ab297b9756ebcfe000000000000000000000000c3c2adf381caff20852db28d624bff1690284c8c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032
-----Decoded View---------------
Arg [0] : _payees (address[]): 0xD493d02df12Ec7096895eC612ab297B9756eBCfe,0xC3c2ADf381caFF20852db28d624BFf1690284C8C
Arg [1] : _shares (uint256[]): 50,50
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 000000000000000000000000d493d02df12ec7096895ec612ab297b9756ebcfe
Arg [4] : 000000000000000000000000c3c2adf381caff20852db28d624bff1690284c8c
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000032
Deployed Bytecode Sourcemap
73684:1670:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49991:40;50007:12;:10;:12::i;:::-;50021:9;49991:40;;;;;;;:::i;:::-;;;;;;;;73684:1670;;;;;75139:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24595:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26108:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25625:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62955:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52512:453;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26808:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62623:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50122:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74165:65;;;;;;;;;;;;;:::i;:::-;;51251:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27215:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53233:514;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63145:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56524:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24306:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24037:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59395:103;;;;;;;;;;;;;:::i;:::-;;74096:61;;;;;;;;;;;;;:::i;:::-;;51477:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58747:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24764:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50973:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26351:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51667:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27471:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52052:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74935:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50769:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74238:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50559:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50307:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26577:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59653:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4759:98;4812:7;4839:10;4832:17;;4759:98;:::o;75139:212::-;75278:4;75307:36;75331:11;75307:23;:36::i;:::-;75300:43;;75139:212;;;:::o;24595:100::-;24649:13;24682:5;24675:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24595:100;:::o;26108:171::-;26184:7;26204:23;26219:7;26204:14;:23::i;:::-;26247:15;:24;26263:7;26247:24;;;;;;;;;;;;;;;;;;;;;26240:31;;26108:171;;;:::o;25625:417::-;25706:13;25722:23;25737:7;25722:14;:23::i;:::-;25706:39;;25770:5;25764:11;;:2;:11;;;;25756:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25864:5;25848:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25873:37;25890:5;25897:12;:10;:12::i;:::-;25873:16;:37::i;:::-;25848:62;25826:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;26013:21;26022:2;26026:7;26013:8;:21::i;:::-;25625:417;;;:::o;62955:113::-;63016:7;63043:10;:17;;;;63036:24;;62955:113;:::o;52512:453::-;52607:1;52588:7;:16;52596:7;52588:16;;;;;;;;;;;;;;;;:20;52580:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52664:15;52682:19;52693:7;52682:10;:19::i;:::-;52664:37;;52733:1;52722:7;:12;;52714:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52817:7;52795:9;:18;52805:7;52795:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;52853:7;52835:14;;:25;;;;;;;:::i;:::-;;;;;;;;52873:35;52891:7;52900;52873:17;:35::i;:::-;52924:33;52940:7;52949;52924:33;;;;;;;:::i;:::-;;;;;;;;52512:453;;:::o;26808:336::-;27003:41;27022:12;:10;:12::i;:::-;27036:7;27003:18;:41::i;:::-;26995:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;27108:28;27118:4;27124:2;27128:7;27108:9;:28::i;:::-;26808:336;;;:::o;62623:256::-;62720:7;62756:23;62773:5;62756:16;:23::i;:::-;62748:5;:31;62740:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;62845:12;:19;62858:5;62845:19;;;;;;;;;;;;;;;:26;62865:5;62845:26;;;;;;;;;;;;62838:33;;62623:256;;;;:::o;50122:91::-;50166:7;50193:12;;50186:19;;50122:91;:::o;74165:65::-;58633:13;:11;:13::i;:::-;74212:10:::1;:8;:10::i;:::-;74165:65::o:0;51251:135::-;51321:7;51348:14;:21;51363:5;51348:21;;;;;;;;;;;;;;;:30;51370:7;51348:30;;;;;;;;;;;;;;;;51341:37;;51251:135;;;;:::o;27215:185::-;27353:39;27370:4;27376:2;27380:7;27353:39;;;;;;;;;;;;:16;:39::i;:::-;27215:185;;;:::o;53233:514::-;53334:1;53315:7;:16;53323:7;53315:16;;;;;;;;;;;;;;;;:20;53307:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;53391:15;53409:26;53420:5;53427:7;53409:10;:26::i;:::-;53391:44;;53467:1;53456:7;:12;;53448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53563:7;53529:14;:21;53544:5;53529:21;;;;;;;;;;;;;;;:30;53551:7;53529:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;53611:7;53581:19;:26;53601:5;53581:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;53631:47;53654:5;53661:7;53670;53631:22;:47::i;:::-;53715:5;53694:45;;;53722:7;53731;53694:45;;;;;;;:::i;:::-;;;;;;;;53233:514;;;:::o;63145:233::-;63220:7;63256:30;:28;:30::i;:::-;63248:5;:38;63240:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;63353:10;63364:5;63353:17;;;;;;;;;;;;;;;;;;;;;;;;63346:24;;63145:233;;;:::o;56524:86::-;56571:4;56595:7;;;;;;;;;;;56588:14;;56524:86;:::o;24306:222::-;24378:7;24398:13;24414:7;:16;24422:7;24414:16;;;;;;;;;;;;;;;;;;;;;24398:32;;24466:1;24449:19;;:5;:19;;;;24441:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;24515:5;24508:12;;;24306:222;;;:::o;24037:207::-;24109:7;24154:1;24137:19;;:5;:19;;;;24129:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24220:9;:16;24230:5;24220:16;;;;;;;;;;;;;;;;24213:23;;24037:207;;;:::o;59395:103::-;58633:13;:11;:13::i;:::-;59460:30:::1;59487:1;59460:18;:30::i;:::-;59395:103::o:0;74096:61::-;58633:13;:11;:13::i;:::-;74141:8:::1;:6;:8::i;:::-;74096:61::o:0;51477:100::-;51528:7;51555;51563:5;51555:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51548:21;;51477:100;;;:::o;58747:87::-;58793:7;58820:6;;;;;;;;;;;58813:13;;58747:87;:::o;24764:104::-;24820:13;24853:7;24846:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24764:104;:::o;50973:109::-;51029:7;51056:9;:18;51066:7;51056:18;;;;;;;;;;;;;;;;51049:25;;50973:109;;;:::o;26351:155::-;26446:52;26465:12;:10;:12::i;:::-;26479:8;26489;26446:18;:52::i;:::-;26351:155;;:::o;51667:225::-;51725:7;51745:21;51793:15;:13;:15::i;:::-;51769:21;:39;;;;:::i;:::-;51745:63;;51826:58;51842:7;51851:13;51866:17;51875:7;51866:8;:17::i;:::-;51826:15;:58::i;:::-;51819:65;;;51667:225;;;:::o;27471:323::-;27645:41;27664:12;:10;:12::i;:::-;27678:7;27645:18;:41::i;:::-;27637:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;27748:38;27762:4;27768:2;27772:7;27781:4;27748:13;:38::i;:::-;27471:323;;;;:::o;52052:260::-;52124:7;52144:21;52201:20;52215:5;52201:13;:20::i;:::-;52168:5;:15;;;52192:4;52168:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;52144:77;;52239:65;52255:7;52264:13;52279:24;52288:5;52295:7;52279:8;:24::i;:::-;52239:15;:65::i;:::-;52232:72;;;52052:260;;;;:::o;74935:196::-;75062:13;75100:23;75115:7;75100:14;:23::i;:::-;75093:30;;74935:196;;;:::o;50769:105::-;50823:7;50850;:16;50858:7;50850:16;;;;;;;;;;;;;;;;50843:23;;50769:105;;;:::o;74238:236::-;58633:13;:11;:13::i;:::-;74315:15:::1;74333:25;:15;:23;:25::i;:::-;74315:43;;74369:27;:15;:25;:27::i;:::-;74407:22;74417:2;74421:7;74407:9;:22::i;:::-;74440:26;74453:7;74462:3;74440:12;:26::i;:::-;58657:1;74238:236:::0;;:::o;50559:119::-;50617:7;50644:19;:26;50664:5;50644:26;;;;;;;;;;;;;;;;50637:33;;50559:119;;;:::o;50307:95::-;50353:7;50380:14;;50373:21;;50307:95;:::o;26577:164::-;26674:4;26698:18;:25;26717:5;26698:25;;;;;;;;;;;;;;;:35;26724:8;26698:35;;;;;;;;;;;;;;;;;;;;;;;;;26691:42;;26577:164;;;;:::o;59653:201::-;58633:13;:11;:13::i;:::-;59762:1:::1;59742:22;;:8;:22;;;;59734:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59818:28;59837:8;59818:18;:28::i;:::-;59653:201:::0;:::o;62315:224::-;62417:4;62456:35;62441:50;;;:11;:50;;;;:90;;;;62495:36;62519:11;62495:23;:36::i;:::-;62441:90;62434:97;;62315:224;;;:::o;34083:135::-;34165:16;34173:7;34165;:16::i;:::-;34157:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;34083:135;:::o;33362:174::-;33464:2;33437:15;:24;33453:7;33437:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33520:7;33516:2;33482:46;;33491:23;33506:7;33491:14;:23::i;:::-;33482:46;;;;;;;;;;;;33362:174;;:::o;7475:317::-;7590:6;7565:21;:31;;7557:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7644:12;7662:9;:14;;7684:6;7662:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7643:52;;;7714:7;7706:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;7475:317;;;:::o;29595:264::-;29688:4;29705:13;29721:23;29736:7;29721:14;:23::i;:::-;29705:39;;29774:5;29763:16;;:7;:16;;;:52;;;;29783:32;29800:5;29807:7;29783:16;:32::i;:::-;29763:52;:87;;;;29843:7;29819:31;;:20;29831:7;29819:11;:20::i;:::-;:31;;;29763:87;29755:96;;;29595:264;;;;:::o;32618:625::-;32777:4;32750:31;;:23;32765:7;32750:14;:23::i;:::-;:31;;;32742:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32856:1;32842:16;;:2;:16;;;;32834:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32912:39;32933:4;32939:2;32943:7;32912:20;:39::i;:::-;33016:29;33033:1;33037:7;33016:8;:29::i;:::-;33077:1;33058:9;:15;33068:4;33058:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33106:1;33089:9;:13;33099:2;33089:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33137:2;33118:7;:16;33126:7;33118:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33176:7;33172:2;33157:27;;33166:4;33157:27;;;;;;;;;;;;33197:38;33217:4;33223:2;33227:7;33197:19;:38::i;:::-;32618:625;;;:::o;58912:132::-;58987:12;:10;:12::i;:::-;58976:23;;:7;:5;:7::i;:::-;:23;;;58968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58912:132::o;57379:120::-;56388:16;:14;:16::i;:::-;57448:5:::1;57438:7;;:15;;;;;;;;;;;;;;;;;;57469:22;57478:12;:10;:12::i;:::-;57469:22;;;;;;:::i;:::-;;;;;;;;57379:120::o:0;42830:211::-;42947:86;42967:5;42997:23;;;43022:2;43026:5;42974:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42947:19;:86::i;:::-;42830:211;;;:::o;60014:191::-;60088:16;60107:6;;;;;;;;;;;60088:25;;60133:8;60124:6;;:17;;;;;;;;;;;;;;;;;;60188:8;60157:40;;60178:8;60157:40;;;;;;;;;;;;60014:191;;:::o;57120:118::-;56129:19;:17;:19::i;:::-;57190:4:::1;57180:7;;:14;;;;;;;;;;;;;;;;;;57210:20;57217:12;:10;:12::i;:::-;57210:20;;;;;;:::i;:::-;;;;;;;;57120:118::o:0;33679:315::-;33834:8;33825:17;;:5;:17;;;;33817:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33921:8;33883:18;:25;33902:5;33883:25;;;;;;;;;;;;;;;:35;33909:8;33883:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33967:8;33945:41;;33960:5;33945:41;;;33977:8;33945:41;;;;;;:::i;:::-;;;;;;;;33679:315;;;:::o;53925:248::-;54071:7;54150:15;54135:12;;54115:7;:16;54123:7;54115:16;;;;;;;;;;;;;;;;54099:13;:32;;;;:::i;:::-;54098:49;;;;:::i;:::-;:67;;;;:::i;:::-;54091:74;;53925:248;;;;;:::o;28675:313::-;28831:28;28841:4;28847:2;28851:7;28831:9;:28::i;:::-;28878:47;28901:4;28907:2;28911:7;28920:4;28878:22;:47::i;:::-;28870:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28675:313;;;;:::o;68995:624::-;69068:13;69094:23;69109:7;69094:14;:23::i;:::-;69130;69156:10;:19;69167:7;69156:19;;;;;;;;;;;69130:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69186:18;69207:10;:8;:10::i;:::-;69186:31;;69315:1;69299:4;69293:18;:23;69289:72;;;69340:9;69333:16;;;;;;69289:72;69491:1;69471:9;69465:23;:27;69461:108;;;69540:4;69546:9;69523:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69509:48;;;;;;69461:108;69588:23;69603:7;69588:14;:23::i;:::-;69581:30;;;;68995:624;;;;:::o;974:114::-;1039:7;1066;:14;;;1059:21;;974:114;;;:::o;1096:127::-;1203:1;1185:7;:14;;;:19;;;;;;;;;;;1096:127;:::o;30201:110::-;30277:26;30287:2;30291:7;30277:26;;;;;;;;;;;;:9;:26::i;:::-;30201:110;;:::o;69775:217::-;69875:16;69883:7;69875;:16::i;:::-;69867:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;69975:9;69953:10;:19;69964:7;69953:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;69775:217;;:::o;23668:305::-;23770:4;23822:25;23807:40;;;:11;:40;;;;:105;;;;23879:33;23864:48;;;:11;:48;;;;23807:105;:158;;;;23929:36;23953:11;23929:23;:36::i;:::-;23807:158;23787:178;;23668:305;;;:::o;29301:127::-;29366:4;29418:1;29390:30;;:7;:16;29398:7;29390:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29383:37;;29301:127;;;:::o;74482:229::-;56129:19;:17;:19::i;:::-;74658:45:::1;74685:4;74691:2;74695:7;74658:26;:45::i;:::-;74482:229:::0;;;:::o;36718:125::-;;;;:::o;56868:108::-;56935:8;:6;:8::i;:::-;56927:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;56868:108::o;45897:716::-;46321:23;46347:69;46375:4;46347:69;;;;;;;;;;;;;;;;;46355:5;46347:27;;;;:69;;;;;:::i;:::-;46321:95;;46451:1;46431:10;:17;:21;46427:179;;;46528:10;46517:30;;;;;;;;;;;;:::i;:::-;46509:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;46427:179;45897:716;;;:::o;56683:108::-;56754:8;:6;:8::i;:::-;56753:9;56745:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56683:108::o;34782:853::-;34936:4;34957:15;:2;:13;;;:15::i;:::-;34953:675;;;35009:2;34993:36;;;35030:12;:10;:12::i;:::-;35044:4;35050:7;35059:4;34993:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34989:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35251:1;35234:6;:13;:18;35230:328;;;35277:60;;;;;;;;;;:::i;:::-;;;;;;;;35230:328;35508:6;35502:13;35493:6;35489:2;35485:15;35478:38;34989:584;35125:41;;;35115:51;;;:6;:51;;;;35108:58;;;;;34953:675;35612:4;35605:11;;34782:853;;;;;;;:::o;25469:94::-;25520:13;25546:9;;;;;;;;;;;;;;25469:94;:::o;24939:281::-;25012:13;25038:23;25053:7;25038:14;:23::i;:::-;25074:21;25098:10;:8;:10::i;:::-;25074:34;;25150:1;25132:7;25126:21;:25;:86;;;;;;;;;;;;;;;;;25178:7;25187:18;:7;:16;:18::i;:::-;25161:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25126:86;25119:93;;;24939:281;;;:::o;30538:319::-;30667:18;30673:2;30677:7;30667:5;:18::i;:::-;30718:53;30749:1;30753:2;30757:7;30766:4;30718:22;:53::i;:::-;30696:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;30538:319;;;:::o;21272:157::-;21357:4;21396:25;21381:40;;;:11;:40;;;;21374:47;;21272:157;;;:::o;63991:589::-;64135:45;64162:4;64168:2;64172:7;64135:26;:45::i;:::-;64213:1;64197:18;;:4;:18;;;64193:187;;;64232:40;64264:7;64232:31;:40::i;:::-;64193:187;;;64302:2;64294:10;;:4;:10;;;64290:90;;64321:47;64354:4;64360:7;64321:32;:47::i;:::-;64290:90;64193:187;64408:1;64394:16;;:2;:16;;;64390:183;;;64427:45;64464:7;64427:36;:45::i;:::-;64390:183;;;64500:4;64494:10;;:2;:10;;;64490:83;;64521:40;64549:2;64553:7;64521:27;:40::i;:::-;64490:83;64390:183;63991:589;;;:::o;8959:229::-;9096:12;9128:52;9150:6;9158:4;9164:1;9167:12;9128:21;:52::i;:::-;9121:59;;8959:229;;;;;:::o;6214:326::-;6274:4;6531:1;6509:7;:19;;;:23;6502:30;;6214:326;;;:::o;2005:723::-;2061:13;2291:1;2282:5;:10;2278:53;;;2309:10;;;;;;;;;;;;;;;;;;;;;2278:53;2341:12;2356:5;2341:20;;2372:14;2397:78;2412:1;2404:4;:9;2397:78;;2430:8;;;;;:::i;:::-;;;;2461:2;2453:10;;;;;:::i;:::-;;;2397:78;;;2485:19;2517:6;2507:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2485:39;;2535:154;2551:1;2542:5;:10;2535:154;;2579:1;2569:11;;;;;:::i;:::-;;;2646:2;2638:5;:10;;;;:::i;:::-;2625:2;:24;;;;:::i;:::-;2612:39;;2595:6;2602;2595:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2675:2;2666:11;;;;;:::i;:::-;;;2535:154;;;2713:6;2699:21;;;;;2005:723;;;;:::o;31193:439::-;31287:1;31273:16;;:2;:16;;;;31265:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31346:16;31354:7;31346;:16::i;:::-;31345:17;31337:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31408:45;31437:1;31441:2;31445:7;31408:20;:45::i;:::-;31483:1;31466:9;:13;31476:2;31466:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31514:2;31495:7;:16;31503:7;31495:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31559:7;31555:2;31534:33;;31551:1;31534:33;;;;;;;;;;;;31580:44;31608:1;31612:2;31616:7;31580:19;:44::i;:::-;31193:439;;:::o;36207:126::-;;;;:::o;65303:164::-;65407:10;:17;;;;65380:15;:24;65396:7;65380:24;;;;;;;;;;;:44;;;;65435:10;65451:7;65435:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65303:164;:::o;66094:988::-;66360:22;66410:1;66385:22;66402:4;66385:16;:22::i;:::-;:26;;;;:::i;:::-;66360:51;;66422:18;66443:17;:26;66461:7;66443:26;;;;;;;;;;;;66422:47;;66590:14;66576:10;:28;66572:328;;66621:19;66643:12;:18;66656:4;66643:18;;;;;;;;;;;;;;;:34;66662:14;66643:34;;;;;;;;;;;;66621:56;;66727:11;66694:12;:18;66707:4;66694:18;;;;;;;;;;;;;;;:30;66713:10;66694:30;;;;;;;;;;;:44;;;;66844:10;66811:17;:30;66829:11;66811:30;;;;;;;;;;;:43;;;;66572:328;;66996:17;:26;67014:7;66996:26;;;;;;;;;;;66989:33;;;67040:12;:18;67053:4;67040:18;;;;;;;;;;;;;;;:34;67059:14;67040:34;;;;;;;;;;;67033:41;;;66094:988;;;;:::o;67377:1079::-;67630:22;67675:1;67655:10;:17;;;;:21;;;;:::i;:::-;67630:46;;67687:18;67708:15;:24;67724:7;67708:24;;;;;;;;;;;;67687:45;;68059:19;68081:10;68092:14;68081:26;;;;;;;;;;;;;;;;;;;;;;;;68059:48;;68145:11;68120:10;68131;68120:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;68256:10;68225:15;:28;68241:11;68225:28;;;;;;;;;;;:41;;;;68397:15;:24;68413:7;68397:24;;;;;;;;;;;68390:31;;;68432:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67377:1079;;;;:::o;64881:221::-;64966:14;64983:20;65000:2;64983:16;:20::i;:::-;64966:37;;65041:7;65014:12;:16;65027:2;65014:16;;;;;;;;;;;;;;;:24;65031:6;65014:24;;;;;;;;;;;:34;;;;65088:6;65059:17;:26;65077:7;65059:26;;;;;;;;;;;:35;;;;64881:221;;;:::o;10079:510::-;10249:12;10307:5;10282:21;:30;;10274:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10374:18;10385:6;10374:10;:18::i;:::-;10366:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;10440:12;10454:23;10481:6;:11;;10500:5;10507:4;10481:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10439:73;;;;10530:51;10547:7;10556:10;10568:12;10530:16;:51::i;:::-;10523:58;;;;10079:510;;;;;;:::o;12765:762::-;12915:12;12944:7;12940:580;;;12975:10;12968:17;;;;12940:580;13109:1;13089:10;:17;:21;13085:424;;;13337:10;13331:17;13398:15;13385:10;13381:2;13377:19;13370:44;13285:148;13480:12;13473:20;;;;;;;;;;;:::i;:::-;;;;;;;;12765:762;;;;;;:::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:155::-;906:5;944:6;931:20;922:29;;960:41;995:5;960:41;:::i;:::-;912:95;;;;:::o;1013:133::-;1056:5;1094:6;1081:20;1072:29;;1110:30;1134:5;1110:30;:::i;:::-;1062:84;;;;:::o;1152:137::-;1206:5;1237:6;1231:13;1222:22;;1253:30;1277:5;1253:30;:::i;:::-;1212:77;;;;:::o;1295:137::-;1340:5;1378:6;1365:20;1356:29;;1394:32;1420:5;1394:32;:::i;:::-;1346:86;;;;:::o;1438:141::-;1494:5;1525:6;1519:13;1510:22;;1541:32;1567:5;1541:32;:::i;:::-;1500:79;;;;:::o;1598:271::-;1653:5;1702:3;1695:4;1687:6;1683:17;1679:27;1669:2;;1720:1;1717;1710:12;1669:2;1760:6;1747:20;1785:78;1859:3;1851:6;1844:4;1836:6;1832:17;1785:78;:::i;:::-;1776:87;;1659:210;;;;;:::o;1875:169::-;1936:5;1974:6;1961:20;1952:29;;1990:48;2032:5;1990:48;:::i;:::-;1942:102;;;;:::o;2064:273::-;2120:5;2169:3;2162:4;2154:6;2150:17;2146:27;2136:2;;2187:1;2184;2177:12;2136:2;2227:6;2214:20;2252:79;2327:3;2319:6;2312:4;2304:6;2300:17;2252:79;:::i;:::-;2243:88;;2126:211;;;;;:::o;2343:139::-;2389:5;2427:6;2414:20;2405:29;;2443:33;2470:5;2443:33;:::i;:::-;2395:87;;;;:::o;2488:143::-;2545:5;2576:6;2570:13;2561:22;;2592:33;2619:5;2592:33;:::i;:::-;2551:80;;;;:::o;2637:262::-;2696:6;2745:2;2733:9;2724:7;2720:23;2716:32;2713:2;;;2761:1;2758;2751:12;2713:2;2804:1;2829:53;2874:7;2865:6;2854:9;2850:22;2829:53;:::i;:::-;2819:63;;2775:117;2703:196;;;;:::o;2905:278::-;2972:6;3021:2;3009:9;3000:7;2996:23;2992:32;2989:2;;;3037:1;3034;3027:12;2989:2;3080:1;3105:61;3158:7;3149:6;3138:9;3134:22;3105:61;:::i;:::-;3095:71;;3051:125;2979:204;;;;:::o;3189:407::-;3257:6;3265;3314:2;3302:9;3293:7;3289:23;3285:32;3282:2;;;3330:1;3327;3320:12;3282:2;3373:1;3398:53;3443:7;3434:6;3423:9;3419:22;3398:53;:::i;:::-;3388:63;;3344:117;3500:2;3526:53;3571:7;3562:6;3551:9;3547:22;3526:53;:::i;:::-;3516:63;;3471:118;3272:324;;;;;:::o;3602:552::-;3679:6;3687;3695;3744:2;3732:9;3723:7;3719:23;3715:32;3712:2;;;3760:1;3757;3750:12;3712:2;3803:1;3828:53;3873:7;3864:6;3853:9;3849:22;3828:53;:::i;:::-;3818:63;;3774:117;3930:2;3956:53;4001:7;3992:6;3981:9;3977:22;3956:53;:::i;:::-;3946:63;;3901:118;4058:2;4084:53;4129:7;4120:6;4109:9;4105:22;4084:53;:::i;:::-;4074:63;;4029:118;3702:452;;;;;:::o;4160:809::-;4255:6;4263;4271;4279;4328:3;4316:9;4307:7;4303:23;4299:33;4296:2;;;4345:1;4342;4335:12;4296:2;4388:1;4413:53;4458:7;4449:6;4438:9;4434:22;4413:53;:::i;:::-;4403:63;;4359:117;4515:2;4541:53;4586:7;4577:6;4566:9;4562:22;4541:53;:::i;:::-;4531:63;;4486:118;4643:2;4669:53;4714:7;4705:6;4694:9;4690:22;4669:53;:::i;:::-;4659:63;;4614:118;4799:2;4788:9;4784:18;4771:32;4830:18;4822:6;4819:30;4816:2;;;4862:1;4859;4852:12;4816:2;4890:62;4944:7;4935:6;4924:9;4920:22;4890:62;:::i;:::-;4880:72;;4742:220;4286:683;;;;;;;:::o;4975:401::-;5040:6;5048;5097:2;5085:9;5076:7;5072:23;5068:32;5065:2;;;5113:1;5110;5103:12;5065:2;5156:1;5181:53;5226:7;5217:6;5206:9;5202:22;5181:53;:::i;:::-;5171:63;;5127:117;5283:2;5309:50;5351:7;5342:6;5331:9;5327:22;5309:50;:::i;:::-;5299:60;;5254:115;5055:321;;;;;:::o;5382:520::-;5460:6;5468;5517:2;5505:9;5496:7;5492:23;5488:32;5485:2;;;5533:1;5530;5523:12;5485:2;5576:1;5601:53;5646:7;5637:6;5626:9;5622:22;5601:53;:::i;:::-;5591:63;;5547:117;5731:2;5720:9;5716:18;5703:32;5762:18;5754:6;5751:30;5748:2;;;5794:1;5791;5784:12;5748:2;5822:63;5877:7;5868:6;5857:9;5853:22;5822:63;:::i;:::-;5812:73;;5674:221;5475:427;;;;;:::o;5908:407::-;5976:6;5984;6033:2;6021:9;6012:7;6008:23;6004:32;6001:2;;;6049:1;6046;6039:12;6001:2;6092:1;6117:53;6162:7;6153:6;6142:9;6138:22;6117:53;:::i;:::-;6107:63;;6063:117;6219:2;6245:53;6290:7;6281:6;6270:9;6266:22;6245:53;:::i;:::-;6235:63;;6190:118;5991:324;;;;;:::o;6321:278::-;6388:6;6437:2;6425:9;6416:7;6412:23;6408:32;6405:2;;;6453:1;6450;6443:12;6405:2;6496:1;6521:61;6574:7;6565:6;6554:9;6550:22;6521:61;:::i;:::-;6511:71;;6467:125;6395:204;;;;:::o;6605:260::-;6663:6;6712:2;6700:9;6691:7;6687:23;6683:32;6680:2;;;6728:1;6725;6718:12;6680:2;6771:1;6796:52;6840:7;6831:6;6820:9;6816:22;6796:52;:::i;:::-;6786:62;;6742:116;6670:195;;;;:::o;6871:282::-;6940:6;6989:2;6977:9;6968:7;6964:23;6960:32;6957:2;;;7005:1;7002;6995:12;6957:2;7048:1;7073:63;7128:7;7119:6;7108:9;7104:22;7073:63;:::i;:::-;7063:73;;7019:127;6947:206;;;;:::o;7159:292::-;7233:6;7282:2;7270:9;7261:7;7257:23;7253:32;7250:2;;;7298:1;7295;7288:12;7250:2;7341:1;7366:68;7426:7;7417:6;7406:9;7402:22;7366:68;:::i;:::-;7356:78;;7312:132;7240:211;;;;:::o;7457:437::-;7540:6;7548;7597:2;7585:9;7576:7;7572:23;7568:32;7565:2;;;7613:1;7610;7603:12;7565:2;7656:1;7681:68;7741:7;7732:6;7721:9;7717:22;7681:68;:::i;:::-;7671:78;;7627:132;7798:2;7824:53;7869:7;7860:6;7849:9;7845:22;7824:53;:::i;:::-;7814:63;;7769:118;7555:339;;;;;:::o;7900:262::-;7959:6;8008:2;7996:9;7987:7;7983:23;7979:32;7976:2;;;8024:1;8021;8014:12;7976:2;8067:1;8092:53;8137:7;8128:6;8117:9;8113:22;8092:53;:::i;:::-;8082:63;;8038:117;7966:196;;;;:::o;8168:284::-;8238:6;8287:2;8275:9;8266:7;8262:23;8258:32;8255:2;;;8303:1;8300;8293:12;8255:2;8346:1;8371:64;8427:7;8418:6;8407:9;8403:22;8371:64;:::i;:::-;8361:74;;8317:128;8245:207;;;;:::o;8458:147::-;8553:45;8592:5;8553:45;:::i;:::-;8548:3;8541:58;8531:74;;:::o;8611:118::-;8698:24;8716:5;8698:24;:::i;:::-;8693:3;8686:37;8676:53;;:::o;8735:109::-;8816:21;8831:5;8816:21;:::i;:::-;8811:3;8804:34;8794:50;;:::o;8850:360::-;8936:3;8964:38;8996:5;8964:38;:::i;:::-;9018:70;9081:6;9076:3;9018:70;:::i;:::-;9011:77;;9097:52;9142:6;9137:3;9130:4;9123:5;9119:16;9097:52;:::i;:::-;9174:29;9196:6;9174:29;:::i;:::-;9169:3;9165:39;9158:46;;8940:270;;;;;:::o;9216:373::-;9320:3;9348:38;9380:5;9348:38;:::i;:::-;9402:88;9483:6;9478:3;9402:88;:::i;:::-;9395:95;;9499:52;9544:6;9539:3;9532:4;9525:5;9521:16;9499:52;:::i;:::-;9576:6;9571:3;9567:16;9560:23;;9324:265;;;;;:::o;9595:364::-;9683:3;9711:39;9744:5;9711:39;:::i;:::-;9766:71;9830:6;9825:3;9766:71;:::i;:::-;9759:78;;9846:52;9891:6;9886:3;9879:4;9872:5;9868:16;9846:52;:::i;:::-;9923:29;9945:6;9923:29;:::i;:::-;9918:3;9914:39;9907:46;;9687:272;;;;;:::o;9965:377::-;10071:3;10099:39;10132:5;10099:39;:::i;:::-;10154:89;10236:6;10231:3;10154:89;:::i;:::-;10147:96;;10252:52;10297:6;10292:3;10285:4;10278:5;10274:16;10252:52;:::i;:::-;10329:6;10324:3;10320:16;10313:23;;10075:267;;;;;:::o;10348:366::-;10490:3;10511:67;10575:2;10570:3;10511:67;:::i;:::-;10504:74;;10587:93;10676:3;10587:93;:::i;:::-;10705:2;10700:3;10696:12;10689:19;;10494:220;;;:::o;10720:366::-;10862:3;10883:67;10947:2;10942:3;10883:67;:::i;:::-;10876:74;;10959:93;11048:3;10959:93;:::i;:::-;11077:2;11072:3;11068:12;11061:19;;10866:220;;;:::o;11092:366::-;11234:3;11255:67;11319:2;11314:3;11255:67;:::i;:::-;11248:74;;11331:93;11420:3;11331:93;:::i;:::-;11449:2;11444:3;11440:12;11433:19;;11238:220;;;:::o;11464:366::-;11606:3;11627:67;11691:2;11686:3;11627:67;:::i;:::-;11620:74;;11703:93;11792:3;11703:93;:::i;:::-;11821:2;11816:3;11812:12;11805:19;;11610:220;;;:::o;11836:366::-;11978:3;11999:67;12063:2;12058:3;11999:67;:::i;:::-;11992:74;;12075:93;12164:3;12075:93;:::i;:::-;12193:2;12188:3;12184:12;12177:19;;11982:220;;;:::o;12208:366::-;12350:3;12371:67;12435:2;12430:3;12371:67;:::i;:::-;12364:74;;12447:93;12536:3;12447:93;:::i;:::-;12565:2;12560:3;12556:12;12549:19;;12354:220;;;:::o;12580:366::-;12722:3;12743:67;12807:2;12802:3;12743:67;:::i;:::-;12736:74;;12819:93;12908:3;12819:93;:::i;:::-;12937:2;12932:3;12928:12;12921:19;;12726:220;;;:::o;12952:366::-;13094:3;13115:67;13179:2;13174:3;13115:67;:::i;:::-;13108:74;;13191:93;13280:3;13191:93;:::i;:::-;13309:2;13304:3;13300:12;13293:19;;13098:220;;;:::o;13324:366::-;13466:3;13487:67;13551:2;13546:3;13487:67;:::i;:::-;13480:74;;13563:93;13652:3;13563:93;:::i;:::-;13681:2;13676:3;13672:12;13665:19;;13470:220;;;:::o;13696:366::-;13838:3;13859:67;13923:2;13918:3;13859:67;:::i;:::-;13852:74;;13935:93;14024:3;13935:93;:::i;:::-;14053:2;14048:3;14044:12;14037:19;;13842:220;;;:::o;14068:366::-;14210:3;14231:67;14295:2;14290:3;14231:67;:::i;:::-;14224:74;;14307:93;14396:3;14307:93;:::i;:::-;14425:2;14420:3;14416:12;14409:19;;14214:220;;;:::o;14440:366::-;14582:3;14603:67;14667:2;14662:3;14603:67;:::i;:::-;14596:74;;14679:93;14768:3;14679:93;:::i;:::-;14797:2;14792:3;14788:12;14781:19;;14586:220;;;:::o;14812:366::-;14954:3;14975:67;15039:2;15034:3;14975:67;:::i;:::-;14968:74;;15051:93;15140:3;15051:93;:::i;:::-;15169:2;15164:3;15160:12;15153:19;;14958:220;;;:::o;15184:366::-;15326:3;15347:67;15411:2;15406:3;15347:67;:::i;:::-;15340:74;;15423:93;15512:3;15423:93;:::i;:::-;15541:2;15536:3;15532:12;15525:19;;15330:220;;;:::o;15556:366::-;15698:3;15719:67;15783:2;15778:3;15719:67;:::i;:::-;15712:74;;15795:93;15884:3;15795:93;:::i;:::-;15913:2;15908:3;15904:12;15897:19;;15702:220;;;:::o;15928:366::-;16070:3;16091:67;16155:2;16150:3;16091:67;:::i;:::-;16084:74;;16167:93;16256:3;16167:93;:::i;:::-;16285:2;16280:3;16276:12;16269:19;;16074:220;;;:::o;16300:366::-;16442:3;16463:67;16527:2;16522:3;16463:67;:::i;:::-;16456:74;;16539:93;16628:3;16539:93;:::i;:::-;16657:2;16652:3;16648:12;16641:19;;16446:220;;;:::o;16672:366::-;16814:3;16835:67;16899:2;16894:3;16835:67;:::i;:::-;16828:74;;16911:93;17000:3;16911:93;:::i;:::-;17029:2;17024:3;17020:12;17013:19;;16818:220;;;:::o;17044:366::-;17186:3;17207:67;17271:2;17266:3;17207:67;:::i;:::-;17200:74;;17283:93;17372:3;17283:93;:::i;:::-;17401:2;17396:3;17392:12;17385:19;;17190:220;;;:::o;17416:366::-;17558:3;17579:67;17643:2;17638:3;17579:67;:::i;:::-;17572:74;;17655:93;17744:3;17655:93;:::i;:::-;17773:2;17768:3;17764:12;17757:19;;17562:220;;;:::o;17788:366::-;17930:3;17951:67;18015:2;18010:3;17951:67;:::i;:::-;17944:74;;18027:93;18116:3;18027:93;:::i;:::-;18145:2;18140:3;18136:12;18129:19;;17934:220;;;:::o;18160:398::-;18319:3;18340:83;18421:1;18416:3;18340:83;:::i;:::-;18333:90;;18432:93;18521:3;18432:93;:::i;:::-;18550:1;18545:3;18541:11;18534:18;;18323:235;;;:::o;18564:366::-;18706:3;18727:67;18791:2;18786:3;18727:67;:::i;:::-;18720:74;;18803:93;18892:3;18803:93;:::i;:::-;18921:2;18916:3;18912:12;18905:19;;18710:220;;;:::o;18936:366::-;19078:3;19099:67;19163:2;19158:3;19099:67;:::i;:::-;19092:74;;19175:93;19264:3;19175:93;:::i;:::-;19293:2;19288:3;19284:12;19277:19;;19082:220;;;:::o;19308:366::-;19450:3;19471:67;19535:2;19530:3;19471:67;:::i;:::-;19464:74;;19547:93;19636:3;19547:93;:::i;:::-;19665:2;19660:3;19656:12;19649:19;;19454:220;;;:::o;19680:366::-;19822:3;19843:67;19907:2;19902:3;19843:67;:::i;:::-;19836:74;;19919:93;20008:3;19919:93;:::i;:::-;20037:2;20032:3;20028:12;20021:19;;19826:220;;;:::o;20052:118::-;20139:24;20157:5;20139:24;:::i;:::-;20134:3;20127:37;20117:53;;:::o;20176:271::-;20306:3;20328:93;20417:3;20408:6;20328:93;:::i;:::-;20321:100;;20438:3;20431:10;;20310:137;;;;:::o;20453:435::-;20633:3;20655:95;20746:3;20737:6;20655:95;:::i;:::-;20648:102;;20767:95;20858:3;20849:6;20767:95;:::i;:::-;20760:102;;20879:3;20872:10;;20637:251;;;;;:::o;20894:379::-;21078:3;21100:147;21243:3;21100:147;:::i;:::-;21093:154;;21264:3;21257:10;;21082:191;;;:::o;21279:222::-;21372:4;21410:2;21399:9;21395:18;21387:26;;21423:71;21491:1;21480:9;21476:17;21467:6;21423:71;:::i;:::-;21377:124;;;;:::o;21507:348::-;21636:4;21674:2;21663:9;21659:18;21651:26;;21687:79;21763:1;21752:9;21748:17;21739:6;21687:79;:::i;:::-;21776:72;21844:2;21833:9;21829:18;21820:6;21776:72;:::i;:::-;21641:214;;;;;:::o;21861:640::-;22056:4;22094:3;22083:9;22079:19;22071:27;;22108:71;22176:1;22165:9;22161:17;22152:6;22108:71;:::i;:::-;22189:72;22257:2;22246:9;22242:18;22233:6;22189:72;:::i;:::-;22271;22339:2;22328:9;22324:18;22315:6;22271:72;:::i;:::-;22390:9;22384:4;22380:20;22375:2;22364:9;22360:18;22353:48;22418:76;22489:4;22480:6;22418:76;:::i;:::-;22410:84;;22061:440;;;;;;;:::o;22507:332::-;22628:4;22666:2;22655:9;22651:18;22643:26;;22679:71;22747:1;22736:9;22732:17;22723:6;22679:71;:::i;:::-;22760:72;22828:2;22817:9;22813:18;22804:6;22760:72;:::i;:::-;22633:206;;;;;:::o;22845:210::-;22932:4;22970:2;22959:9;22955:18;22947:26;;22983:65;23045:1;23034:9;23030:17;23021:6;22983:65;:::i;:::-;22937:118;;;;:::o;23061:313::-;23174:4;23212:2;23201:9;23197:18;23189:26;;23261:9;23255:4;23251:20;23247:1;23236:9;23232:17;23225:47;23289:78;23362:4;23353:6;23289:78;:::i;:::-;23281:86;;23179:195;;;;:::o;23380:419::-;23546:4;23584:2;23573:9;23569:18;23561:26;;23633:9;23627:4;23623:20;23619:1;23608:9;23604:17;23597:47;23661:131;23787:4;23661:131;:::i;:::-;23653:139;;23551:248;;;:::o;23805:419::-;23971:4;24009:2;23998:9;23994:18;23986:26;;24058:9;24052:4;24048:20;24044:1;24033:9;24029:17;24022:47;24086:131;24212:4;24086:131;:::i;:::-;24078:139;;23976:248;;;:::o;24230:419::-;24396:4;24434:2;24423:9;24419:18;24411:26;;24483:9;24477:4;24473:20;24469:1;24458:9;24454:17;24447:47;24511:131;24637:4;24511:131;:::i;:::-;24503:139;;24401:248;;;:::o;24655:419::-;24821:4;24859:2;24848:9;24844:18;24836:26;;24908:9;24902:4;24898:20;24894:1;24883:9;24879:17;24872:47;24936:131;25062:4;24936:131;:::i;:::-;24928:139;;24826:248;;;:::o;25080:419::-;25246:4;25284:2;25273:9;25269:18;25261:26;;25333:9;25327:4;25323:20;25319:1;25308:9;25304:17;25297:47;25361:131;25487:4;25361:131;:::i;:::-;25353:139;;25251:248;;;:::o;25505:419::-;25671:4;25709:2;25698:9;25694:18;25686:26;;25758:9;25752:4;25748:20;25744:1;25733:9;25729:17;25722:47;25786:131;25912:4;25786:131;:::i;:::-;25778:139;;25676:248;;;:::o;25930:419::-;26096:4;26134:2;26123:9;26119:18;26111:26;;26183:9;26177:4;26173:20;26169:1;26158:9;26154:17;26147:47;26211:131;26337:4;26211:131;:::i;:::-;26203:139;;26101:248;;;:::o;26355:419::-;26521:4;26559:2;26548:9;26544:18;26536:26;;26608:9;26602:4;26598:20;26594:1;26583:9;26579:17;26572:47;26636:131;26762:4;26636:131;:::i;:::-;26628:139;;26526:248;;;:::o;26780:419::-;26946:4;26984:2;26973:9;26969:18;26961:26;;27033:9;27027:4;27023:20;27019:1;27008:9;27004:17;26997:47;27061:131;27187:4;27061:131;:::i;:::-;27053:139;;26951:248;;;:::o;27205:419::-;27371:4;27409:2;27398:9;27394:18;27386:26;;27458:9;27452:4;27448:20;27444:1;27433:9;27429:17;27422:47;27486:131;27612:4;27486:131;:::i;:::-;27478:139;;27376:248;;;:::o;27630:419::-;27796:4;27834:2;27823:9;27819:18;27811:26;;27883:9;27877:4;27873:20;27869:1;27858:9;27854:17;27847:47;27911:131;28037:4;27911:131;:::i;:::-;27903:139;;27801:248;;;:::o;28055:419::-;28221:4;28259:2;28248:9;28244:18;28236:26;;28308:9;28302:4;28298:20;28294:1;28283:9;28279:17;28272:47;28336:131;28462:4;28336:131;:::i;:::-;28328:139;;28226:248;;;:::o;28480:419::-;28646:4;28684:2;28673:9;28669:18;28661:26;;28733:9;28727:4;28723:20;28719:1;28708:9;28704:17;28697:47;28761:131;28887:4;28761:131;:::i;:::-;28753:139;;28651:248;;;:::o;28905:419::-;29071:4;29109:2;29098:9;29094:18;29086:26;;29158:9;29152:4;29148:20;29144:1;29133:9;29129:17;29122:47;29186:131;29312:4;29186:131;:::i;:::-;29178:139;;29076:248;;;:::o;29330:419::-;29496:4;29534:2;29523:9;29519:18;29511:26;;29583:9;29577:4;29573:20;29569:1;29558:9;29554:17;29547:47;29611:131;29737:4;29611:131;:::i;:::-;29603:139;;29501:248;;;:::o;29755:419::-;29921:4;29959:2;29948:9;29944:18;29936:26;;30008:9;30002:4;29998:20;29994:1;29983:9;29979:17;29972:47;30036:131;30162:4;30036:131;:::i;:::-;30028:139;;29926:248;;;:::o;30180:419::-;30346:4;30384:2;30373:9;30369:18;30361:26;;30433:9;30427:4;30423:20;30419:1;30408:9;30404:17;30397:47;30461:131;30587:4;30461:131;:::i;:::-;30453:139;;30351:248;;;:::o;30605:419::-;30771:4;30809:2;30798:9;30794:18;30786:26;;30858:9;30852:4;30848:20;30844:1;30833:9;30829:17;30822:47;30886:131;31012:4;30886:131;:::i;:::-;30878:139;;30776:248;;;:::o;31030:419::-;31196:4;31234:2;31223:9;31219:18;31211:26;;31283:9;31277:4;31273:20;31269:1;31258:9;31254:17;31247:47;31311:131;31437:4;31311:131;:::i;:::-;31303:139;;31201:248;;;:::o;31455:419::-;31621:4;31659:2;31648:9;31644:18;31636:26;;31708:9;31702:4;31698:20;31694:1;31683:9;31679:17;31672:47;31736:131;31862:4;31736:131;:::i;:::-;31728:139;;31626:248;;;:::o;31880:419::-;32046:4;32084:2;32073:9;32069:18;32061:26;;32133:9;32127:4;32123:20;32119:1;32108:9;32104:17;32097:47;32161:131;32287:4;32161:131;:::i;:::-;32153:139;;32051:248;;;:::o;32305:419::-;32471:4;32509:2;32498:9;32494:18;32486:26;;32558:9;32552:4;32548:20;32544:1;32533:9;32529:17;32522:47;32586:131;32712:4;32586:131;:::i;:::-;32578:139;;32476:248;;;:::o;32730:419::-;32896:4;32934:2;32923:9;32919:18;32911:26;;32983:9;32977:4;32973:20;32969:1;32958:9;32954:17;32947:47;33011:131;33137:4;33011:131;:::i;:::-;33003:139;;32901:248;;;:::o;33155:419::-;33321:4;33359:2;33348:9;33344:18;33336:26;;33408:9;33402:4;33398:20;33394:1;33383:9;33379:17;33372:47;33436:131;33562:4;33436:131;:::i;:::-;33428:139;;33326:248;;;:::o;33580:419::-;33746:4;33784:2;33773:9;33769:18;33761:26;;33833:9;33827:4;33823:20;33819:1;33808:9;33804:17;33797:47;33861:131;33987:4;33861:131;:::i;:::-;33853:139;;33751:248;;;:::o;34005:222::-;34098:4;34136:2;34125:9;34121:18;34113:26;;34149:71;34217:1;34206:9;34202:17;34193:6;34149:71;:::i;:::-;34103:124;;;;:::o;34233:129::-;34267:6;34294:20;;:::i;:::-;34284:30;;34323:33;34351:4;34343:6;34323:33;:::i;:::-;34274:88;;;:::o;34368:75::-;34401:6;34434:2;34428:9;34418:19;;34408:35;:::o;34449:307::-;34510:4;34600:18;34592:6;34589:30;34586:2;;;34622:18;;:::i;:::-;34586:2;34660:29;34682:6;34660:29;:::i;:::-;34652:37;;34744:4;34738;34734:15;34726:23;;34515:241;;;:::o;34762:308::-;34824:4;34914:18;34906:6;34903:30;34900:2;;;34936:18;;:::i;:::-;34900:2;34974:29;34996:6;34974:29;:::i;:::-;34966:37;;35058:4;35052;35048:15;35040:23;;34829:241;;;:::o;35076:98::-;35127:6;35161:5;35155:12;35145:22;;35134:40;;;:::o;35180:99::-;35232:6;35266:5;35260:12;35250:22;;35239:40;;;:::o;35285:168::-;35368:11;35402:6;35397:3;35390:19;35442:4;35437:3;35433:14;35418:29;;35380:73;;;;:::o;35459:147::-;35560:11;35597:3;35582:18;;35572:34;;;;:::o;35612:169::-;35696:11;35730:6;35725:3;35718:19;35770:4;35765:3;35761:14;35746:29;;35708:73;;;;:::o;35787:148::-;35889:11;35926:3;35911:18;;35901:34;;;;:::o;35941:305::-;35981:3;36000:20;36018:1;36000:20;:::i;:::-;35995:25;;36034:20;36052:1;36034:20;:::i;:::-;36029:25;;36188:1;36120:66;36116:74;36113:1;36110:81;36107:2;;;36194:18;;:::i;:::-;36107:2;36238:1;36235;36231:9;36224:16;;35985:261;;;;:::o;36252:185::-;36292:1;36309:20;36327:1;36309:20;:::i;:::-;36304:25;;36343:20;36361:1;36343:20;:::i;:::-;36338:25;;36382:1;36372:2;;36387:18;;:::i;:::-;36372:2;36429:1;36426;36422:9;36417:14;;36294:143;;;;:::o;36443:348::-;36483:7;36506:20;36524:1;36506:20;:::i;:::-;36501:25;;36540:20;36558:1;36540:20;:::i;:::-;36535:25;;36728:1;36660:66;36656:74;36653:1;36650:81;36645:1;36638:9;36631:17;36627:105;36624:2;;;36735:18;;:::i;:::-;36624:2;36783:1;36780;36776:9;36765:20;;36491:300;;;;:::o;36797:191::-;36837:4;36857:20;36875:1;36857:20;:::i;:::-;36852:25;;36891:20;36909:1;36891:20;:::i;:::-;36886:25;;36930:1;36927;36924:8;36921:2;;;36935:18;;:::i;:::-;36921:2;36980:1;36977;36973:9;36965:17;;36842:146;;;;:::o;36994:96::-;37031:7;37060:24;37078:5;37060:24;:::i;:::-;37049:35;;37039:51;;;:::o;37096:104::-;37141:7;37170:24;37188:5;37170:24;:::i;:::-;37159:35;;37149:51;;;:::o;37206:90::-;37240:7;37283:5;37276:13;37269:21;37258:32;;37248:48;;;:::o;37302:149::-;37338:7;37378:66;37371:5;37367:78;37356:89;;37346:105;;;:::o;37457:111::-;37509:7;37538:24;37556:5;37538:24;:::i;:::-;37527:35;;37517:51;;;:::o;37574:126::-;37611:7;37651:42;37644:5;37640:54;37629:65;;37619:81;;;:::o;37706:77::-;37743:7;37772:5;37761:16;;37751:32;;;:::o;37789:134::-;37847:9;37880:37;37911:5;37880:37;:::i;:::-;37867:50;;37857:66;;;:::o;37929:126::-;37979:9;38012:37;38043:5;38012:37;:::i;:::-;37999:50;;37989:66;;;:::o;38061:113::-;38111:9;38144:24;38162:5;38144:24;:::i;:::-;38131:37;;38121:53;;;:::o;38180:154::-;38264:6;38259:3;38254;38241:30;38326:1;38317:6;38312:3;38308:16;38301:27;38231:103;;;:::o;38340:307::-;38408:1;38418:113;38432:6;38429:1;38426:13;38418:113;;;38517:1;38512:3;38508:11;38502:18;38498:1;38493:3;38489:11;38482:39;38454:2;38451:1;38447:10;38442:15;;38418:113;;;38549:6;38546:1;38543:13;38540:2;;;38629:1;38620:6;38615:3;38611:16;38604:27;38540:2;38389:258;;;;:::o;38653:320::-;38697:6;38734:1;38728:4;38724:12;38714:22;;38781:1;38775:4;38771:12;38802:18;38792:2;;38858:4;38850:6;38846:17;38836:27;;38792:2;38920;38912:6;38909:14;38889:18;38886:38;38883:2;;;38939:18;;:::i;:::-;38883:2;38704:269;;;;:::o;38979:281::-;39062:27;39084:4;39062:27;:::i;:::-;39054:6;39050:40;39192:6;39180:10;39177:22;39156:18;39144:10;39141:34;39138:62;39135:2;;;39203:18;;:::i;:::-;39135:2;39243:10;39239:2;39232:22;39022:238;;;:::o;39266:233::-;39305:3;39328:24;39346:5;39328:24;:::i;:::-;39319:33;;39374:66;39367:5;39364:77;39361:2;;;39444:18;;:::i;:::-;39361:2;39491:1;39484:5;39480:13;39473:20;;39309:190;;;:::o;39505:176::-;39537:1;39554:20;39572:1;39554:20;:::i;:::-;39549:25;;39588:20;39606:1;39588:20;:::i;:::-;39583:25;;39627:1;39617:2;;39632:18;;:::i;:::-;39617:2;39673:1;39670;39666:9;39661:14;;39539:142;;;;:::o;39687:180::-;39735:77;39732:1;39725:88;39832:4;39829:1;39822:15;39856:4;39853:1;39846:15;39873:180;39921:77;39918:1;39911:88;40018:4;40015:1;40008:15;40042:4;40039:1;40032:15;40059:180;40107:77;40104:1;40097:88;40204:4;40201:1;40194:15;40228:4;40225:1;40218:15;40245:180;40293:77;40290:1;40283:88;40390:4;40387:1;40380:15;40414:4;40411:1;40404:15;40431:102;40472:6;40523:2;40519:7;40514:2;40507:5;40503:14;40499:28;40489:38;;40479:54;;;:::o;40539:170::-;40679:22;40675:1;40667:6;40663:14;40656:46;40645:64;:::o;40715:230::-;40855:34;40851:1;40843:6;40839:14;40832:58;40924:13;40919:2;40911:6;40907:15;40900:38;40821:124;:::o;40951:237::-;41091:34;41087:1;41079:6;41075:14;41068:58;41160:20;41155:2;41147:6;41143:15;41136:45;41057:131;:::o;41194:225::-;41334:34;41330:1;41322:6;41318:14;41311:58;41403:8;41398:2;41390:6;41386:15;41379:33;41300:119;:::o;41425:224::-;41565:34;41561:1;41553:6;41549:14;41542:58;41634:7;41629:2;41621:6;41617:15;41610:32;41531:118;:::o;41655:178::-;41795:30;41791:1;41783:6;41779:14;41772:54;41761:72;:::o;41839:225::-;41979:34;41975:1;41967:6;41963:14;41956:58;42048:8;42043:2;42035:6;42031:15;42024:33;41945:119;:::o;42070:223::-;42210:34;42206:1;42198:6;42194:14;42187:58;42279:6;42274:2;42266:6;42262:15;42255:31;42176:117;:::o;42299:175::-;42439:27;42435:1;42427:6;42423:14;42416:51;42405:69;:::o;42480:245::-;42620:34;42616:1;42608:6;42604:14;42597:58;42689:28;42684:2;42676:6;42672:15;42665:53;42586:139;:::o;42731:179::-;42871:31;42867:1;42859:6;42855:14;42848:55;42837:73;:::o;42916:225::-;43056:34;43052:1;43044:6;43040:14;43033:58;43125:8;43120:2;43112:6;43108:15;43101:33;43022:119;:::o;43147:230::-;43287:34;43283:1;43275:6;43271:14;43264:58;43356:13;43351:2;43343:6;43339:15;43332:38;43253:124;:::o;43383:166::-;43523:18;43519:1;43511:6;43507:14;43500:42;43489:60;:::o;43555:228::-;43695:34;43691:1;43683:6;43679:14;43672:58;43764:11;43759:2;43751:6;43747:15;43740:36;43661:122;:::o;43789:233::-;43929:34;43925:1;43917:6;43913:14;43906:58;43998:16;43993:2;43985:6;43981:15;43974:41;43895:127;:::o;44028:249::-;44168:34;44164:1;44156:6;44152:14;44145:58;44237:32;44232:2;44224:6;44220:15;44213:57;44134:143;:::o;44283:182::-;44423:34;44419:1;44411:6;44407:14;44400:58;44389:76;:::o;44471:182::-;44611:34;44607:1;44599:6;44595:14;44588:58;44577:76;:::o;44659:174::-;44799:26;44795:1;44787:6;44783:14;44776:50;44765:68;:::o;44839:220::-;44979:34;44975:1;44967:6;44963:14;44956:58;45048:3;45043:2;45035:6;45031:15;45024:28;44945:114;:::o;45065:::-;45171:8;:::o;45185:179::-;45325:31;45321:1;45313:6;45309:14;45302:55;45291:73;:::o;45370:231::-;45510:34;45506:1;45498:6;45494:14;45487:58;45579:14;45574:2;45566:6;45562:15;45555:39;45476:125;:::o;45607:229::-;45747:34;45743:1;45735:6;45731:14;45724:58;45816:12;45811:2;45803:6;45799:15;45792:37;45713:123;:::o;45842:233::-;45982:34;45978:1;45970:6;45966:14;45959:58;46051:16;46046:2;46038:6;46034:15;46027:41;45948:127;:::o;46081:122::-;46154:24;46172:5;46154:24;:::i;:::-;46147:5;46144:35;46134:2;;46193:1;46190;46183:12;46134:2;46124:79;:::o;46209:138::-;46290:32;46316:5;46290:32;:::i;:::-;46283:5;46280:43;46270:2;;46337:1;46334;46327:12;46270:2;46260:87;:::o;46353:116::-;46423:21;46438:5;46423:21;:::i;:::-;46416:5;46413:32;46403:2;;46459:1;46456;46449:12;46403:2;46393:76;:::o;46475:120::-;46547:23;46564:5;46547:23;:::i;:::-;46540:5;46537:34;46527:2;;46585:1;46582;46575:12;46527:2;46517:78;:::o;46601:152::-;46689:39;46722:5;46689:39;:::i;:::-;46682:5;46679:50;46669:2;;46743:1;46740;46733:12;46669:2;46659:94;:::o;46759:122::-;46832:24;46850:5;46832:24;:::i;:::-;46825:5;46822:35;46812:2;;46871:1;46868;46861:12;46812:2;46802:79;:::o
Swarm Source
ipfs://c100234af20a98a80ddf79631b0924c03fa0b8c8baa8f1e4b770caf8cb0a56a5
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.