Overview
ETH Balance
0.075 ETH
Eth Value
$133.41 (@ $1,778.80/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Sponsored
Latest 14 from a total of 14 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 16294641 | 89 days 48 mins ago | IN | 0 ETH | 0.00088569 | ||||
Safe Transfer Fr... | 16242085 | 96 days 8 hrs ago | IN | 0 ETH | 0.00124353 | ||||
Safe Transfer Fr... | 16239888 | 96 days 16 hrs ago | IN | 0 ETH | 0.00110255 | ||||
Transfer Ownersh... | 16168231 | 106 days 16 hrs ago | IN | 0 ETH | 0.00041173 | ||||
Mint | 16168226 | 106 days 16 hrs ago | IN | 0.05 ETH | 0.00129099 | ||||
Mint | 16162905 | 107 days 10 hrs ago | IN | 0.025 ETH | 0.0015381 | ||||
Reveal | 16154656 | 108 days 13 hrs ago | IN | 0 ETH | 0.00066131 | ||||
Pause | 16154287 | 108 days 15 hrs ago | IN | 0 ETH | 0.00037186 | ||||
Set Price | 16154285 | 108 days 15 hrs ago | IN | 0 ETH | 0.00043266 | ||||
Transfer Ownersh... | 16103340 | 115 days 18 hrs ago | IN | 0 ETH | 0.0003099 | ||||
Transfer Ownersh... | 16075305 | 119 days 16 hrs ago | IN | 0 ETH | 0.00032915 | ||||
Set Base URI | 16075294 | 119 days 16 hrs ago | IN | 0 ETH | 0.00106304 | ||||
Owner Mint | 16075289 | 119 days 16 hrs ago | IN | 0 ETH | 0.00088058 | ||||
0x60806040 | 16031167 | 125 days 20 hrs ago | IN | Create: MetaFarmFamilyOfficial | 0 ETH | 0.06296943 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MetaFarmFamilyOfficial
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-23 */ /** *Submitted for verification at Etherscan.io on 2022-11-19 */ // SPDX-License-Identifier: MIT // File: contracts/IOperatorFilterRegistry.sol // Developed by https://transcendnt.io pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: contracts/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } _; } } // File: contracts/DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } // Developed by https://transcendnt.io pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.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 be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v3.3.0 pragma solidity ^0.8.4; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721A { using Address for address; using Strings for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override virtual{ address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // 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; } } // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // Developed by https://transcendnt.io pragma solidity ^0.8.4; contract MetaFarmFamilyOfficial is ERC721A, Ownable, DefaultOperatorFilterer { uint256 public max_supply = 10000; uint256 public price = 0.09 ether; uint256 public preSalePrice = 0.05 ether; uint256 public WLPrice = 0.03 ether; using Strings for uint256; bool public preSale = false; bool public paused = true; bool public revealed = false; string public baseURI = "ipfs://replace/"; string public notRevealedUri = "ipfs://bafkreiajo5dpi62qmrc6tzapipv7qmm5gxnqrvapspo4xcf7qj5omyiwx4/"; using Counters for Counters.Counter; bytes32 public root; Counters.Counter private _tokenIdCounter; constructor(bytes32 _root) ERC721A("Meta Farm Family Official", "MFFO") { root = _root; } function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function WLmint(uint256 quantity, bytes32[] memory proof) external payable { require(totalSupply() + quantity <= max_supply, "Not enough tokens left"); if (msg.sender != owner()) { require(paused == false, "Mint is paused"); require(isValid(proof, keccak256(abi.encodePacked(msg.sender))), "User is not on the whitelist"); require(msg.value >= WLPrice * quantity, "Insufficient funds"); } _safeMint(msg.sender, quantity); } function mint(uint256 quantity) external payable { require(totalSupply() + quantity <= max_supply, "Not enough tokens left"); if (msg.sender != owner()) { require(paused == false, "Mint is paused"); if (preSale == false) { require(msg.value >= price * quantity, "Insufficient funds"); } else { require(msg.value >= preSalePrice * quantity, "Insufficient funds"); } } _safeMint(msg.sender, quantity); } function ownerMint(uint256 quantity) external payable { require(totalSupply() + quantity <= max_supply, "Not enough tokens left"); require(msg.sender == owner(), "User is not the owner"); _safeMint(msg.sender, quantity); } function isValid(bytes32[] memory proof, bytes32 leaf) public view returns (bool) { return MerkleProof.verify(proof, root, leaf); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), ".json")) : ""; } function reveal() public onlyOwner { revealed = true; } function pause(bool _state) public onlyOwner { paused = _state; } function withdraw() external payable onlyOwner { payable(owner()).transfer(address(this).balance); } function _baseURI() internal view override returns (string memory) { return baseURI; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setMax_supply(uint256 _max_supply) public onlyOwner { max_supply = _max_supply; } function setPrice(uint256 _price) public onlyOwner { price = _price; } function setPreSalePrice(uint256 _preSalePrice) public onlyOwner { preSalePrice = _preSalePrice; } function setWLPrice(uint256 _WLPrice) public onlyOwner { WLPrice = _WLPrice; } function setRoot(bytes32 _root) public onlyOwner { root = _root; } function setPreSale(bool _state) public onlyOwner { preSale = _state; } function setNotRevealedUri(string memory _newNotRevealedUri) public onlyOwner { notRevealedUri = _newNotRevealedUri; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"WLmint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":"quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max_supply","type":"uint256"}],"name":"setMax_supply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newNotRevealedUri","type":"string"}],"name":"setNotRevealedUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preSalePrice","type":"uint256"}],"name":"setPreSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_WLPrice","type":"uint256"}],"name":"setWLPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405261271060095567013fbe85edc90000600a5566b1a2bc2ec50000600b55666a94d74f430000600c556000600d60006101000a81548160ff0219169083151502179055506001600d60016101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff0219169083151502179055506040518060400160405280600f81526020017f697066733a2f2f7265706c6163652f0000000000000000000000000000000000815250600e9081620000c3919062000757565b506040518060800160405280604381526020016200555860439139600f9081620000ee919062000757565b50348015620000fc57600080fd5b506040516200559b3803806200559b83398181016040528101906200012291906200087e565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601981526020017f4d657461204661726d2046616d696c79204f6666696369616c000000000000008152506040518060400160405280600481526020017f4d46464f000000000000000000000000000000000000000000000000000000008152508160029081620001b6919062000757565b508060039081620001c8919062000757565b50620001d96200040660201b60201c565b600081905550505062000201620001f56200040f60201b60201c565b6200041760201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003f6578015620002bc576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000282929190620008f5565b600060405180830381600087803b1580156200029d57600080fd5b505af1158015620002b2573d6000803e3d6000fd5b50505050620003f5565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000376576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200033c929190620008f5565b600060405180830381600087803b1580156200035757600080fd5b505af11580156200036c573d6000803e3d6000fd5b50505050620003f4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003bf919062000922565b600060405180830381600087803b158015620003da57600080fd5b505af1158015620003ef573d6000803e3d6000fd5b505050505b5b5b505080601081905550506200093f565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200055f57607f821691505b60208210810362000575576200057462000517565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005df7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005a0565b620005eb8683620005a0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000638620006326200062c8462000603565b6200060d565b62000603565b9050919050565b6000819050919050565b620006548362000617565b6200066c62000663826200063f565b848454620005ad565b825550505050565b600090565b6200068362000674565b6200069081848462000649565b505050565b5b81811015620006b857620006ac60008262000679565b60018101905062000696565b5050565b601f8211156200070757620006d1816200057b565b620006dc8462000590565b81016020851015620006ec578190505b62000704620006fb8562000590565b83018262000695565b50505b505050565b600082821c905092915050565b60006200072c600019846008026200070c565b1980831691505092915050565b600062000747838362000719565b9150826002028217905092915050565b6200076282620004dd565b67ffffffffffffffff8111156200077e576200077d620004e8565b5b6200078a825462000546565b62000797828285620006bc565b600060209050601f831160018114620007cf5760008415620007ba578287015190505b620007c6858262000739565b86555062000836565b601f198416620007df866200057b565b60005b828110156200080957848901518255600182019150602085019450602081019050620007e2565b8683101562000829578489015162000825601f89168262000719565b8355505b6001600288020188555050505b505050505050565b600080fd5b6000819050919050565b620008588162000843565b81146200086457600080fd5b50565b60008151905062000878816200084d565b92915050565b6000602082840312156200089757620008966200083e565b5b6000620008a78482850162000867565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008dd82620008b0565b9050919050565b620008ef81620008d0565b82525050565b60006040820190506200090c6000830185620008e4565b6200091b6020830184620008e4565b9392505050565b6000602082019050620009396000830184620008e4565b92915050565b614c09806200094f6000396000f3fe60806040526004361061025c5760003560e01c80638a333b5011610144578063b8a20ed0116100b6578063e757c17d1161007a578063e757c17d14610883578063e985e9c5146108ae578063ebf0c717146108eb578063f19e75d414610916578063f2fde38b14610932578063f6a5b8e61461095b5761025c565b8063b8a20ed01461078e578063c17ecd12146107cb578063c87b56dd146107f4578063cd88617914610831578063dab5f3401461085a5761025c565b8063a035b1fe11610108578063a035b1fe146106b3578063a0712d68146106de578063a22cb465146106fa578063a475b5dd14610723578063b0a04d3d1461073a578063b88d4fde146107655761025c565b80638a333b50146105ed5780638da5cb5b1461061857806391b7f5ed1461064357806393c7efbb1461066c57806395d89b41146106885761025c565b806341f43434116101dd5780635c975abb116101a15780635c975abb146104dd5780636352211e146105085780636c0360eb1461054557806370a0823114610570578063715018a6146105ad5780637d7eee42146105c45761025c565b806341f434341461040a57806342842e0e14610435578063518302271461045e57806355f804b3146104895780635a7adf7f146104b25761025c565b8063095ea7b311610224578063095ea7b31461035a5780630d95ccc91461038357806318160ddd146103ac57806323b872dd146103d75780633ccfd60b146104005761025c565b806301ffc9a71461026157806302329a291461029e57806306fdde03146102c7578063081812fc146102f2578063081c8c441461032f575b600080fd5b34801561026d57600080fd5b506102886004803603810190610283919061381e565b610984565b6040516102959190613866565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c091906138ad565b610a66565b005b3480156102d357600080fd5b506102dc610aff565b6040516102e9919061396a565b60405180910390f35b3480156102fe57600080fd5b50610319600480360381019061031491906139c2565b610b91565b6040516103269190613a30565b60405180910390f35b34801561033b57600080fd5b50610344610c0d565b604051610351919061396a565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190613a77565b610c9b565b005b34801561038f57600080fd5b506103aa60048036038101906103a591906138ad565b610da5565b005b3480156103b857600080fd5b506103c1610e3e565b6040516103ce9190613ac6565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613ae1565b610e55565b005b610408610fa5565b005b34801561041657600080fd5b5061041f611071565b60405161042c9190613b93565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190613ae1565b611083565b005b34801561046a57600080fd5b506104736111d3565b6040516104809190613866565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab9190613ce3565b6111e6565b005b3480156104be57600080fd5b506104c7611275565b6040516104d49190613866565b60405180910390f35b3480156104e957600080fd5b506104f2611288565b6040516104ff9190613866565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a91906139c2565b61129b565b60405161053c9190613a30565b60405180910390f35b34801561055157600080fd5b5061055a6112b1565b604051610567919061396a565b60405180910390f35b34801561057c57600080fd5b5061059760048036038101906105929190613d2c565b61133f565b6040516105a49190613ac6565b60405180910390f35b3480156105b957600080fd5b506105c261140e565b005b3480156105d057600080fd5b506105eb60048036038101906105e691906139c2565b611496565b005b3480156105f957600080fd5b5061060261151c565b60405161060f9190613ac6565b60405180910390f35b34801561062457600080fd5b5061062d611522565b60405161063a9190613a30565b60405180910390f35b34801561064f57600080fd5b5061066a600480360381019061066591906139c2565b61154c565b005b61068660048036038101906106819190613e57565b6115d2565b005b34801561069457600080fd5b5061069d611787565b6040516106aa919061396a565b60405180910390f35b3480156106bf57600080fd5b506106c8611819565b6040516106d59190613ac6565b60405180910390f35b6106f860048036038101906106f391906139c2565b61181f565b005b34801561070657600080fd5b50610721600480360381019061071c9190613eb3565b6119d5565b005b34801561072f57600080fd5b50610738611adf565b005b34801561074657600080fd5b5061074f611b78565b60405161075c9190613ac6565b60405180910390f35b34801561077157600080fd5b5061078c60048036038101906107879190613f94565b611b7e565b005b34801561079a57600080fd5b506107b560048036038101906107b09190614017565b611cd1565b6040516107c29190613866565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed9190613ce3565b611ce8565b005b34801561080057600080fd5b5061081b600480360381019061081691906139c2565b611d77565b604051610828919061396a565b60405180910390f35b34801561083d57600080fd5b50610858600480360381019061085391906139c2565b611ecc565b005b34801561086657600080fd5b50610881600480360381019061087c9190614073565b611f52565b005b34801561088f57600080fd5b50610898611fd8565b6040516108a59190613ac6565b60405180910390f35b3480156108ba57600080fd5b506108d560048036038101906108d091906140a0565b611fde565b6040516108e29190613866565b60405180910390f35b3480156108f757600080fd5b50610900612072565b60405161090d91906140ef565b60405180910390f35b610930600480360381019061092b91906139c2565b612078565b005b34801561093e57600080fd5b5061095960048036038101906109549190613d2c565b612151565b005b34801561096757600080fd5b50610982600480360381019061097d91906139c2565b612248565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a5f5750610a5e826122ce565b5b9050919050565b610a6e612338565b73ffffffffffffffffffffffffffffffffffffffff16610a8c611522565b73ffffffffffffffffffffffffffffffffffffffff1614610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad990614156565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b606060028054610b0e906141a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3a906141a5565b8015610b875780601f10610b5c57610100808354040283529160200191610b87565b820191906000526020600020905b815481529060010190602001808311610b6a57829003601f168201915b5050505050905090565b6000610b9c82612340565b610bd2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f8054610c1a906141a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c46906141a5565b8015610c935780601f10610c6857610100808354040283529160200191610c93565b820191906000526020600020905b815481529060010190602001808311610c7657829003601f168201915b505050505081565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d96576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610d139291906141d6565b602060405180830381865afa158015610d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d549190614214565b610d9557806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d8c9190613a30565b60405180910390fd5b5b610da0838361238e565b505050565b610dad612338565b73ffffffffffffffffffffffffffffffffffffffff16610dcb611522565b73ffffffffffffffffffffffffffffffffffffffff1614610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1890614156565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b6000610e48612492565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610f93573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ec757610ec284848461249b565b610f9f565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f109291906141d6565b602060405180830381865afa158015610f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f519190614214565b610f9257336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f899190613a30565b60405180910390fd5b5b610f9e84848461249b565b5b50505050565b610fad612338565b73ffffffffffffffffffffffffffffffffffffffff16610fcb611522565b73ffffffffffffffffffffffffffffffffffffffff1614611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101890614156565b60405180910390fd5b611029611522565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561106e573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156111c1573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110f5576110f08484846124ab565b6111cd565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161113e9291906141d6565b602060405180830381865afa15801561115b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117f9190614214565b6111c057336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016111b79190613a30565b60405180910390fd5b5b6111cc8484846124ab565b5b50505050565b600d60029054906101000a900460ff1681565b6111ee612338565b73ffffffffffffffffffffffffffffffffffffffff1661120c611522565b73ffffffffffffffffffffffffffffffffffffffff1614611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990614156565b60405180910390fd5b80600e908161127191906143e3565b5050565b600d60009054906101000a900460ff1681565b600d60019054906101000a900460ff1681565b60006112a6826124cb565b600001519050919050565b600e80546112be906141a5565b80601f01602080910402602001604051908101604052809291908181526020018280546112ea906141a5565b80156113375780601f1061130c57610100808354040283529160200191611337565b820191906000526020600020905b81548152906001019060200180831161131a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113a6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611416612338565b73ffffffffffffffffffffffffffffffffffffffff16611434611522565b73ffffffffffffffffffffffffffffffffffffffff161461148a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148190614156565b60405180910390fd5b6114946000612756565b565b61149e612338565b73ffffffffffffffffffffffffffffffffffffffff166114bc611522565b73ffffffffffffffffffffffffffffffffffffffff1614611512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150990614156565b60405180910390fd5b80600b8190555050565b60095481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611554612338565b73ffffffffffffffffffffffffffffffffffffffff16611572611522565b73ffffffffffffffffffffffffffffffffffffffff16146115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90614156565b60405180910390fd5b80600a8190555050565b600954826115de610e3e565b6115e891906144e4565b1115611629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162090614564565b60405180910390fd5b611631611522565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117795760001515600d60019054906101000a900460ff161515146116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b0906145d0565b60405180910390fd5b6116e981336040516020016116ce9190614638565b60405160208183030381529060405280519060200120611cd1565b611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171f9061469f565b60405180910390fd5b81600c5461173691906146bf565b341015611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f9061474d565b60405180910390fd5b5b611783338361281c565b5050565b606060038054611796906141a5565b80601f01602080910402602001604051908101604052809291908181526020018280546117c2906141a5565b801561180f5780601f106117e45761010080835404028352916020019161180f565b820191906000526020600020905b8154815290600101906020018083116117f257829003601f168201915b5050505050905090565b600a5481565b6009548161182b610e3e565b61183591906144e4565b1115611876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186d90614564565b60405180910390fd5b61187e611522565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119c85760001515600d60019054906101000a900460ff16151514611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd906145d0565b60405180910390fd5b60001515600d60009054906101000a900460ff161515036119765780600a5461192f91906146bf565b341015611971576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119689061474d565b60405180910390fd5b6119c7565b80600b5461198491906146bf565b3410156119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd9061474d565b60405180910390fd5b5b5b6119d2338261281c565b50565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611ad0576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a4d9291906141d6565b602060405180830381865afa158015611a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8e9190614214565b611acf57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ac69190613a30565b60405180910390fd5b5b611ada838361283a565b505050565b611ae7612338565b73ffffffffffffffffffffffffffffffffffffffff16611b05611522565b73ffffffffffffffffffffffffffffffffffffffff1614611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290614156565b60405180910390fd5b6001600d60026101000a81548160ff021916908315150217905550565b600c5481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611cbd573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bf157611bec858585856129b1565b611cca565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611c3a9291906141d6565b602060405180830381865afa158015611c57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7b9190614214565b611cbc57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611cb39190613a30565b60405180910390fd5b5b611cc9858585856129b1565b5b5050505050565b6000611ce08360105484612a29565b905092915050565b611cf0612338565b73ffffffffffffffffffffffffffffffffffffffff16611d0e611522565b73ffffffffffffffffffffffffffffffffffffffff1614611d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5b90614156565b60405180910390fd5b80600f9081611d7391906143e3565b5050565b6060611d8282612340565b611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db8906147df565b60405180910390fd5b60001515600d60029054906101000a900460ff16151503611e6e57600f8054611de9906141a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611e15906141a5565b8015611e625780601f10611e3757610100808354040283529160200191611e62565b820191906000526020600020905b815481529060010190602001808311611e4557829003601f168201915b50505050509050611ec7565b6000611e78612a40565b90506000815111611e985760405180602001604052806000815250611ec3565b80611ea284612ad2565b604051602001611eb3929190614887565b6040516020818303038152906040525b9150505b919050565b611ed4612338565b73ffffffffffffffffffffffffffffffffffffffff16611ef2611522565b73ffffffffffffffffffffffffffffffffffffffff1614611f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3f90614156565b60405180910390fd5b8060098190555050565b611f5a612338565b73ffffffffffffffffffffffffffffffffffffffff16611f78611522565b73ffffffffffffffffffffffffffffffffffffffff1614611fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc590614156565b60405180910390fd5b8060108190555050565b600b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60105481565b60095481612084610e3e565b61208e91906144e4565b11156120cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c690614564565b60405180910390fd5b6120d7611522565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b90614902565b60405180910390fd5b61214e338261281c565b50565b612159612338565b73ffffffffffffffffffffffffffffffffffffffff16612177611522565b73ffffffffffffffffffffffffffffffffffffffff16146121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c490614156565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361223c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223390614994565b60405180910390fd5b61224581612756565b50565b612250612338565b73ffffffffffffffffffffffffffffffffffffffff1661226e611522565b73ffffffffffffffffffffffffffffffffffffffff16146122c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bb90614156565b60405180910390fd5b80600c8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008161234b612492565b1115801561235a575060005482105b8015612387575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b60006123998261129b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612400576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661241f612338565b73ffffffffffffffffffffffffffffffffffffffff16146124825761244b81612446612338565b611fde565b612481576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b61248d838383612c32565b505050565b60006001905090565b6124a6838383612ce4565b505050565b6124c683838360405180602001604052806000815250611b7e565b505050565b6124d361376f565b6000829050806124e1612492565b1161271f5760005481101561271e576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161271c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612600578092505050612751565b5b60011561271b57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612716578092505050612751565b612601565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612836828260405180602001604052806000815250613198565b5050565b612842612338565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128a6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006128b3612338565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612960612338565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129a59190613866565b60405180910390a35050565b6129bc848484612ce4565b6129db8373ffffffffffffffffffffffffffffffffffffffff16613558565b15612a23576129ec8484848461357b565b612a22576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600082612a3685846136cb565b1490509392505050565b6060600e8054612a4f906141a5565b80601f0160208091040260200160405190810160405280929190818152602001828054612a7b906141a5565b8015612ac85780601f10612a9d57610100808354040283529160200191612ac8565b820191906000526020600020905b815481529060010190602001808311612aab57829003601f168201915b5050505050905090565b606060008203612b19576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c2d565b600082905060005b60008214612b4b578080612b34906149b4565b915050600a82612b449190614a2b565b9150612b21565b60008167ffffffffffffffff811115612b6757612b66613bb8565b5b6040519080825280601f01601f191660200182016040528015612b995781602001600182028036833780820191505090505b5090505b60008514612c2657600182612bb29190614a5c565b9150600a85612bc19190614a90565b6030612bcd91906144e4565b60f81b818381518110612be357612be2614ac1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c1f9190614a2b565b9450612b9d565b8093505050505b919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612cef826124cb565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d5a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612d7b612338565b73ffffffffffffffffffffffffffffffffffffffff161480612daa5750612da985612da4612338565b611fde565b5b80612def5750612db8612338565b73ffffffffffffffffffffffffffffffffffffffff16612dd784610b91565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612e28576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612e8e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e9b8585856001613721565b612ea760008487612c32565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361312657600054821461312557878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131918585856001613727565b5050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613204576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000830361323e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61324b6000858386613721565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000848201905061340c8673ffffffffffffffffffffffffffffffffffffffff16613558565b156134d1575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613481600087848060010195508761357b565b6134b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106134125782600054146134cc57600080fd5b61353c565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106134d2575b8160008190555050506135526000858386613727565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135a1612338565b8786866040518563ffffffff1660e01b81526004016135c39493929190614b45565b6020604051808303816000875af19250505080156135ff57506040513d601f19601f820116820180604052508101906135fc9190614ba6565b60015b613678573d806000811461362f576040519150601f19603f3d011682016040523d82523d6000602084013e613634565b606091505b506000815103613670576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008082905060005b845181101561371657613701828683815181106136f4576136f3614ac1565b5b602002602001015161372d565b9150808061370e906149b4565b9150506136d4565b508091505092915050565b50505050565b50505050565b6000818310613745576137408284613758565b613750565b61374f8383613758565b5b905092915050565b600082600052816020526040600020905092915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137fb816137c6565b811461380657600080fd5b50565b600081359050613818816137f2565b92915050565b600060208284031215613834576138336137bc565b5b600061384284828501613809565b91505092915050565b60008115159050919050565b6138608161384b565b82525050565b600060208201905061387b6000830184613857565b92915050565b61388a8161384b565b811461389557600080fd5b50565b6000813590506138a781613881565b92915050565b6000602082840312156138c3576138c26137bc565b5b60006138d184828501613898565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139145780820151818401526020810190506138f9565b60008484015250505050565b6000601f19601f8301169050919050565b600061393c826138da565b61394681856138e5565b93506139568185602086016138f6565b61395f81613920565b840191505092915050565b600060208201905081810360008301526139848184613931565b905092915050565b6000819050919050565b61399f8161398c565b81146139aa57600080fd5b50565b6000813590506139bc81613996565b92915050565b6000602082840312156139d8576139d76137bc565b5b60006139e6848285016139ad565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a1a826139ef565b9050919050565b613a2a81613a0f565b82525050565b6000602082019050613a456000830184613a21565b92915050565b613a5481613a0f565b8114613a5f57600080fd5b50565b600081359050613a7181613a4b565b92915050565b60008060408385031215613a8e57613a8d6137bc565b5b6000613a9c85828601613a62565b9250506020613aad858286016139ad565b9150509250929050565b613ac08161398c565b82525050565b6000602082019050613adb6000830184613ab7565b92915050565b600080600060608486031215613afa57613af96137bc565b5b6000613b0886828701613a62565b9350506020613b1986828701613a62565b9250506040613b2a868287016139ad565b9150509250925092565b6000819050919050565b6000613b59613b54613b4f846139ef565b613b34565b6139ef565b9050919050565b6000613b6b82613b3e565b9050919050565b6000613b7d82613b60565b9050919050565b613b8d81613b72565b82525050565b6000602082019050613ba86000830184613b84565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bf082613920565b810181811067ffffffffffffffff82111715613c0f57613c0e613bb8565b5b80604052505050565b6000613c226137b2565b9050613c2e8282613be7565b919050565b600067ffffffffffffffff821115613c4e57613c4d613bb8565b5b613c5782613920565b9050602081019050919050565b82818337600083830152505050565b6000613c86613c8184613c33565b613c18565b905082815260208101848484011115613ca257613ca1613bb3565b5b613cad848285613c64565b509392505050565b600082601f830112613cca57613cc9613bae565b5b8135613cda848260208601613c73565b91505092915050565b600060208284031215613cf957613cf86137bc565b5b600082013567ffffffffffffffff811115613d1757613d166137c1565b5b613d2384828501613cb5565b91505092915050565b600060208284031215613d4257613d416137bc565b5b6000613d5084828501613a62565b91505092915050565b600067ffffffffffffffff821115613d7457613d73613bb8565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b613d9d81613d8a565b8114613da857600080fd5b50565b600081359050613dba81613d94565b92915050565b6000613dd3613dce84613d59565b613c18565b90508083825260208201905060208402830185811115613df657613df5613d85565b5b835b81811015613e1f5780613e0b8882613dab565b845260208401935050602081019050613df8565b5050509392505050565b600082601f830112613e3e57613e3d613bae565b5b8135613e4e848260208601613dc0565b91505092915050565b60008060408385031215613e6e57613e6d6137bc565b5b6000613e7c858286016139ad565b925050602083013567ffffffffffffffff811115613e9d57613e9c6137c1565b5b613ea985828601613e29565b9150509250929050565b60008060408385031215613eca57613ec96137bc565b5b6000613ed885828601613a62565b9250506020613ee985828601613898565b9150509250929050565b600067ffffffffffffffff821115613f0e57613f0d613bb8565b5b613f1782613920565b9050602081019050919050565b6000613f37613f3284613ef3565b613c18565b905082815260208101848484011115613f5357613f52613bb3565b5b613f5e848285613c64565b509392505050565b600082601f830112613f7b57613f7a613bae565b5b8135613f8b848260208601613f24565b91505092915050565b60008060008060808587031215613fae57613fad6137bc565b5b6000613fbc87828801613a62565b9450506020613fcd87828801613a62565b9350506040613fde878288016139ad565b925050606085013567ffffffffffffffff811115613fff57613ffe6137c1565b5b61400b87828801613f66565b91505092959194509250565b6000806040838503121561402e5761402d6137bc565b5b600083013567ffffffffffffffff81111561404c5761404b6137c1565b5b61405885828601613e29565b925050602061406985828601613dab565b9150509250929050565b600060208284031215614089576140886137bc565b5b600061409784828501613dab565b91505092915050565b600080604083850312156140b7576140b66137bc565b5b60006140c585828601613a62565b92505060206140d685828601613a62565b9150509250929050565b6140e981613d8a565b82525050565b600060208201905061410460008301846140e0565b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141406020836138e5565b915061414b8261410a565b602082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141bd57607f821691505b6020821081036141d0576141cf614176565b5b50919050565b60006040820190506141eb6000830185613a21565b6141f86020830184613a21565b9392505050565b60008151905061420e81613881565b92915050565b60006020828403121561422a576142296137bc565b5b6000614238848285016141ff565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614266565b6142ad8683614266565b95508019841693508086168417925050509392505050565b60006142e06142db6142d68461398c565b613b34565b61398c565b9050919050565b6000819050919050565b6142fa836142c5565b61430e614306826142e7565b848454614273565b825550505050565b600090565b614323614316565b61432e8184846142f1565b505050565b5b818110156143525761434760008261431b565b600181019050614334565b5050565b601f8211156143975761436881614241565b61437184614256565b81016020851015614380578190505b61439461438c85614256565b830182614333565b50505b505050565b600082821c905092915050565b60006143ba6000198460080261439c565b1980831691505092915050565b60006143d383836143a9565b9150826002028217905092915050565b6143ec826138da565b67ffffffffffffffff81111561440557614404613bb8565b5b61440f82546141a5565b61441a828285614356565b600060209050601f83116001811461444d576000841561443b578287015190505b61444585826143c7565b8655506144ad565b601f19841661445b86614241565b60005b828110156144835784890151825560018201915060208501945060208101905061445e565b868310156144a0578489015161449c601f8916826143a9565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144ef8261398c565b91506144fa8361398c565b9250828201905080821115614512576145116144b5565b5b92915050565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b600061454e6016836138e5565b915061455982614518565b602082019050919050565b6000602082019050818103600083015261457d81614541565b9050919050565b7f4d696e7420697320706175736564000000000000000000000000000000000000600082015250565b60006145ba600e836138e5565b91506145c582614584565b602082019050919050565b600060208201905081810360008301526145e9816145ad565b9050919050565b60008160601b9050919050565b6000614608826145f0565b9050919050565b600061461a826145fd565b9050919050565b61463261462d82613a0f565b61460f565b82525050565b60006146448284614621565b60148201915081905092915050565b7f55736572206973206e6f74206f6e207468652077686974656c69737400000000600082015250565b6000614689601c836138e5565b915061469482614653565b602082019050919050565b600060208201905081810360008301526146b88161467c565b9050919050565b60006146ca8261398c565b91506146d58361398c565b92508282026146e38161398c565b915082820484148315176146fa576146f96144b5565b5b5092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006147376012836138e5565b915061474282614701565b602082019050919050565b600060208201905081810360008301526147668161472a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006147c9602f836138e5565b91506147d48261476d565b604082019050919050565b600060208201905081810360008301526147f8816147bc565b9050919050565b600081905092915050565b6000614815826138da565b61481f81856147ff565b935061482f8185602086016138f6565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006148716005836147ff565b915061487c8261483b565b600582019050919050565b6000614893828561480a565b915061489f828461480a565b91506148aa82614864565b91508190509392505050565b7f55736572206973206e6f7420746865206f776e65720000000000000000000000600082015250565b60006148ec6015836138e5565b91506148f7826148b6565b602082019050919050565b6000602082019050818103600083015261491b816148df565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061497e6026836138e5565b915061498982614922565b604082019050919050565b600060208201905081810360008301526149ad81614971565b9050919050565b60006149bf8261398c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149f1576149f06144b5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a368261398c565b9150614a418361398c565b925082614a5157614a506149fc565b5b828204905092915050565b6000614a678261398c565b9150614a728361398c565b9250828203905081811115614a8a57614a896144b5565b5b92915050565b6000614a9b8261398c565b9150614aa68361398c565b925082614ab657614ab56149fc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000614b1782614af0565b614b218185614afb565b9350614b318185602086016138f6565b614b3a81613920565b840191505092915050565b6000608082019050614b5a6000830187613a21565b614b676020830186613a21565b614b746040830185613ab7565b8181036060830152614b868184614b0c565b905095945050505050565b600081519050614ba0816137f2565b92915050565b600060208284031215614bbc57614bbb6137bc565b5b6000614bca84828501614b91565b9150509291505056fea2646970667358221220ab6e7b4b51d60992a801b742c807072b57d89b908eae330547781099b652227164736f6c63430008110033697066733a2f2f6261666b726569616a6f356470693632716d726336747a617069707637716d6d3567786e717276617073706f3478636637716a356f6d79697778342f3947d6a74a22f843e54d7be4a660d005d0bc5385c548fd7c8b9c569a373089f4
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
3947d6a74a22f843e54d7be4a660d005d0bc5385c548fd7c8b9c569a373089f4
-----Decoded View---------------
Arg [0] : _root (bytes32): 0x3947d6a74a22f843e54d7be4a660d005d0bc5385c548fd7c8b9c569a373089f4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 3947d6a74a22f843e54d7be4a660d005d0bc5385c548fd7c8b9c569a373089f4
Deployed ByteCode Sourcemap
63162:4988:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34201:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66979:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37316:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38836:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63598:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64121:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67916:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33441:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64286:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67066:114;;;:::i;:::-;;3031:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64457:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63513:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67296:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63447:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63481:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37124:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63550:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34570:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10406:103;;;;;;;;;;;;;:::i;:::-;;67608:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63246:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9755:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67516:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64872:533;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37485:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63286:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65413:549;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63937:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66902:69;;;;;;;;;;;;;:::i;:::-;;63373:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64636:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66245:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68009:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66398:491;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67404:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67828:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63326:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39470:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63749:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65974:258;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10664:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67728:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34201:305;34303:4;34355:25;34340:40;;;:11;:40;;;;:105;;;;34412:33;34397:48;;;:11;:48;;;;34340:105;:158;;;;34462:36;34486:11;34462:23;:36::i;:::-;34340:158;34320:178;;34201:305;;;:::o;66979:79::-;9986:12;:10;:12::i;:::-;9975:23;;:7;:5;:7::i;:::-;:23;;;9967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67044:6:::1;67035;;:15;;;;;;;;;;;;;;;;;;66979:79:::0;:::o;37316:100::-;37370:13;37403:5;37396:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37316:100;:::o;38836:204::-;38904:7;38929:16;38937:7;38929;:16::i;:::-;38924:64;;38954:34;;;;;;;;;;;;;;38924:64;39008:15;:24;39024:7;39008:24;;;;;;;;;;;;;;;;;;;;;39001:31;;38836:204;;;:::o;63598:100::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64121:157::-;64217:8;5073:1;3131:42;5025:45;;;:49;5021:225;;;3131:42;5096;;;5147:4;5154:8;5096:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5091:144;;5210:8;5191:28;;;;;;;;;;;:::i;:::-;;;;;;;;5091:144;5021:225;64238:32:::1;64252:8;64262:7;64238:13;:32::i;:::-;64121:157:::0;;;:::o;67916:85::-;9986:12;:10;:12::i;:::-;9975:23;;:7;:5;:7::i;:::-;:23;;;9967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67987:6:::1;67977:7;;:16;;;;;;;;;;;;;;;;;;67916:85:::0;:::o;33441:312::-;33494:7;33719:15;:13;:15::i;:::-;33704:12;;33688:13;;:28;:46;33681:53;;33441:312;:::o;64286:163::-;64387:4;4327:1;3131:42;4279:45;;;:49;4275:539;;;4568:10;4560:18;;:4;:18;;;4556:85;;64404:37:::1;64423:4;64429:2;64433:7;64404:18;:37::i;:::-;4619:7:::0;;4556:85;3131:42;4660;;;4711:4;4718:10;4660:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4655:148;;4776:10;4757:30;;;;;;;;;;;:::i;:::-;;;;;;;;4655:148;4275:539;64404:37:::1;64423:4;64429:2;64433:7;64404:18;:37::i;:::-;64286:163:::0;;;;;:::o;67066:114::-;9986:12;:10;:12::i;:::-;9975:23;;:7;:5;:7::i;:::-;:23;;;9967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67132:7:::1;:5;:7::i;:::-;67124:25;;:48;67150:21;67124:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;67066:114::o:0;3031:143::-;3131:42;3031:143;:::o;64457:171::-;64562:4;4327:1;3131:42;4279:45;;;:49;4275:539;;;4568:10;4560:18;;:4;:18;;;4556:85;;64579:41:::1;64602:4;64608:2;64612:7;64579:22;:41::i;:::-;4619:7:::0;;4556:85;3131:42;4660;;;4711:4;4718:10;4660:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4655:148;;4776:10;4757:30;;;;;;;;;;;:::i;:::-;;;;;;;;4655:148;4275:539;64579:41:::1;64602:4;64608:2;64612:7;64579:22;:41::i;:::-;64457:171:::0;;;;;:::o;63513:28::-;;;;;;;;;;;;;:::o;67296:100::-;9986:12;:10;:12::i;:::-;9975:23;;:7;:5;:7::i;:::-;:23;;;9967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67377:11:::1;67367:7;:21;;;;;;:::i;:::-;;67296:100:::0;:::o;63447:27::-;;;;;;;;;;;;;:::o;63481:25::-;;;;;;;;;;;;;:::o;37124:125::-;37188:7;37215:21;37228:7;37215:12;:21::i;:::-;:26;;;37208:33;;37124:125;;;:::o;63550:41::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34570:206::-;34634:7;34675:1;34658:19;;:5;:19;;;34654:60;;34686:28;;;;;;;;;;;;;;34654:60;34740:12;:19;34753:5;34740:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;34732:36;;34725:43;;34570:206;;;:::o;10406:103::-;9986:12;:10;:12::i;:::-;9975:23;;:7;:5;:7::i;:::-;:23;;;9967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10471:30:::1;10498:1;10471:18;:30::i;:::-;10406:103::o:0;67608:112::-;9986:12;:10;:12::i;:::-;9975:23;;:7;:5;:7::i;:::-;:23;;;9967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67699:13:::1;67684:12;:28;;;;67608:112:::0;:::o;63246:33::-;;;;:::o;9755:87::-;9801:7;9828:6;;;;;;;;;;;9821:13;;9755:87;:::o;67516:84::-;9986:12;:10;:12::i;:::-;9975:23;;:7;:5;:7::i;:::-;:23;;;9967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67586:6:::1;67578:5;:14;;;;67516:84:::0;:::o;64872:533::-;64994:10;;64982:8;64966:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;64958:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;65060:7;:5;:7::i;:::-;65046:21;;:10;:21;;;65042:310;;65102:5;65092:15;;:6;;;;;;;;;;;:15;;;65084:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;65149:55;65157:5;65191:10;65174:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;65164:39;;;;;;65149:7;:55::i;:::-;65141:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;65283:8;65273:7;;:18;;;;:::i;:::-;65260:9;:31;;65252:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;65042:310;65362:31;65372:10;65384:8;65362:9;:31::i;:::-;64872:533;;:::o;37485:104::-;37541:13;37574:7;37567:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37485:104;:::o;63286:33::-;;;;:::o;65413:549::-;65509:10;;65497:8;65481:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;65473:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;65575:7;:5;:7::i;:::-;65561:21;;:10;:21;;;65557:352;;65617:5;65607:15;;:6;;;;;;;;;;;:15;;;65599:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;65671:5;65660:16;;:7;;;;;;;;;;;:16;;;65656:233;;65726:8;65718:5;;:16;;;;:::i;:::-;65705:9;:29;;65697:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;65656:233;;;65841:8;65826:12;;:23;;;;:::i;:::-;65813:9;:36;;65805:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;65656:233;65557:352;65919:31;65929:10;65941:8;65919:9;:31::i;:::-;65413:549;:::o;63937:176::-;64041:8;5073:1;3131:42;5025:45;;;:49;5021:225;;;3131:42;5096;;;5147:4;5154:8;5096:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5091:144;;5210:8;5191:28;;;;;;;;;;;:::i;:::-;;;;;;;;5091:144;5021:225;64062:43:::1;64086:8;64096;64062:23;:43::i;:::-;63937:176:::0;;;:::o;66902:69::-;9986:12;:10;:12::i;:::-;9975:23;;:7;:5;:7::i;:::-;:23;;;9967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66959:4:::1;66948:8;;:15;;;;;;;;;;;;;;;;;;66902:69::o:0;63373:35::-;;;;:::o;64636:228::-;64787:4;4327:1;3131:42;4279:45;;;:49;4275:539;;;4568:10;4560:18;;:4;:18;;;4556:85;;64809:47:::1;64832:4;64838:2;64842:7;64851:4;64809:22;:47::i;:::-;4619:7:::0;;4556:85;3131:42;4660;;;4711:4;4718:10;4660:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4655:148;;4776:10;4757:30;;;;;;;;;;;:::i;:::-;;;;;;;;4655:148;4275:539;64809:47:::1;64832:4;64838:2;64842:7;64851:4;64809:22;:47::i;:::-;64636:228:::0;;;;;;:::o;66245:145::-;66321:4;66345:37;66364:5;66371:4;;66377;66345:18;:37::i;:::-;66338:44;;66245:145;;;;:::o;68009:132::-;9986:12;:10;:12::i;:::-;9975:23;;:7;:5;:7::i;:::-;:23;;;9967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68115:18:::1;68098:14;:35;;;;;;:::i;:::-;;68009:132:::0;:::o;66398:491::-;66496:13;66537:16;66545:7;66537;:16::i;:::-;66521:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;66646:5;66634:17;;:8;;;;;;;;;;;:17;;;66631:62;;66671:14;66664:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66631:62;66701:28;66732:10;:8;:10::i;:::-;66701:41;;66787:1;66762:14;66756:28;:32;:127;;;;;;;;;;;;;;;;;66824:14;66840:18;:7;:16;:18::i;:::-;66807:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66756:127;66749:134;;;66398:491;;;;:::o;67404:104::-;9986:12;:10;:12::i;:::-;9975:23;;:7;:5;:7::i;:::-;:23;;;9967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67489:11:::1;67476:10;:24;;;;67404:104:::0;:::o;67828:80::-;9986:12;:10;:12::i;:::-;9975:23;;:7;:5;:7::i;:::-;:23;;;9967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67895:5:::1;67888:4;:12;;;;67828:80:::0;:::o;63326:40::-;;;;:::o;39470:164::-;39567:4;39591:18;:25;39610:5;39591:25;;;;;;;;;;;;;;;:35;39617:8;39591:35;;;;;;;;;;;;;;;;;;;;;;;;;39584:42;;39470:164;;;;:::o;63749:19::-;;;;:::o;65974:258::-;66075:10;;66063:8;66047:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;66039:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66145:7;:5;:7::i;:::-;66131:21;;:10;:21;;;66123:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;66189:31;66199:10;66211:8;66189:9;:31::i;:::-;65974:258;:::o;10664:201::-;9986:12;:10;:12::i;:::-;9975:23;;:7;:5;:7::i;:::-;:23;;;9967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10773:1:::1;10753:22;;:8;:22;;::::0;10745:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10829:28;10848:8;10829:18;:28::i;:::-;10664:201:::0;:::o;67728:92::-;9986:12;:10;:12::i;:::-;9975:23;;:7;:5;:7::i;:::-;:23;;;9967:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67804:8:::1;67794:7;:18;;;;67728:92:::0;:::o;22562:157::-;22647:4;22686:25;22671:40;;;:11;:40;;;;22664:47;;22562:157;;;:::o;8479:98::-;8532:7;8559:10;8552:17;;8479:98;:::o;40823:174::-;40880:4;40923:7;40904:15;:13;:15::i;:::-;:26;;:53;;;;;40944:13;;40934:7;:23;40904:53;:85;;;;;40962:11;:20;40974:7;40962:20;;;;;;;;;;;:27;;;;;;;;;;;;40961:28;40904:85;40897:92;;40823:174;;;:::o;38391:379::-;38471:13;38487:24;38503:7;38487:15;:24::i;:::-;38471:40;;38532:5;38526:11;;:2;:11;;;38522:48;;38546:24;;;;;;;;;;;;;;38522:48;38603:5;38587:21;;:12;:10;:12::i;:::-;:21;;;38583:139;;38614:37;38631:5;38638:12;:10;:12::i;:::-;38614:16;:37::i;:::-;38610:112;;38675:35;;;;;;;;;;;;;;38610:112;38583:139;38734:28;38743:2;38747:7;38756:5;38734:8;:28::i;:::-;38460:310;38391:379;;:::o;33215:92::-;33271:7;33298:1;33291:8;;33215:92;:::o;39701:170::-;39835:28;39845:4;39851:2;39855:7;39835:9;:28::i;:::-;39701:170;;;:::o;39942:185::-;40080:39;40097:4;40103:2;40107:7;40080:39;;;;;;;;;;;;:16;:39::i;:::-;39942:185;;;:::o;35951:1111::-;36013:21;;:::i;:::-;36047:12;36062:7;36047:22;;36130:4;36111:15;:13;:15::i;:::-;:23;36107:888;;36147:13;;36140:4;:20;36136:859;;;36181:31;36215:11;:17;36227:4;36215:17;;;;;;;;;;;36181:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36256:9;:16;;;36251:729;;36327:1;36301:28;;:9;:14;;;:28;;;36297:101;;36365:9;36358:16;;;;;;36297:101;36700:261;36707:4;36700:261;;;36740:6;;;;;;;;36785:11;:17;36797:4;36785:17;;;;;;;;;;;36773:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36859:1;36833:28;;:9;:14;;;:28;;;36829:109;;36901:9;36894:16;;;;;;36829:109;36700:261;;;36251:729;36162:833;36136:859;36107:888;37023:31;;;;;;;;;;;;;;35951:1111;;;;:::o;11025:191::-;11099:16;11118:6;;;;;;;;;;;11099:25;;11144:8;11135:6;;:17;;;;;;;;;;;;;;;;;;11199:8;11168:40;;11189:8;11168:40;;;;;;;;;;;;11088:128;11025:191;:::o;41081:104::-;41150:27;41160:2;41164:8;41150:27;;;;;;;;;;;;:9;:27::i;:::-;41081:104;;:::o;39112:287::-;39223:12;:10;:12::i;:::-;39211:24;;:8;:24;;;39207:54;;39244:17;;;;;;;;;;;;;;39207:54;39319:8;39274:18;:32;39293:12;:10;:12::i;:::-;39274:32;;;;;;;;;;;;;;;:42;39307:8;39274:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;39372:8;39343:48;;39358:12;:10;:12::i;:::-;39343:48;;;39382:8;39343:48;;;;;;:::i;:::-;;;;;;;;39112:287;;:::o;40198:370::-;40365:28;40375:4;40381:2;40385:7;40365:9;:28::i;:::-;40408:15;:2;:13;;;:15::i;:::-;40404:157;;;40429:56;40460:4;40466:2;40470:7;40479:5;40429:30;:56::i;:::-;40425:136;;40509:40;;;;;;;;;;;;;;40425:136;40404:157;40198:370;;;;:::o;55585:190::-;55710:4;55763;55734:25;55747:5;55754:4;55734:12;:25::i;:::-;:33;55727:40;;55585:190;;;;;:::o;67188:100::-;67240:13;67273:7;67266:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67188:100;:::o;6041:723::-;6097:13;6327:1;6318:5;:10;6314:53;;6345:10;;;;;;;;;;;;;;;;;;;;;6314:53;6377:12;6392:5;6377:20;;6408:14;6433:78;6448:1;6440:4;:9;6433:78;;6466:8;;;;;:::i;:::-;;;;6497:2;6489:10;;;;;:::i;:::-;;;6433:78;;;6521:19;6553:6;6543:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6521:39;;6571:154;6587:1;6578:5;:10;6571:154;;6615:1;6605:11;;;;;:::i;:::-;;;6682:2;6674:5;:10;;;;:::i;:::-;6661:2;:24;;;;:::i;:::-;6648:39;;6631:6;6638;6631:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6711:2;6702:11;;;;;:::i;:::-;;;6571:154;;;6749:6;6735:21;;;;;6041:723;;;;:::o;50045:196::-;50187:2;50160:15;:24;50176:7;50160:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;50225:7;50221:2;50205:28;;50214:5;50205:28;;;;;;;;;;;;50045:196;;;:::o;44993:2130::-;45108:35;45146:21;45159:7;45146:12;:21::i;:::-;45108:59;;45206:4;45184:26;;:13;:18;;;:26;;;45180:67;;45219:28;;;;;;;;;;;;;;45180:67;45260:22;45302:4;45286:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;45323:36;45340:4;45346:12;:10;:12::i;:::-;45323:16;:36::i;:::-;45286:73;:126;;;;45400:12;:10;:12::i;:::-;45376:36;;:20;45388:7;45376:11;:20::i;:::-;:36;;;45286:126;45260:153;;45431:17;45426:66;;45457:35;;;;;;;;;;;;;;45426:66;45521:1;45507:16;;:2;:16;;;45503:52;;45532:23;;;;;;;;;;;;;;45503:52;45568:43;45590:4;45596:2;45600:7;45609:1;45568:21;:43::i;:::-;45676:35;45693:1;45697:7;45706:4;45676:8;:35::i;:::-;46037:1;46007:12;:18;46020:4;46007:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46081:1;46053:12;:16;46066:2;46053:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46099:31;46133:11;:20;46145:7;46133:20;;;;;;;;;;;46099:54;;46184:2;46168:8;:13;;;:18;;;;;;;;;;;;;;;;;;46234:15;46201:8;:23;;;:49;;;;;;;;;;;;;;;;;;46502:19;46534:1;46524:7;:11;46502:33;;46550:31;46584:11;:24;46596:11;46584:24;;;;;;;;;;;46550:58;;46652:1;46627:27;;:8;:13;;;;;;;;;;;;:27;;;46623:384;;46837:13;;46822:11;:28;46818:174;;46891:4;46875:8;:13;;;:20;;;;;;;;;;;;;;;;;;46944:13;:28;;;46918:8;:23;;;:54;;;;;;;;;;;;;;;;;;46818:174;46623:384;45982:1036;;;47054:7;47050:2;47035:27;;47044:4;47035:27;;;;;;;;;;;;47073:42;47094:4;47100:2;47104:7;47113:1;47073:20;:42::i;:::-;45097:2026;;44993:2130;;;:::o;41558:1749::-;41681:20;41704:13;;41681:36;;41746:1;41732:16;;:2;:16;;;41728:48;;41757:19;;;;;;;;;;;;;;41728:48;41803:1;41791:8;:13;41787:44;;41813:18;;;;;;;;;;;;;;41787:44;41844:61;41874:1;41878:2;41882:12;41896:8;41844:21;:61::i;:::-;42217:8;42182:12;:16;42195:2;42182:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42281:8;42241:12;:16;42254:2;42241:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42340:2;42307:11;:25;42319:12;42307:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;42407:15;42357:11;:25;42369:12;42357:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;42440:20;42463:12;42440:35;;42490:11;42519:8;42504:12;:23;42490:37;;42548:15;:2;:13;;;:15::i;:::-;42544:631;;;42584:313;42640:12;42636:2;42615:38;;42632:1;42615:38;;;;;;;;;;;;42681:69;42720:1;42724:2;42728:14;;;;;;42744:5;42681:30;:69::i;:::-;42676:174;;42786:40;;;;;;;;;;;;;;42676:174;42892:3;42877:12;:18;42584:313;;42978:12;42961:13;;:29;42957:43;;42992:8;;;42957:43;42544:631;;;43041:119;43097:14;;;;;;43093:2;43072:40;;43089:1;43072:40;;;;;;;;;;;;43155:3;43140:12;:18;43041:119;;42544:631;43205:12;43189:13;:28;;;;42157:1072;;43239:60;43268:1;43272:2;43276:12;43290:8;43239:20;:60::i;:::-;41670:1637;41558:1749;;;:::o;12456:326::-;12516:4;12773:1;12751:7;:19;;;:23;12744:30;;12456:326;;;:::o;50733:667::-;50896:4;50933:2;50917:36;;;50954:12;:10;:12::i;:::-;50968:4;50974:7;50983:5;50917:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50913:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51168:1;51151:6;:13;:18;51147:235;;51197:40;;;;;;;;;;;;;;51147:235;51340:6;51334:13;51325:6;51321:2;51317:15;51310:38;50913:480;51046:45;;;51036:55;;;:6;:55;;;;51029:62;;;50733:667;;;;;;:::o;56452:296::-;56535:7;56555:20;56578:4;56555:27;;56598:9;56593:118;56617:5;:12;56613:1;:16;56593:118;;;56666:33;56676:12;56690:5;56696:1;56690:8;;;;;;;;:::i;:::-;;;;;;;;56666:9;:33::i;:::-;56651:48;;56631:3;;;;;:::i;:::-;;;;56593:118;;;;56728:12;56721:19;;;56452:296;;;;:::o;52048:159::-;;;;;:::o;52866:158::-;;;;;:::o;62659:149::-;62722:7;62753:1;62749;:5;:51;;62780:20;62795:1;62798;62780:14;:20::i;:::-;62749:51;;;62757:20;62772:1;62775;62757:14;:20::i;:::-;62749:51;62742:58;;62659:149;;;;:::o;62816:268::-;62884:13;62991:1;62985:4;62978:15;63020:1;63014:4;63007:15;63061:4;63055;63045:21;63036:30;;62816:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:246::-;2469:1;2479:113;2493:6;2490:1;2487:13;2479:113;;;2578:1;2573:3;2569:11;2563:18;2559:1;2554:3;2550:11;2543:39;2515:2;2512:1;2508:10;2503:15;;2479:113;;;2626:1;2617:6;2612:3;2608:16;2601:27;2450:184;2388:246;;;:::o;2640:102::-;2681:6;2732:2;2728:7;2723:2;2716:5;2712:14;2708:28;2698:38;;2640:102;;;:::o;2748:377::-;2836:3;2864:39;2897:5;2864:39;:::i;:::-;2919:71;2983:6;2978:3;2919:71;:::i;:::-;2912:78;;2999:65;3057:6;3052:3;3045:4;3038:5;3034:16;2999:65;:::i;:::-;3089:29;3111:6;3089:29;:::i;:::-;3084:3;3080:39;3073:46;;2840:285;2748:377;;;;:::o;3131:313::-;3244:4;3282:2;3271:9;3267:18;3259:26;;3331:9;3325:4;3321:20;3317:1;3306:9;3302:17;3295:47;3359:78;3432:4;3423:6;3359:78;:::i;:::-;3351:86;;3131:313;;;;:::o;3450:77::-;3487:7;3516:5;3505:16;;3450:77;;;:::o;3533:122::-;3606:24;3624:5;3606:24;:::i;:::-;3599:5;3596:35;3586:63;;3645:1;3642;3635:12;3586:63;3533:122;:::o;3661:139::-;3707:5;3745:6;3732:20;3723:29;;3761:33;3788:5;3761:33;:::i;:::-;3661:139;;;;:::o;3806:329::-;3865:6;3914:2;3902:9;3893:7;3889:23;3885:32;3882:119;;;3920:79;;:::i;:::-;3882:119;4040:1;4065:53;4110:7;4101:6;4090:9;4086:22;4065:53;:::i;:::-;4055:63;;4011:117;3806:329;;;;:::o;4141:126::-;4178:7;4218:42;4211:5;4207:54;4196:65;;4141:126;;;:::o;4273:96::-;4310:7;4339:24;4357:5;4339:24;:::i;:::-;4328:35;;4273:96;;;:::o;4375:118::-;4462:24;4480:5;4462:24;:::i;:::-;4457:3;4450:37;4375:118;;:::o;4499:222::-;4592:4;4630:2;4619:9;4615:18;4607:26;;4643:71;4711:1;4700:9;4696:17;4687:6;4643:71;:::i;:::-;4499:222;;;;:::o;4727:122::-;4800:24;4818:5;4800:24;:::i;:::-;4793:5;4790:35;4780:63;;4839:1;4836;4829:12;4780:63;4727:122;:::o;4855:139::-;4901:5;4939:6;4926:20;4917:29;;4955:33;4982:5;4955:33;:::i;:::-;4855:139;;;;:::o;5000:474::-;5068:6;5076;5125:2;5113:9;5104:7;5100:23;5096:32;5093:119;;;5131:79;;:::i;:::-;5093:119;5251:1;5276:53;5321:7;5312:6;5301:9;5297:22;5276:53;:::i;:::-;5266:63;;5222:117;5378:2;5404:53;5449:7;5440:6;5429:9;5425:22;5404:53;:::i;:::-;5394:63;;5349:118;5000:474;;;;;:::o;5480:118::-;5567:24;5585:5;5567:24;:::i;:::-;5562:3;5555:37;5480:118;;:::o;5604:222::-;5697:4;5735:2;5724:9;5720:18;5712:26;;5748:71;5816:1;5805:9;5801:17;5792:6;5748:71;:::i;:::-;5604:222;;;;:::o;5832:619::-;5909:6;5917;5925;5974:2;5962:9;5953:7;5949:23;5945:32;5942:119;;;5980:79;;:::i;:::-;5942:119;6100:1;6125:53;6170:7;6161:6;6150:9;6146:22;6125:53;:::i;:::-;6115:63;;6071:117;6227:2;6253:53;6298:7;6289:6;6278:9;6274:22;6253:53;:::i;:::-;6243:63;;6198:118;6355:2;6381:53;6426:7;6417:6;6406:9;6402:22;6381:53;:::i;:::-;6371:63;;6326:118;5832:619;;;;;:::o;6457:60::-;6485:3;6506:5;6499:12;;6457:60;;;:::o;6523:142::-;6573:9;6606:53;6624:34;6633:24;6651:5;6633:24;:::i;:::-;6624:34;:::i;:::-;6606:53;:::i;:::-;6593:66;;6523:142;;;:::o;6671:126::-;6721:9;6754:37;6785:5;6754:37;:::i;:::-;6741:50;;6671:126;;;:::o;6803:157::-;6884:9;6917:37;6948:5;6917:37;:::i;:::-;6904:50;;6803:157;;;:::o;6966:193::-;7084:68;7146:5;7084:68;:::i;:::-;7079:3;7072:81;6966:193;;:::o;7165:284::-;7289:4;7327:2;7316:9;7312:18;7304:26;;7340:102;7439:1;7428:9;7424:17;7415:6;7340:102;:::i;:::-;7165:284;;;;:::o;7455:117::-;7564:1;7561;7554:12;7578:117;7687:1;7684;7677:12;7701:180;7749:77;7746:1;7739:88;7846:4;7843:1;7836:15;7870:4;7867:1;7860:15;7887:281;7970:27;7992:4;7970:27;:::i;:::-;7962:6;7958:40;8100:6;8088:10;8085:22;8064:18;8052:10;8049:34;8046:62;8043:88;;;8111:18;;:::i;:::-;8043:88;8151:10;8147:2;8140:22;7930:238;7887:281;;:::o;8174:129::-;8208:6;8235:20;;:::i;:::-;8225:30;;8264:33;8292:4;8284:6;8264:33;:::i;:::-;8174:129;;;:::o;8309:308::-;8371:4;8461:18;8453:6;8450:30;8447:56;;;8483:18;;:::i;:::-;8447:56;8521:29;8543:6;8521:29;:::i;:::-;8513:37;;8605:4;8599;8595:15;8587:23;;8309:308;;;:::o;8623:146::-;8720:6;8715:3;8710;8697:30;8761:1;8752:6;8747:3;8743:16;8736:27;8623:146;;;:::o;8775:425::-;8853:5;8878:66;8894:49;8936:6;8894:49;:::i;:::-;8878:66;:::i;:::-;8869:75;;8967:6;8960:5;8953:21;9005:4;8998:5;8994:16;9043:3;9034:6;9029:3;9025:16;9022:25;9019:112;;;9050:79;;:::i;:::-;9019:112;9140:54;9187:6;9182:3;9177;9140:54;:::i;:::-;8859:341;8775:425;;;;;:::o;9220:340::-;9276:5;9325:3;9318:4;9310:6;9306:17;9302:27;9292:122;;9333:79;;:::i;:::-;9292:122;9450:6;9437:20;9475:79;9550:3;9542:6;9535:4;9527:6;9523:17;9475:79;:::i;:::-;9466:88;;9282:278;9220:340;;;;:::o;9566:509::-;9635:6;9684:2;9672:9;9663:7;9659:23;9655:32;9652:119;;;9690:79;;:::i;:::-;9652:119;9838:1;9827:9;9823:17;9810:31;9868:18;9860:6;9857:30;9854:117;;;9890:79;;:::i;:::-;9854:117;9995:63;10050:7;10041:6;10030:9;10026:22;9995:63;:::i;:::-;9985:73;;9781:287;9566:509;;;;:::o;10081:329::-;10140:6;10189:2;10177:9;10168:7;10164:23;10160:32;10157:119;;;10195:79;;:::i;:::-;10157:119;10315:1;10340:53;10385:7;10376:6;10365:9;10361:22;10340:53;:::i;:::-;10330:63;;10286:117;10081:329;;;;:::o;10416:311::-;10493:4;10583:18;10575:6;10572:30;10569:56;;;10605:18;;:::i;:::-;10569:56;10655:4;10647:6;10643:17;10635:25;;10715:4;10709;10705:15;10697:23;;10416:311;;;:::o;10733:117::-;10842:1;10839;10832:12;10856:77;10893:7;10922:5;10911:16;;10856:77;;;:::o;10939:122::-;11012:24;11030:5;11012:24;:::i;:::-;11005:5;11002:35;10992:63;;11051:1;11048;11041:12;10992:63;10939:122;:::o;11067:139::-;11113:5;11151:6;11138:20;11129:29;;11167:33;11194:5;11167:33;:::i;:::-;11067:139;;;;:::o;11229:710::-;11325:5;11350:81;11366:64;11423:6;11366:64;:::i;:::-;11350:81;:::i;:::-;11341:90;;11451:5;11480:6;11473:5;11466:21;11514:4;11507:5;11503:16;11496:23;;11567:4;11559:6;11555:17;11547:6;11543:30;11596:3;11588:6;11585:15;11582:122;;;11615:79;;:::i;:::-;11582:122;11730:6;11713:220;11747:6;11742:3;11739:15;11713:220;;;11822:3;11851:37;11884:3;11872:10;11851:37;:::i;:::-;11846:3;11839:50;11918:4;11913:3;11909:14;11902:21;;11789:144;11773:4;11768:3;11764:14;11757:21;;11713:220;;;11717:21;11331:608;;11229:710;;;;;:::o;11962:370::-;12033:5;12082:3;12075:4;12067:6;12063:17;12059:27;12049:122;;12090:79;;:::i;:::-;12049:122;12207:6;12194:20;12232:94;12322:3;12314:6;12307:4;12299:6;12295:17;12232:94;:::i;:::-;12223:103;;12039:293;11962:370;;;;:::o;12338:684::-;12431:6;12439;12488:2;12476:9;12467:7;12463:23;12459:32;12456:119;;;12494:79;;:::i;:::-;12456:119;12614:1;12639:53;12684:7;12675:6;12664:9;12660:22;12639:53;:::i;:::-;12629:63;;12585:117;12769:2;12758:9;12754:18;12741:32;12800:18;12792:6;12789:30;12786:117;;;12822:79;;:::i;:::-;12786:117;12927:78;12997:7;12988:6;12977:9;12973:22;12927:78;:::i;:::-;12917:88;;12712:303;12338:684;;;;;:::o;13028:468::-;13093:6;13101;13150:2;13138:9;13129:7;13125:23;13121:32;13118:119;;;13156:79;;:::i;:::-;13118:119;13276:1;13301:53;13346:7;13337:6;13326:9;13322:22;13301:53;:::i;:::-;13291:63;;13247:117;13403:2;13429:50;13471:7;13462:6;13451:9;13447:22;13429:50;:::i;:::-;13419:60;;13374:115;13028:468;;;;;:::o;13502:307::-;13563:4;13653:18;13645:6;13642:30;13639:56;;;13675:18;;:::i;:::-;13639:56;13713:29;13735:6;13713:29;:::i;:::-;13705:37;;13797:4;13791;13787:15;13779:23;;13502:307;;;:::o;13815:423::-;13892:5;13917:65;13933:48;13974:6;13933:48;:::i;:::-;13917:65;:::i;:::-;13908:74;;14005:6;13998:5;13991:21;14043:4;14036:5;14032:16;14081:3;14072:6;14067:3;14063:16;14060:25;14057:112;;;14088:79;;:::i;:::-;14057:112;14178:54;14225:6;14220:3;14215;14178:54;:::i;:::-;13898:340;13815:423;;;;;:::o;14257:338::-;14312:5;14361:3;14354:4;14346:6;14342:17;14338:27;14328:122;;14369:79;;:::i;:::-;14328:122;14486:6;14473:20;14511:78;14585:3;14577:6;14570:4;14562:6;14558:17;14511:78;:::i;:::-;14502:87;;14318:277;14257:338;;;;:::o;14601:943::-;14696:6;14704;14712;14720;14769:3;14757:9;14748:7;14744:23;14740:33;14737:120;;;14776:79;;:::i;:::-;14737:120;14896:1;14921:53;14966:7;14957:6;14946:9;14942:22;14921:53;:::i;:::-;14911:63;;14867:117;15023:2;15049:53;15094:7;15085:6;15074:9;15070:22;15049:53;:::i;:::-;15039:63;;14994:118;15151:2;15177:53;15222:7;15213:6;15202:9;15198:22;15177:53;:::i;:::-;15167:63;;15122:118;15307:2;15296:9;15292:18;15279:32;15338:18;15330:6;15327:30;15324:117;;;15360:79;;:::i;:::-;15324:117;15465:62;15519:7;15510:6;15499:9;15495:22;15465:62;:::i;:::-;15455:72;;15250:287;14601:943;;;;;;;:::o;15550:684::-;15643:6;15651;15700:2;15688:9;15679:7;15675:23;15671:32;15668:119;;;15706:79;;:::i;:::-;15668:119;15854:1;15843:9;15839:17;15826:31;15884:18;15876:6;15873:30;15870:117;;;15906:79;;:::i;:::-;15870:117;16011:78;16081:7;16072:6;16061:9;16057:22;16011:78;:::i;:::-;16001:88;;15797:302;16138:2;16164:53;16209:7;16200:6;16189:9;16185:22;16164:53;:::i;:::-;16154:63;;16109:118;15550:684;;;;;:::o;16240:329::-;16299:6;16348:2;16336:9;16327:7;16323:23;16319:32;16316:119;;;16354:79;;:::i;:::-;16316:119;16474:1;16499:53;16544:7;16535:6;16524:9;16520:22;16499:53;:::i;:::-;16489:63;;16445:117;16240:329;;;;:::o;16575:474::-;16643:6;16651;16700:2;16688:9;16679:7;16675:23;16671:32;16668:119;;;16706:79;;:::i;:::-;16668:119;16826:1;16851:53;16896:7;16887:6;16876:9;16872:22;16851:53;:::i;:::-;16841:63;;16797:117;16953:2;16979:53;17024:7;17015:6;17004:9;17000:22;16979:53;:::i;:::-;16969:63;;16924:118;16575:474;;;;;:::o;17055:118::-;17142:24;17160:5;17142:24;:::i;:::-;17137:3;17130:37;17055:118;;:::o;17179:222::-;17272:4;17310:2;17299:9;17295:18;17287:26;;17323:71;17391:1;17380:9;17376:17;17367:6;17323:71;:::i;:::-;17179:222;;;;:::o;17407:182::-;17547:34;17543:1;17535:6;17531:14;17524:58;17407:182;:::o;17595:366::-;17737:3;17758:67;17822:2;17817:3;17758:67;:::i;:::-;17751:74;;17834:93;17923:3;17834:93;:::i;:::-;17952:2;17947:3;17943:12;17936:19;;17595:366;;;:::o;17967:419::-;18133:4;18171:2;18160:9;18156:18;18148:26;;18220:9;18214:4;18210:20;18206:1;18195:9;18191:17;18184:47;18248:131;18374:4;18248:131;:::i;:::-;18240:139;;17967:419;;;:::o;18392:180::-;18440:77;18437:1;18430:88;18537:4;18534:1;18527:15;18561:4;18558:1;18551:15;18578:320;18622:6;18659:1;18653:4;18649:12;18639:22;;18706:1;18700:4;18696:12;18727:18;18717:81;;18783:4;18775:6;18771:17;18761:27;;18717:81;18845:2;18837:6;18834:14;18814:18;18811:38;18808:84;;18864:18;;:::i;:::-;18808:84;18629:269;18578:320;;;:::o;18904:332::-;19025:4;19063:2;19052:9;19048:18;19040:26;;19076:71;19144:1;19133:9;19129:17;19120:6;19076:71;:::i;:::-;19157:72;19225:2;19214:9;19210:18;19201:6;19157:72;:::i;:::-;18904:332;;;;;:::o;19242:137::-;19296:5;19327:6;19321:13;19312:22;;19343:30;19367:5;19343:30;:::i;:::-;19242:137;;;;:::o;19385:345::-;19452:6;19501:2;19489:9;19480:7;19476:23;19472:32;19469:119;;;19507:79;;:::i;:::-;19469:119;19627:1;19652:61;19705:7;19696:6;19685:9;19681:22;19652:61;:::i;:::-;19642:71;;19598:125;19385:345;;;;:::o;19736:141::-;19785:4;19808:3;19800:11;;19831:3;19828:1;19821:14;19865:4;19862:1;19852:18;19844:26;;19736:141;;;:::o;19883:93::-;19920:6;19967:2;19962;19955:5;19951:14;19947:23;19937:33;;19883:93;;;:::o;19982:107::-;20026:8;20076:5;20070:4;20066:16;20045:37;;19982:107;;;;:::o;20095:393::-;20164:6;20214:1;20202:10;20198:18;20237:97;20267:66;20256:9;20237:97;:::i;:::-;20355:39;20385:8;20374:9;20355:39;:::i;:::-;20343:51;;20427:4;20423:9;20416:5;20412:21;20403:30;;20476:4;20466:8;20462:19;20455:5;20452:30;20442:40;;20171:317;;20095:393;;;;;:::o;20494:142::-;20544:9;20577:53;20595:34;20604:24;20622:5;20604:24;:::i;:::-;20595:34;:::i;:::-;20577:53;:::i;:::-;20564:66;;20494:142;;;:::o;20642:75::-;20685:3;20706:5;20699:12;;20642:75;;;:::o;20723:269::-;20833:39;20864:7;20833:39;:::i;:::-;20894:91;20943:41;20967:16;20943:41;:::i;:::-;20935:6;20928:4;20922:11;20894:91;:::i;:::-;20888:4;20881:105;20799:193;20723:269;;;:::o;20998:73::-;21043:3;20998:73;:::o;21077:189::-;21154:32;;:::i;:::-;21195:65;21253:6;21245;21239:4;21195:65;:::i;:::-;21130:136;21077:189;;:::o;21272:186::-;21332:120;21349:3;21342:5;21339:14;21332:120;;;21403:39;21440:1;21433:5;21403:39;:::i;:::-;21376:1;21369:5;21365:13;21356:22;;21332:120;;;21272:186;;:::o;21464:543::-;21565:2;21560:3;21557:11;21554:446;;;21599:38;21631:5;21599:38;:::i;:::-;21683:29;21701:10;21683:29;:::i;:::-;21673:8;21669:44;21866:2;21854:10;21851:18;21848:49;;;21887:8;21872:23;;21848:49;21910:80;21966:22;21984:3;21966:22;:::i;:::-;21956:8;21952:37;21939:11;21910:80;:::i;:::-;21569:431;;21554:446;21464:543;;;:::o;22013:117::-;22067:8;22117:5;22111:4;22107:16;22086:37;;22013:117;;;;:::o;22136:169::-;22180:6;22213:51;22261:1;22257:6;22249:5;22246:1;22242:13;22213:51;:::i;:::-;22209:56;22294:4;22288;22284:15;22274:25;;22187:118;22136:169;;;;:::o;22310:295::-;22386:4;22532:29;22557:3;22551:4;22532:29;:::i;:::-;22524:37;;22594:3;22591:1;22587:11;22581:4;22578:21;22570:29;;22310:295;;;;:::o;22610:1395::-;22727:37;22760:3;22727:37;:::i;:::-;22829:18;22821:6;22818:30;22815:56;;;22851:18;;:::i;:::-;22815:56;22895:38;22927:4;22921:11;22895:38;:::i;:::-;22980:67;23040:6;23032;23026:4;22980:67;:::i;:::-;23074:1;23098:4;23085:17;;23130:2;23122:6;23119:14;23147:1;23142:618;;;;23804:1;23821:6;23818:77;;;23870:9;23865:3;23861:19;23855:26;23846:35;;23818:77;23921:67;23981:6;23974:5;23921:67;:::i;:::-;23915:4;23908:81;23777:222;23112:887;;23142:618;23194:4;23190:9;23182:6;23178:22;23228:37;23260:4;23228:37;:::i;:::-;23287:1;23301:208;23315:7;23312:1;23309:14;23301:208;;;23394:9;23389:3;23385:19;23379:26;23371:6;23364:42;23445:1;23437:6;23433:14;23423:24;;23492:2;23481:9;23477:18;23464:31;;23338:4;23335:1;23331:12;23326:17;;23301:208;;;23537:6;23528:7;23525:19;23522:179;;;23595:9;23590:3;23586:19;23580:26;23638:48;23680:4;23672:6;23668:17;23657:9;23638:48;:::i;:::-;23630:6;23623:64;23545:156;23522:179;23747:1;23743;23735:6;23731:14;23727:22;23721:4;23714:36;23149:611;;;23112:887;;22702:1303;;;22610:1395;;:::o;24011:180::-;24059:77;24056:1;24049:88;24156:4;24153:1;24146:15;24180:4;24177:1;24170:15;24197:191;24237:3;24256:20;24274:1;24256:20;:::i;:::-;24251:25;;24290:20;24308:1;24290:20;:::i;:::-;24285:25;;24333:1;24330;24326:9;24319:16;;24354:3;24351:1;24348:10;24345:36;;;24361:18;;:::i;:::-;24345:36;24197:191;;;;:::o;24394:172::-;24534:24;24530:1;24522:6;24518:14;24511:48;24394:172;:::o;24572:366::-;24714:3;24735:67;24799:2;24794:3;24735:67;:::i;:::-;24728:74;;24811:93;24900:3;24811:93;:::i;:::-;24929:2;24924:3;24920:12;24913:19;;24572:366;;;:::o;24944:419::-;25110:4;25148:2;25137:9;25133:18;25125:26;;25197:9;25191:4;25187:20;25183:1;25172:9;25168:17;25161:47;25225:131;25351:4;25225:131;:::i;:::-;25217:139;;24944:419;;;:::o;25369:164::-;25509:16;25505:1;25497:6;25493:14;25486:40;25369:164;:::o;25539:366::-;25681:3;25702:67;25766:2;25761:3;25702:67;:::i;:::-;25695:74;;25778:93;25867:3;25778:93;:::i;:::-;25896:2;25891:3;25887:12;25880:19;;25539:366;;;:::o;25911:419::-;26077:4;26115:2;26104:9;26100:18;26092:26;;26164:9;26158:4;26154:20;26150:1;26139:9;26135:17;26128:47;26192:131;26318:4;26192:131;:::i;:::-;26184:139;;25911:419;;;:::o;26336:94::-;26369:8;26417:5;26413:2;26409:14;26388:35;;26336:94;;;:::o;26436:::-;26475:7;26504:20;26518:5;26504:20;:::i;:::-;26493:31;;26436:94;;;:::o;26536:100::-;26575:7;26604:26;26624:5;26604:26;:::i;:::-;26593:37;;26536:100;;;:::o;26642:157::-;26747:45;26767:24;26785:5;26767:24;:::i;:::-;26747:45;:::i;:::-;26742:3;26735:58;26642:157;;:::o;26805:256::-;26917:3;26932:75;27003:3;26994:6;26932:75;:::i;:::-;27032:2;27027:3;27023:12;27016:19;;27052:3;27045:10;;26805:256;;;;:::o;27067:178::-;27207:30;27203:1;27195:6;27191:14;27184:54;27067:178;:::o;27251:366::-;27393:3;27414:67;27478:2;27473:3;27414:67;:::i;:::-;27407:74;;27490:93;27579:3;27490:93;:::i;:::-;27608:2;27603:3;27599:12;27592:19;;27251:366;;;:::o;27623:419::-;27789:4;27827:2;27816:9;27812:18;27804:26;;27876:9;27870:4;27866:20;27862:1;27851:9;27847:17;27840:47;27904:131;28030:4;27904:131;:::i;:::-;27896:139;;27623:419;;;:::o;28048:410::-;28088:7;28111:20;28129:1;28111:20;:::i;:::-;28106:25;;28145:20;28163:1;28145:20;:::i;:::-;28140:25;;28200:1;28197;28193:9;28222:30;28240:11;28222:30;:::i;:::-;28211:41;;28401:1;28392:7;28388:15;28385:1;28382:22;28362:1;28355:9;28335:83;28312:139;;28431:18;;:::i;:::-;28312:139;28096:362;28048:410;;;;:::o;28464:168::-;28604:20;28600:1;28592:6;28588:14;28581:44;28464:168;:::o;28638:366::-;28780:3;28801:67;28865:2;28860:3;28801:67;:::i;:::-;28794:74;;28877:93;28966:3;28877:93;:::i;:::-;28995:2;28990:3;28986:12;28979:19;;28638:366;;;:::o;29010:419::-;29176:4;29214:2;29203:9;29199:18;29191:26;;29263:9;29257:4;29253:20;29249:1;29238:9;29234:17;29227:47;29291:131;29417:4;29291:131;:::i;:::-;29283:139;;29010:419;;;:::o;29435:234::-;29575:34;29571:1;29563:6;29559:14;29552:58;29644:17;29639:2;29631:6;29627:15;29620:42;29435:234;:::o;29675:366::-;29817:3;29838:67;29902:2;29897:3;29838:67;:::i;:::-;29831:74;;29914:93;30003:3;29914:93;:::i;:::-;30032:2;30027:3;30023:12;30016:19;;29675:366;;;:::o;30047:419::-;30213:4;30251:2;30240:9;30236:18;30228:26;;30300:9;30294:4;30290:20;30286:1;30275:9;30271:17;30264:47;30328:131;30454:4;30328:131;:::i;:::-;30320:139;;30047:419;;;:::o;30472:148::-;30574:11;30611:3;30596:18;;30472:148;;;;:::o;30626:390::-;30732:3;30760:39;30793:5;30760:39;:::i;:::-;30815:89;30897:6;30892:3;30815:89;:::i;:::-;30808:96;;30913:65;30971:6;30966:3;30959:4;30952:5;30948:16;30913:65;:::i;:::-;31003:6;30998:3;30994:16;30987:23;;30736:280;30626:390;;;;:::o;31022:155::-;31162:7;31158:1;31150:6;31146:14;31139:31;31022:155;:::o;31183:400::-;31343:3;31364:84;31446:1;31441:3;31364:84;:::i;:::-;31357:91;;31457:93;31546:3;31457:93;:::i;:::-;31575:1;31570:3;31566:11;31559:18;;31183:400;;;:::o;31589:701::-;31870:3;31892:95;31983:3;31974:6;31892:95;:::i;:::-;31885:102;;32004:95;32095:3;32086:6;32004:95;:::i;:::-;31997:102;;32116:148;32260:3;32116:148;:::i;:::-;32109:155;;32281:3;32274:10;;31589:701;;;;;:::o;32296:171::-;32436:23;32432:1;32424:6;32420:14;32413:47;32296:171;:::o;32473:366::-;32615:3;32636:67;32700:2;32695:3;32636:67;:::i;:::-;32629:74;;32712:93;32801:3;32712:93;:::i;:::-;32830:2;32825:3;32821:12;32814:19;;32473:366;;;:::o;32845:419::-;33011:4;33049:2;33038:9;33034:18;33026:26;;33098:9;33092:4;33088:20;33084:1;33073:9;33069:17;33062:47;33126:131;33252:4;33126:131;:::i;:::-;33118:139;;32845:419;;;:::o;33270:225::-;33410:34;33406:1;33398:6;33394:14;33387:58;33479:8;33474:2;33466:6;33462:15;33455:33;33270:225;:::o;33501:366::-;33643:3;33664:67;33728:2;33723:3;33664:67;:::i;:::-;33657:74;;33740:93;33829:3;33740:93;:::i;:::-;33858:2;33853:3;33849:12;33842:19;;33501:366;;;:::o;33873:419::-;34039:4;34077:2;34066:9;34062:18;34054:26;;34126:9;34120:4;34116:20;34112:1;34101:9;34097:17;34090:47;34154:131;34280:4;34154:131;:::i;:::-;34146:139;;33873:419;;;:::o;34298:233::-;34337:3;34360:24;34378:5;34360:24;:::i;:::-;34351:33;;34406:66;34399:5;34396:77;34393:103;;34476:18;;:::i;:::-;34393:103;34523:1;34516:5;34512:13;34505:20;;34298:233;;;:::o;34537:180::-;34585:77;34582:1;34575:88;34682:4;34679:1;34672:15;34706:4;34703:1;34696:15;34723:185;34763:1;34780:20;34798:1;34780:20;:::i;:::-;34775:25;;34814:20;34832:1;34814:20;:::i;:::-;34809:25;;34853:1;34843:35;;34858:18;;:::i;:::-;34843:35;34900:1;34897;34893:9;34888:14;;34723:185;;;;:::o;34914:194::-;34954:4;34974:20;34992:1;34974:20;:::i;:::-;34969:25;;35008:20;35026:1;35008:20;:::i;:::-;35003:25;;35052:1;35049;35045:9;35037:17;;35076:1;35070:4;35067:11;35064:37;;;35081:18;;:::i;:::-;35064:37;34914:194;;;;:::o;35114:176::-;35146:1;35163:20;35181:1;35163:20;:::i;:::-;35158:25;;35197:20;35215:1;35197:20;:::i;:::-;35192:25;;35236:1;35226:35;;35241:18;;:::i;:::-;35226:35;35282:1;35279;35275:9;35270:14;;35114:176;;;;:::o;35296:180::-;35344:77;35341:1;35334:88;35441:4;35438:1;35431:15;35465:4;35462:1;35455:15;35482:98;35533:6;35567:5;35561:12;35551:22;;35482:98;;;:::o;35586:168::-;35669:11;35703:6;35698:3;35691:19;35743:4;35738:3;35734:14;35719:29;;35586:168;;;;:::o;35760:373::-;35846:3;35874:38;35906:5;35874:38;:::i;:::-;35928:70;35991:6;35986:3;35928:70;:::i;:::-;35921:77;;36007:65;36065:6;36060:3;36053:4;36046:5;36042:16;36007:65;:::i;:::-;36097:29;36119:6;36097:29;:::i;:::-;36092:3;36088:39;36081:46;;35850:283;35760:373;;;;:::o;36139:640::-;36334:4;36372:3;36361:9;36357:19;36349:27;;36386:71;36454:1;36443:9;36439:17;36430:6;36386:71;:::i;:::-;36467:72;36535:2;36524:9;36520:18;36511:6;36467:72;:::i;:::-;36549;36617:2;36606:9;36602:18;36593:6;36549:72;:::i;:::-;36668:9;36662:4;36658:20;36653:2;36642:9;36638:18;36631:48;36696:76;36767:4;36758:6;36696:76;:::i;:::-;36688:84;;36139:640;;;;;;;:::o;36785:141::-;36841:5;36872:6;36866:13;36857:22;;36888:32;36914:5;36888:32;:::i;:::-;36785:141;;;;:::o;36932:349::-;37001:6;37050:2;37038:9;37029:7;37025:23;37021:32;37018:119;;;37056:79;;:::i;:::-;37018:119;37176:1;37201:63;37256:7;37247:6;37236:9;37232:22;37201:63;:::i;:::-;37191:73;;37147:127;36932:349;;;;:::o
Swarm Source
ipfs://ab6e7b4b51d60992a801b742c807072b57d89b908eae330547781099b6522271
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.