ERC-721
Overview
Max Total Supply
744 FBP
Holders
359
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
5 FBPLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
FantomBlocParty
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-07-22 */ // SPDX-License-Identifier: MIT /* ______ ______ __ __ ______ ______ __ __ ______ __ ______ ______ /\ ___\ /\ __ \ /\ "-.\ \ /\__ _\ /\ __ \ /\ "-./ \ /\ == \ /\ \ /\ __ \ /\ ___\ \ \ __\ \ \ __ \ \ \ \-. \ \/_/\ \/ \ \ \/\ \ \ \ \-./\ \ \ \ __< \ \ \____ \ \ \/\ \ \ \ \____ \ \_\ \ \_\ \_\ \ \_\\"\_\ \ \_\ \ \_____\ \ \_\ \ \_\ \ \_____\ \ \_____\ \ \_____\ \ \_____\ \/_/ \/_/\/_/ \/_/ \/_/ \/_/ \/_____/ \/_/ \/_/ \/_____/ \/_____/ \/_____/ \/_____/ ______ ______ ______ ______ __ __ /\ == \ /\ __ \ /\ == \ /\__ _\ /\ \_\ \ \ \ _-/ \ \ __ \ \ \ __< \/_/\ \/ \ \____ \ \ \_\ \ \_\ \_\ \ \_\ \_\ \ \_\ \/\_____\ \/_/ \/_/\/_/ \/_/ /_/ \/_/ \/_____/ */ // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/access/IAccessControlEnumerable.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/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/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/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/access/AccessControlEnumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } } // 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/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/ClampedRandomizer.sol pragma solidity ^0.8.7; contract ClampedRandomizer { uint256 private _scopeIndex = 0; //Clamping cache for random TokenID generation in the anti-sniping algo uint256 private immutable _scopeCap; //Size of initial randomized number pool & max generated value (zero indexed) mapping(uint256 => uint256) _swappedIDs; //TokenID cache for random TokenID generation in the anti-sniping algo constructor(uint256 scopeCap) { _scopeCap = scopeCap; } function _genClampedNonce() internal virtual returns (uint256) { uint256 scope = _scopeCap - _scopeIndex; uint256 swap; uint256 result; uint256 i = randomNumber() % scope; //Setup the value to swap in for the selected number if (_swappedIDs[scope - 1] == 0) { swap = scope - 1; } else { swap = _swappedIDs[scope - 1]; } //Select a random number, swap it out with an unselected one then shorten the selection range by 1 if (_swappedIDs[i] == 0) { result = i; _swappedIDs[i] = swap; } else { result = _swappedIDs[i]; _swappedIDs[i] = swap; } _scopeIndex++; return result; } function randomNumber() internal view returns (uint256) { return uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp))); } } pragma solidity ^0.8.0; contract FantomBlocParty is AccessControlEnumerable, ERC721Enumerable, ClampedRandomizer { using Counters for Counters.Counter; using Strings for uint; Counters.Counter public tokenIdTracker; uint256 public _maxSupply; uint256 public _price; string private _baseExtension; string private _normalURI; bool public _openMint = false; constructor ( uint256 max_supply, uint256 price, string memory name, string memory symbol, string memory normalURI, string memory baseExtension ) ERC721 (name, symbol) ClampedRandomizer(max_supply) { _maxSupply = max_supply; _price = price; _normalURI = normalURI; _baseExtension = baseExtension; _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); } modifier onlyAdmin() { require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "Caller is not admin"); _; } function setBaseURI(string memory normalURI) private onlyAdmin { _normalURI = normalURI; } function setBaseExtension(string memory baseExtension) external onlyAdmin { _baseExtension = baseExtension; } function setPublicPrice(uint price) external onlyAdmin { _price = price; } function setMaxSupply(uint256 max_supply) external onlyAdmin { _maxSupply = max_supply; } function mintSwitch() external onlyAdmin { _openMint = !_openMint; } function publicMint(uint _mintAmount) public payable { require(_openMint == true, "Minting is currently not open"); uint256 supply = totalSupply(); require(supply + _mintAmount <= _maxSupply, "max NFT limit exceeded"); require(msg.value == _price * _mintAmount, "Amount sent is incorrect"); for (uint i = 0; i < _mintAmount; i++) { internalMint(msg.sender); } } function adminMint(uint _mintAmount) public onlyAdmin { uint256 supply = totalSupply(); require(supply + _mintAmount <= _maxSupply, "max NFT limit exceeded"); for (uint i = 0; i < _mintAmount; i++) { internalMint(msg.sender); } } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string storage normalURI = _normalURI; return normalURI; } function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function internalMint(address to) internal returns (uint) { uint tokenId = _genClampedNonce(); _safeMint(to, tokenId); return tokenId; } function internalMintToken(address to,uint256 tokenId) internal returns (uint) { _safeMint(to, tokenId); return tokenId; } function safeMint(address to) public onlyAdmin { internalMint(to); } function safeMintToken(address to,uint256 tokenId) public onlyAdmin { internalMintToken(to,tokenId); } function _beforeTokenTransfer(address from, address to, uint tokenId) internal virtual override(ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function withdrawProceeds(address payable to) external onlyAdmin { uint balance = address(this).balance; to.transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"max_supply","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"normalURI","type":"string"},{"internalType":"string","name":"baseExtension","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_openMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintSwitch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeMintToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max_supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIdTracker","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdrawProceeds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526000600c556000601360006101000a81548160ff0219169083151502179055503480156200003157600080fd5b50604051620052b6380380620052b68339818101604052810190620000579190620004d3565b8584848160029080519060200190620000729291906200038e565b5080600390805190602001906200008b9291906200038e565b50505080608081815250505085600f81905550846010819055508160129080519060200190620000bd9291906200038e565b508060119080519060200190620000d69291906200038e565b50620000ec6000801b33620000f860201b60201c565b50505050505062000793565b6200010a82826200010e60201b60201c565b5050565b6200012582826200015660201b6200176b1760201c565b6200015181600160008581526020019081526020016000206200024760201b6200184b1790919060201c565b505050565b6200016882826200027f60201b60201c565b6200024357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001e8620002e960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000277836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620002f160201b60201c565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b60006200030583836200036b60201b60201c565b6200036057826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000365565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b8280546200039c906200068a565b90600052602060002090601f016020900481019282620003c057600085556200040c565b82601f10620003db57805160ff19168380011785556200040c565b828001600101855582156200040c579182015b828111156200040b578251825591602001919060010190620003ee565b5b5090506200041b91906200041f565b5090565b5b808211156200043a57600081600090555060010162000420565b5090565b6000620004556200044f8462000614565b620005eb565b90508281526020810184848401111562000474576200047362000759565b5b6200048184828562000654565b509392505050565b600082601f830112620004a157620004a062000754565b5b8151620004b38482602086016200043e565b91505092915050565b600081519050620004cd8162000779565b92915050565b60008060008060008060c08789031215620004f357620004f262000763565b5b60006200050389828a01620004bc565b96505060206200051689828a01620004bc565b955050604087015167ffffffffffffffff8111156200053a57620005396200075e565b5b6200054889828a0162000489565b945050606087015167ffffffffffffffff8111156200056c576200056b6200075e565b5b6200057a89828a0162000489565b935050608087015167ffffffffffffffff8111156200059e576200059d6200075e565b5b620005ac89828a0162000489565b92505060a087015167ffffffffffffffff811115620005d057620005cf6200075e565b5b620005de89828a0162000489565b9150509295509295509295565b6000620005f76200060a565b9050620006058282620006c0565b919050565b6000604051905090565b600067ffffffffffffffff82111562000632576200063162000725565b5b6200063d8262000768565b9050602081019050919050565b6000819050919050565b60005b838110156200067457808201518184015260208101905062000657565b8381111562000684576000848401525b50505050565b60006002820490506001821680620006a357607f821691505b60208210811415620006ba57620006b9620006f6565b5b50919050565b620006cb8262000768565b810181811067ffffffffffffffff82111715620006ed57620006ec62000725565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000784816200064a565b81146200079057600080fd5b50565b608051614b07620007af600039600061217f0152614b076000f3fe60806040526004361061021a5760003560e01c8063585beb9011610123578063a22cb465116100ab578063ca15c8731161006f578063ca15c8731461080a578063d547741f14610847578063da3ef23f14610870578063e985e9c514610899578063eacb912d146108d65761021a565b8063a22cb46514610729578063b88d4fde14610752578063c1f261231461077b578063c6275255146107a4578063c87b56dd146107cd5761021a565b806370a08231116100f257806370a082311461061c5780639010d07c1461065957806391d148541461069657806395d89b41146106d3578063a217fddf146106fe5761021a565b8063585beb901461056257806362810c811461058d5780636352211e146105b65780636f8b44b0146105f35761021a565b8063248a9ca3116101a657806336568abe1161017557806336568abe1461048157806340d097c3146104aa57806342842e0e146104d35780634389de9a146104fc5780634f6ccce7146105255761021a565b8063248a9ca3146103c25780632db11544146103ff5780632f2ff15d1461041b5780632f745c59146104445761021a565b8063095ea7b3116101ed578063095ea7b3146102ef57806318160ddd1461031857806322f4596f14610343578063235b6ea11461036e57806323b872dd146103995761021a565b806301ffc9a71461021f57806302bf3d561461025c57806306fdde0314610287578063081812fc146102b2575b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061367d565b6108ed565b6040516102539190613c58565b60405180910390f35b34801561026857600080fd5b506102716108ff565b60405161027e9190613f70565b60405180910390f35b34801561029357600080fd5b5061029c61090b565b6040516102a99190613c8e565b60405180910390f35b3480156102be57600080fd5b506102d960048036038101906102d49190613720565b61099d565b6040516102e69190613bf1565b60405180910390f35b3480156102fb57600080fd5b5061031660048036038101906103119190613590565b610a22565b005b34801561032457600080fd5b5061032d610b3a565b60405161033a9190613f70565b60405180910390f35b34801561034f57600080fd5b50610358610b47565b6040516103659190613f70565b60405180910390f35b34801561037a57600080fd5b50610383610b4d565b6040516103909190613f70565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb919061347a565b610b53565b005b3480156103ce57600080fd5b506103e960048036038101906103e491906135d0565b610bb3565b6040516103f69190613c73565b60405180910390f35b61041960048036038101906104149190613720565b610bd2565b005b34801561042757600080fd5b50610442600480360381019061043d91906135fd565b610d00565b005b34801561045057600080fd5b5061046b60048036038101906104669190613590565b610d21565b6040516104789190613f70565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a391906135fd565b610dc6565b005b3480156104b657600080fd5b506104d160048036038101906104cc91906133e0565b610e49565b005b3480156104df57600080fd5b506104fa60048036038101906104f5919061347a565b610ea2565b005b34801561050857600080fd5b50610523600480360381019061051e9190613590565b610ec2565b005b34801561053157600080fd5b5061054c60048036038101906105479190613720565b610f1d565b6040516105599190613f70565b60405180910390f35b34801561056e57600080fd5b50610577610f8e565b6040516105849190613c58565b60405180910390f35b34801561059957600080fd5b506105b460048036038101906105af919061340d565b610fa1565b005b3480156105c257600080fd5b506105dd60048036038101906105d89190613720565b61103d565b6040516105ea9190613bf1565b60405180910390f35b3480156105ff57600080fd5b5061061a60048036038101906106159190613720565b6110ef565b005b34801561062857600080fd5b50610643600480360381019061063e91906133e0565b611145565b6040516106509190613f70565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b919061363d565b6111fd565b60405161068d9190613bf1565b60405180910390f35b3480156106a257600080fd5b506106bd60048036038101906106b891906135fd565b61122c565b6040516106ca9190613c58565b60405180910390f35b3480156106df57600080fd5b506106e8611296565b6040516106f59190613c8e565b60405180910390f35b34801561070a57600080fd5b50610713611328565b6040516107209190613c73565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190613550565b61132f565b005b34801561075e57600080fd5b50610779600480360381019061077491906134cd565b611345565b005b34801561078757600080fd5b506107a2600480360381019061079d9190613720565b6113a7565b005b3480156107b057600080fd5b506107cb60048036038101906107c69190613720565b61147c565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613720565b6114d2565b6040516108019190613c8e565b60405180910390f35b34801561081657600080fd5b50610831600480360381019061082c91906135d0565b6115b4565b60405161083e9190613f70565b60405180910390f35b34801561085357600080fd5b5061086e600480360381019061086991906135fd565b6115d8565b005b34801561087c57600080fd5b50610897600480360381019061089291906136d7565b6115f9565b005b3480156108a557600080fd5b506108c060048036038101906108bb919061343a565b61165f565b6040516108cd9190613c58565b60405180910390f35b3480156108e257600080fd5b506108eb6116f3565b005b60006108f88261187b565b9050919050565b600e8060000154905081565b60606002805461091a90614235565b80601f016020809104026020016040519081016040528092919081815260200182805461094690614235565b80156109935780601f1061096857610100808354040283529160200191610993565b820191906000526020600020905b81548152906001019060200180831161097657829003601f168201915b5050505050905090565b60006109a8826118f5565b6109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de90613e70565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a2d8261103d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9590613ed0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610abd611961565b73ffffffffffffffffffffffffffffffffffffffff161480610aec5750610aeb81610ae6611961565b61165f565b5b610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290613dd0565b60405180910390fd5b610b358383611969565b505050565b6000600a80549050905090565b600f5481565b60105481565b610b64610b5e611961565b82611a22565b610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90613f10565b60405180910390fd5b610bae838383611b00565b505050565b6000806000838152602001908152602001600020600101549050919050565b60011515601360009054906101000a900460ff16151514610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90613cd0565b60405180910390fd5b6000610c32610b3a565b9050600f548282610c439190614055565b1115610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b90613e30565b60405180910390fd5b81601054610c9291906140ab565b3414610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90613eb0565b60405180910390fd5b60005b82811015610cfb57610ce733611d67565b508080610cf390614298565b915050610cd6565b505050565b610d0982610bb3565b610d1281611d87565b610d1c8383611d9b565b505050565b6000610d2c83611145565b8210610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6490613cf0565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610dce611961565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3290613f50565b60405180910390fd5b610e458282611dcf565b5050565b610e566000801b3361122c565b610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c90613ef0565b60405180910390fd5b610e9e81611d67565b5050565b610ebd83838360405180602001604052806000815250611345565b505050565b610ecf6000801b3361122c565b610f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0590613ef0565b60405180910390fd5b610f188282611e03565b505050565b6000610f27610b3a565b8210610f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5f90613f30565b60405180910390fd5b600a8281548110610f7c57610f7b6143d8565b5b90600052602060002001549050919050565b601360009054906101000a900460ff1681565b610fae6000801b3361122c565b610fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe490613ef0565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611038573d6000803e3d6000fd5b505050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90613e10565b60405180910390fd5b80915050919050565b6110fc6000801b3361122c565b61113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113290613ef0565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90613df0565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006112248260016000868152602001908152602001600020611e1890919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600380546112a590614235565b80601f01602080910402602001604051908101604052809291908181526020018280546112d190614235565b801561131e5780601f106112f35761010080835404028352916020019161131e565b820191906000526020600020905b81548152906001019060200180831161130157829003601f168201915b5050505050905090565b6000801b81565b61134161133a611961565b8383611e32565b5050565b611356611350611961565b83611a22565b611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90613f10565b60405180910390fd5b6113a184848484611f9f565b50505050565b6113b46000801b3361122c565b6113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea90613ef0565b60405180910390fd5b60006113fd610b3a565b9050600f54828261140e9190614055565b111561144f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144690613e30565b60405180910390fd5b60005b828110156114775761146333611d67565b50808061146f90614298565b915050611452565b505050565b6114896000801b3361122c565b6114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf90613ef0565b60405180910390fd5b8060108190555050565b60606114dd826118f5565b61151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390613e90565b60405180910390fd5b60006012905080805461152e90614235565b80601f016020809104026020016040519081016040528092919081815260200182805461155a90614235565b80156115a75780601f1061157c576101008083540402835291602001916115a7565b820191906000526020600020905b81548152906001019060200180831161158a57829003601f168201915b5050505050915050919050565b60006115d160016000848152602001908152602001600020611ffb565b9050919050565b6115e182610bb3565b6115ea81611d87565b6115f48383611dcf565b505050565b6116066000801b3361122c565b611645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163c90613ef0565b60405180910390fd5b806011908051906020019061165b9291906131ca565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117006000801b3361122c565b61173f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173690613ef0565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b611775828261122c565b61184757600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117ec611961565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611873836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612010565b905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118ee57506118ed82612080565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119dc8361103d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a2d826118f5565b611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390613db0565b60405180910390fd5b6000611a778361103d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ab95750611ab8818561165f565b5b80611af757508373ffffffffffffffffffffffffffffffffffffffff16611adf8461099d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b208261103d565b73ffffffffffffffffffffffffffffffffffffffff1614611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d90613d30565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd90613d70565b60405180910390fd5b611bf1838383612162565b611bfc600082611969565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c4c9190614105565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca39190614055565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d62838383612172565b505050565b600080611d72612177565b9050611d7e83826122b0565b80915050919050565b611d9881611d93611961565b6122ce565b50565b611da5828261176b565b611dca816001600085815260200190815260200160002061184b90919063ffffffff16565b505050565b611dd9828261236b565b611dfe816001600085815260200190815260200160002061244c90919063ffffffff16565b505050565b6000611e0f83836122b0565b81905092915050565b6000611e27836000018361247c565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9890613d90565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f929190613c58565b60405180910390a3505050565b611faa848484611b00565b611fb6848484846124a7565b611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec90613d10565b60405180910390fd5b50505050565b60006120098260000161263e565b9050919050565b600061201c838361264f565b61207557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061207a565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061214b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061215b575061215a82612672565b5b9050919050565b61216d8383836126ec565b505050565b505050565b600080600c547f00000000000000000000000000000000000000000000000000000000000000006121a89190614105565b90506000806000836121b8612800565b6121c291906142eb565b90506000600d60006001876121d79190614105565b8152602001908152602001600020541415612200576001846121f99190614105565b9250612223565b600d60006001866122119190614105565b81526020019081526020016000205492505b6000600d600083815260200190815260200160002054141561225f5780915082600d60008381526020019081526020016000208190555061228e565b600d600082815260200190815260200160002054915082600d6000838152602001908152602001600020819055505b600c60008154809291906122a190614298565b91905055508194505050505090565b6122ca828260405180602001604052806000815250612833565b5050565b6122d8828261122c565b612367576122fd8173ffffffffffffffffffffffffffffffffffffffff16601461288e565b61230b8360001c602061288e565b60405160200161231c929190613b8b565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235e9190613c8e565b60405180910390fd5b5050565b612375828261122c565b1561244857600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506123ed611961565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612474836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612aca565b905092915050565b6000826000018281548110612494576124936143d8565b5b9060005260206000200154905092915050565b60006124c88473ffffffffffffffffffffffffffffffffffffffff16612bde565b15612631578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124f1611961565b8786866040518563ffffffff1660e01b81526004016125139493929190613c0c565b602060405180830381600087803b15801561252d57600080fd5b505af192505050801561255e57506040513d601f19601f8201168201806040525081019061255b91906136aa565b60015b6125e1573d806000811461258e576040519150601f19603f3d011682016040523d82523d6000602084013e612593565b606091505b506000815114156125d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d090613d10565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612636565b600190505b949350505050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126e557506126e482612c01565b5b9050919050565b6126f7838383612c7b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561273a5761273581612c80565b612779565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612778576127778382612cc9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127bc576127b781612e36565b6127fb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146127fa576127f98282612f07565b5b5b505050565b60004442604051602001612815929190613bc5565b6040516020818303038152906040528051906020012060001c905090565b61283d8383612f86565b61284a60008484846124a7565b612889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288090613d10565b60405180910390fd5b505050565b6060600060028360026128a191906140ab565b6128ab9190614055565b67ffffffffffffffff8111156128c4576128c3614407565b5b6040519080825280601f01601f1916602001820160405280156128f65781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061292e5761292d6143d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612992576129916143d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026129d291906140ab565b6129dc9190614055565b90505b6001811115612a7c577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612a1e57612a1d6143d8565b5b1a60f81b828281518110612a3557612a346143d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612a759061420b565b90506129df565b5060008414612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790613cb0565b60405180910390fd5b8091505092915050565b60008083600101600084815260200190815260200160002054905060008114612bd2576000600182612afc9190614105565b9050600060018660000180549050612b149190614105565b9050818114612b83576000866000018281548110612b3557612b346143d8565b5b9060005260206000200154905080876000018481548110612b5957612b586143d8565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612b9757612b966143a9565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612bd8565b60009150505b92915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c745750612c7382613160565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612cd684611145565b612ce09190614105565b9050600060096000848152602001908152602001600020549050818114612dc5576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612e4a9190614105565b90506000600b60008481526020019081526020016000205490506000600a8381548110612e7a57612e796143d8565b5b9060005260206000200154905080600a8381548110612e9c57612e9b6143d8565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612eeb57612eea6143a9565b5b6001900381819060005260206000200160009055905550505050565b6000612f1283611145565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fed90613e50565b60405180910390fd5b612fff816118f5565b1561303f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303690613d50565b60405180910390fd5b61304b60008383612162565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461309b9190614055565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461315c60008383612172565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546131d690614235565b90600052602060002090601f0160209004810192826131f8576000855561323f565b82601f1061321157805160ff191683800117855561323f565b8280016001018555821561323f579182015b8281111561323e578251825591602001919060010190613223565b5b50905061324c9190613250565b5090565b5b80821115613269576000816000905550600101613251565b5090565b600061328061327b84613fb0565b613f8b565b90508281526020810184848401111561329c5761329b61443b565b5b6132a78482856141c9565b509392505050565b60006132c26132bd84613fe1565b613f8b565b9050828152602081018484840111156132de576132dd61443b565b5b6132e98482856141c9565b509392505050565b60008135905061330081614a47565b92915050565b60008135905061331581614a5e565b92915050565b60008135905061332a81614a75565b92915050565b60008135905061333f81614a8c565b92915050565b60008135905061335481614aa3565b92915050565b60008151905061336981614aa3565b92915050565b600082601f83011261338457613383614436565b5b813561339484826020860161326d565b91505092915050565b600082601f8301126133b2576133b1614436565b5b81356133c28482602086016132af565b91505092915050565b6000813590506133da81614aba565b92915050565b6000602082840312156133f6576133f5614445565b5b6000613404848285016132f1565b91505092915050565b60006020828403121561342357613422614445565b5b600061343184828501613306565b91505092915050565b6000806040838503121561345157613450614445565b5b600061345f858286016132f1565b9250506020613470858286016132f1565b9150509250929050565b60008060006060848603121561349357613492614445565b5b60006134a1868287016132f1565b93505060206134b2868287016132f1565b92505060406134c3868287016133cb565b9150509250925092565b600080600080608085870312156134e7576134e6614445565b5b60006134f5878288016132f1565b9450506020613506878288016132f1565b9350506040613517878288016133cb565b925050606085013567ffffffffffffffff81111561353857613537614440565b5b6135448782880161336f565b91505092959194509250565b6000806040838503121561356757613566614445565b5b6000613575858286016132f1565b92505060206135868582860161331b565b9150509250929050565b600080604083850312156135a7576135a6614445565b5b60006135b5858286016132f1565b92505060206135c6858286016133cb565b9150509250929050565b6000602082840312156135e6576135e5614445565b5b60006135f484828501613330565b91505092915050565b6000806040838503121561361457613613614445565b5b600061362285828601613330565b9250506020613633858286016132f1565b9150509250929050565b6000806040838503121561365457613653614445565b5b600061366285828601613330565b9250506020613673858286016133cb565b9150509250929050565b60006020828403121561369357613692614445565b5b60006136a184828501613345565b91505092915050565b6000602082840312156136c0576136bf614445565b5b60006136ce8482850161335a565b91505092915050565b6000602082840312156136ed576136ec614445565b5b600082013567ffffffffffffffff81111561370b5761370a614440565b5b6137178482850161339d565b91505092915050565b60006020828403121561373657613735614445565b5b6000613744848285016133cb565b91505092915050565b61375681614139565b82525050565b6137658161415d565b82525050565b61377481614169565b82525050565b600061378582614012565b61378f8185614028565b935061379f8185602086016141d8565b6137a88161444a565b840191505092915050565b60006137be8261401d565b6137c88185614039565b93506137d88185602086016141d8565b6137e18161444a565b840191505092915050565b60006137f78261401d565b613801818561404a565b93506138118185602086016141d8565b80840191505092915050565b600061382a602083614039565b91506138358261445b565b602082019050919050565b600061384d601d83614039565b915061385882614484565b602082019050919050565b6000613870602b83614039565b915061387b826144ad565b604082019050919050565b6000613893603283614039565b915061389e826144fc565b604082019050919050565b60006138b6602583614039565b91506138c18261454b565b604082019050919050565b60006138d9601c83614039565b91506138e48261459a565b602082019050919050565b60006138fc602483614039565b9150613907826145c3565b604082019050919050565b600061391f601983614039565b915061392a82614612565b602082019050919050565b6000613942602c83614039565b915061394d8261463b565b604082019050919050565b6000613965603883614039565b91506139708261468a565b604082019050919050565b6000613988602a83614039565b9150613993826146d9565b604082019050919050565b60006139ab602983614039565b91506139b682614728565b604082019050919050565b60006139ce601683614039565b91506139d982614777565b602082019050919050565b60006139f1602083614039565b91506139fc826147a0565b602082019050919050565b6000613a14602c83614039565b9150613a1f826147c9565b604082019050919050565b6000613a37602f83614039565b9150613a4282614818565b604082019050919050565b6000613a5a601883614039565b9150613a6582614867565b602082019050919050565b6000613a7d602183614039565b9150613a8882614890565b604082019050919050565b6000613aa0601383614039565b9150613aab826148df565b602082019050919050565b6000613ac3603183614039565b9150613ace82614908565b604082019050919050565b6000613ae6602c83614039565b9150613af182614957565b604082019050919050565b6000613b0960178361404a565b9150613b14826149a6565b601782019050919050565b6000613b2c60118361404a565b9150613b37826149cf565b601182019050919050565b6000613b4f602f83614039565b9150613b5a826149f8565b604082019050919050565b613b6e816141bf565b82525050565b613b85613b80826141bf565b6142e1565b82525050565b6000613b9682613afc565b9150613ba282856137ec565b9150613bad82613b1f565b9150613bb982846137ec565b91508190509392505050565b6000613bd18285613b74565b602082019150613be18284613b74565b6020820191508190509392505050565b6000602082019050613c06600083018461374d565b92915050565b6000608082019050613c21600083018761374d565b613c2e602083018661374d565b613c3b6040830185613b65565b8181036060830152613c4d818461377a565b905095945050505050565b6000602082019050613c6d600083018461375c565b92915050565b6000602082019050613c88600083018461376b565b92915050565b60006020820190508181036000830152613ca881846137b3565b905092915050565b60006020820190508181036000830152613cc98161381d565b9050919050565b60006020820190508181036000830152613ce981613840565b9050919050565b60006020820190508181036000830152613d0981613863565b9050919050565b60006020820190508181036000830152613d2981613886565b9050919050565b60006020820190508181036000830152613d49816138a9565b9050919050565b60006020820190508181036000830152613d69816138cc565b9050919050565b60006020820190508181036000830152613d89816138ef565b9050919050565b60006020820190508181036000830152613da981613912565b9050919050565b60006020820190508181036000830152613dc981613935565b9050919050565b60006020820190508181036000830152613de981613958565b9050919050565b60006020820190508181036000830152613e098161397b565b9050919050565b60006020820190508181036000830152613e298161399e565b9050919050565b60006020820190508181036000830152613e49816139c1565b9050919050565b60006020820190508181036000830152613e69816139e4565b9050919050565b60006020820190508181036000830152613e8981613a07565b9050919050565b60006020820190508181036000830152613ea981613a2a565b9050919050565b60006020820190508181036000830152613ec981613a4d565b9050919050565b60006020820190508181036000830152613ee981613a70565b9050919050565b60006020820190508181036000830152613f0981613a93565b9050919050565b60006020820190508181036000830152613f2981613ab6565b9050919050565b60006020820190508181036000830152613f4981613ad9565b9050919050565b60006020820190508181036000830152613f6981613b42565b9050919050565b6000602082019050613f856000830184613b65565b92915050565b6000613f95613fa6565b9050613fa18282614267565b919050565b6000604051905090565b600067ffffffffffffffff821115613fcb57613fca614407565b5b613fd48261444a565b9050602081019050919050565b600067ffffffffffffffff821115613ffc57613ffb614407565b5b6140058261444a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614060826141bf565b915061406b836141bf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140a05761409f61431c565b5b828201905092915050565b60006140b6826141bf565b91506140c1836141bf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140fa576140f961431c565b5b828202905092915050565b6000614110826141bf565b915061411b836141bf565b92508282101561412e5761412d61431c565b5b828203905092915050565b60006141448261419f565b9050919050565b60006141568261419f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141f65780820151818401526020810190506141db565b83811115614205576000848401525b50505050565b6000614216826141bf565b9150600082141561422a5761422961431c565b5b600182039050919050565b6000600282049050600182168061424d57607f821691505b602082108114156142615761426061437a565b5b50919050565b6142708261444a565b810181811067ffffffffffffffff8211171561428f5761428e614407565b5b80604052505050565b60006142a3826141bf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142d6576142d561431c565b5b600182019050919050565b6000819050919050565b60006142f6826141bf565b9150614301836141bf565b9250826143115761431061434b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4d696e74696e672069732063757272656e746c79206e6f74206f70656e000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f416d6f756e742073656e7420697320696e636f72726563740000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f742061646d696e00000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614a5081614139565b8114614a5b57600080fd5b50565b614a678161414b565b8114614a7257600080fd5b50565b614a7e8161415d565b8114614a8957600080fd5b50565b614a9581614169565b8114614aa057600080fd5b50565b614aac81614173565b8114614ab757600080fd5b50565b614ac3816141bf565b8114614ace57600080fd5b5056fea264697066735822122051399a6316de2d7da205dabab02239eab5ca5e3939d28b63fcb51e971fb28e5664736f6c634300080700330000000000000000000000000000000000000000000000000000000000001388000000000000000000000000000000000000000000000001158e460913d0000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000c46544d424c4f435041525459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034642500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f66746d646561642e6d7970696e6174612e636c6f75642f697066732f516d55425864727737664766444434314433626a545077694b53653631634650347552336b724554613470656843000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061021a5760003560e01c8063585beb9011610123578063a22cb465116100ab578063ca15c8731161006f578063ca15c8731461080a578063d547741f14610847578063da3ef23f14610870578063e985e9c514610899578063eacb912d146108d65761021a565b8063a22cb46514610729578063b88d4fde14610752578063c1f261231461077b578063c6275255146107a4578063c87b56dd146107cd5761021a565b806370a08231116100f257806370a082311461061c5780639010d07c1461065957806391d148541461069657806395d89b41146106d3578063a217fddf146106fe5761021a565b8063585beb901461056257806362810c811461058d5780636352211e146105b65780636f8b44b0146105f35761021a565b8063248a9ca3116101a657806336568abe1161017557806336568abe1461048157806340d097c3146104aa57806342842e0e146104d35780634389de9a146104fc5780634f6ccce7146105255761021a565b8063248a9ca3146103c25780632db11544146103ff5780632f2ff15d1461041b5780632f745c59146104445761021a565b8063095ea7b3116101ed578063095ea7b3146102ef57806318160ddd1461031857806322f4596f14610343578063235b6ea11461036e57806323b872dd146103995761021a565b806301ffc9a71461021f57806302bf3d561461025c57806306fdde0314610287578063081812fc146102b2575b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061367d565b6108ed565b6040516102539190613c58565b60405180910390f35b34801561026857600080fd5b506102716108ff565b60405161027e9190613f70565b60405180910390f35b34801561029357600080fd5b5061029c61090b565b6040516102a99190613c8e565b60405180910390f35b3480156102be57600080fd5b506102d960048036038101906102d49190613720565b61099d565b6040516102e69190613bf1565b60405180910390f35b3480156102fb57600080fd5b5061031660048036038101906103119190613590565b610a22565b005b34801561032457600080fd5b5061032d610b3a565b60405161033a9190613f70565b60405180910390f35b34801561034f57600080fd5b50610358610b47565b6040516103659190613f70565b60405180910390f35b34801561037a57600080fd5b50610383610b4d565b6040516103909190613f70565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb919061347a565b610b53565b005b3480156103ce57600080fd5b506103e960048036038101906103e491906135d0565b610bb3565b6040516103f69190613c73565b60405180910390f35b61041960048036038101906104149190613720565b610bd2565b005b34801561042757600080fd5b50610442600480360381019061043d91906135fd565b610d00565b005b34801561045057600080fd5b5061046b60048036038101906104669190613590565b610d21565b6040516104789190613f70565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a391906135fd565b610dc6565b005b3480156104b657600080fd5b506104d160048036038101906104cc91906133e0565b610e49565b005b3480156104df57600080fd5b506104fa60048036038101906104f5919061347a565b610ea2565b005b34801561050857600080fd5b50610523600480360381019061051e9190613590565b610ec2565b005b34801561053157600080fd5b5061054c60048036038101906105479190613720565b610f1d565b6040516105599190613f70565b60405180910390f35b34801561056e57600080fd5b50610577610f8e565b6040516105849190613c58565b60405180910390f35b34801561059957600080fd5b506105b460048036038101906105af919061340d565b610fa1565b005b3480156105c257600080fd5b506105dd60048036038101906105d89190613720565b61103d565b6040516105ea9190613bf1565b60405180910390f35b3480156105ff57600080fd5b5061061a60048036038101906106159190613720565b6110ef565b005b34801561062857600080fd5b50610643600480360381019061063e91906133e0565b611145565b6040516106509190613f70565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b919061363d565b6111fd565b60405161068d9190613bf1565b60405180910390f35b3480156106a257600080fd5b506106bd60048036038101906106b891906135fd565b61122c565b6040516106ca9190613c58565b60405180910390f35b3480156106df57600080fd5b506106e8611296565b6040516106f59190613c8e565b60405180910390f35b34801561070a57600080fd5b50610713611328565b6040516107209190613c73565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190613550565b61132f565b005b34801561075e57600080fd5b50610779600480360381019061077491906134cd565b611345565b005b34801561078757600080fd5b506107a2600480360381019061079d9190613720565b6113a7565b005b3480156107b057600080fd5b506107cb60048036038101906107c69190613720565b61147c565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613720565b6114d2565b6040516108019190613c8e565b60405180910390f35b34801561081657600080fd5b50610831600480360381019061082c91906135d0565b6115b4565b60405161083e9190613f70565b60405180910390f35b34801561085357600080fd5b5061086e600480360381019061086991906135fd565b6115d8565b005b34801561087c57600080fd5b50610897600480360381019061089291906136d7565b6115f9565b005b3480156108a557600080fd5b506108c060048036038101906108bb919061343a565b61165f565b6040516108cd9190613c58565b60405180910390f35b3480156108e257600080fd5b506108eb6116f3565b005b60006108f88261187b565b9050919050565b600e8060000154905081565b60606002805461091a90614235565b80601f016020809104026020016040519081016040528092919081815260200182805461094690614235565b80156109935780601f1061096857610100808354040283529160200191610993565b820191906000526020600020905b81548152906001019060200180831161097657829003601f168201915b5050505050905090565b60006109a8826118f5565b6109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de90613e70565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a2d8261103d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9590613ed0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610abd611961565b73ffffffffffffffffffffffffffffffffffffffff161480610aec5750610aeb81610ae6611961565b61165f565b5b610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290613dd0565b60405180910390fd5b610b358383611969565b505050565b6000600a80549050905090565b600f5481565b60105481565b610b64610b5e611961565b82611a22565b610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90613f10565b60405180910390fd5b610bae838383611b00565b505050565b6000806000838152602001908152602001600020600101549050919050565b60011515601360009054906101000a900460ff16151514610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90613cd0565b60405180910390fd5b6000610c32610b3a565b9050600f548282610c439190614055565b1115610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b90613e30565b60405180910390fd5b81601054610c9291906140ab565b3414610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90613eb0565b60405180910390fd5b60005b82811015610cfb57610ce733611d67565b508080610cf390614298565b915050610cd6565b505050565b610d0982610bb3565b610d1281611d87565b610d1c8383611d9b565b505050565b6000610d2c83611145565b8210610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6490613cf0565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610dce611961565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3290613f50565b60405180910390fd5b610e458282611dcf565b5050565b610e566000801b3361122c565b610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c90613ef0565b60405180910390fd5b610e9e81611d67565b5050565b610ebd83838360405180602001604052806000815250611345565b505050565b610ecf6000801b3361122c565b610f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0590613ef0565b60405180910390fd5b610f188282611e03565b505050565b6000610f27610b3a565b8210610f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5f90613f30565b60405180910390fd5b600a8281548110610f7c57610f7b6143d8565b5b90600052602060002001549050919050565b601360009054906101000a900460ff1681565b610fae6000801b3361122c565b610fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe490613ef0565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611038573d6000803e3d6000fd5b505050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90613e10565b60405180910390fd5b80915050919050565b6110fc6000801b3361122c565b61113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113290613ef0565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90613df0565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006112248260016000868152602001908152602001600020611e1890919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600380546112a590614235565b80601f01602080910402602001604051908101604052809291908181526020018280546112d190614235565b801561131e5780601f106112f35761010080835404028352916020019161131e565b820191906000526020600020905b81548152906001019060200180831161130157829003601f168201915b5050505050905090565b6000801b81565b61134161133a611961565b8383611e32565b5050565b611356611350611961565b83611a22565b611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90613f10565b60405180910390fd5b6113a184848484611f9f565b50505050565b6113b46000801b3361122c565b6113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea90613ef0565b60405180910390fd5b60006113fd610b3a565b9050600f54828261140e9190614055565b111561144f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144690613e30565b60405180910390fd5b60005b828110156114775761146333611d67565b50808061146f90614298565b915050611452565b505050565b6114896000801b3361122c565b6114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf90613ef0565b60405180910390fd5b8060108190555050565b60606114dd826118f5565b61151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390613e90565b60405180910390fd5b60006012905080805461152e90614235565b80601f016020809104026020016040519081016040528092919081815260200182805461155a90614235565b80156115a75780601f1061157c576101008083540402835291602001916115a7565b820191906000526020600020905b81548152906001019060200180831161158a57829003601f168201915b5050505050915050919050565b60006115d160016000848152602001908152602001600020611ffb565b9050919050565b6115e182610bb3565b6115ea81611d87565b6115f48383611dcf565b505050565b6116066000801b3361122c565b611645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163c90613ef0565b60405180910390fd5b806011908051906020019061165b9291906131ca565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117006000801b3361122c565b61173f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173690613ef0565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b611775828261122c565b61184757600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117ec611961565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611873836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612010565b905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118ee57506118ed82612080565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119dc8361103d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a2d826118f5565b611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390613db0565b60405180910390fd5b6000611a778361103d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ab95750611ab8818561165f565b5b80611af757508373ffffffffffffffffffffffffffffffffffffffff16611adf8461099d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b208261103d565b73ffffffffffffffffffffffffffffffffffffffff1614611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d90613d30565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd90613d70565b60405180910390fd5b611bf1838383612162565b611bfc600082611969565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c4c9190614105565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca39190614055565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d62838383612172565b505050565b600080611d72612177565b9050611d7e83826122b0565b80915050919050565b611d9881611d93611961565b6122ce565b50565b611da5828261176b565b611dca816001600085815260200190815260200160002061184b90919063ffffffff16565b505050565b611dd9828261236b565b611dfe816001600085815260200190815260200160002061244c90919063ffffffff16565b505050565b6000611e0f83836122b0565b81905092915050565b6000611e27836000018361247c565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9890613d90565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f929190613c58565b60405180910390a3505050565b611faa848484611b00565b611fb6848484846124a7565b611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec90613d10565b60405180910390fd5b50505050565b60006120098260000161263e565b9050919050565b600061201c838361264f565b61207557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061207a565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061214b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061215b575061215a82612672565b5b9050919050565b61216d8383836126ec565b505050565b505050565b600080600c547f00000000000000000000000000000000000000000000000000000000000013886121a89190614105565b90506000806000836121b8612800565b6121c291906142eb565b90506000600d60006001876121d79190614105565b8152602001908152602001600020541415612200576001846121f99190614105565b9250612223565b600d60006001866122119190614105565b81526020019081526020016000205492505b6000600d600083815260200190815260200160002054141561225f5780915082600d60008381526020019081526020016000208190555061228e565b600d600082815260200190815260200160002054915082600d6000838152602001908152602001600020819055505b600c60008154809291906122a190614298565b91905055508194505050505090565b6122ca828260405180602001604052806000815250612833565b5050565b6122d8828261122c565b612367576122fd8173ffffffffffffffffffffffffffffffffffffffff16601461288e565b61230b8360001c602061288e565b60405160200161231c929190613b8b565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235e9190613c8e565b60405180910390fd5b5050565b612375828261122c565b1561244857600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506123ed611961565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612474836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612aca565b905092915050565b6000826000018281548110612494576124936143d8565b5b9060005260206000200154905092915050565b60006124c88473ffffffffffffffffffffffffffffffffffffffff16612bde565b15612631578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124f1611961565b8786866040518563ffffffff1660e01b81526004016125139493929190613c0c565b602060405180830381600087803b15801561252d57600080fd5b505af192505050801561255e57506040513d601f19601f8201168201806040525081019061255b91906136aa565b60015b6125e1573d806000811461258e576040519150601f19603f3d011682016040523d82523d6000602084013e612593565b606091505b506000815114156125d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d090613d10565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612636565b600190505b949350505050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126e557506126e482612c01565b5b9050919050565b6126f7838383612c7b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561273a5761273581612c80565b612779565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612778576127778382612cc9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127bc576127b781612e36565b6127fb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146127fa576127f98282612f07565b5b5b505050565b60004442604051602001612815929190613bc5565b6040516020818303038152906040528051906020012060001c905090565b61283d8383612f86565b61284a60008484846124a7565b612889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288090613d10565b60405180910390fd5b505050565b6060600060028360026128a191906140ab565b6128ab9190614055565b67ffffffffffffffff8111156128c4576128c3614407565b5b6040519080825280601f01601f1916602001820160405280156128f65781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061292e5761292d6143d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612992576129916143d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026129d291906140ab565b6129dc9190614055565b90505b6001811115612a7c577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612a1e57612a1d6143d8565b5b1a60f81b828281518110612a3557612a346143d8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612a759061420b565b90506129df565b5060008414612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790613cb0565b60405180910390fd5b8091505092915050565b60008083600101600084815260200190815260200160002054905060008114612bd2576000600182612afc9190614105565b9050600060018660000180549050612b149190614105565b9050818114612b83576000866000018281548110612b3557612b346143d8565b5b9060005260206000200154905080876000018481548110612b5957612b586143d8565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612b9757612b966143a9565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612bd8565b60009150505b92915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c745750612c7382613160565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612cd684611145565b612ce09190614105565b9050600060096000848152602001908152602001600020549050818114612dc5576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612e4a9190614105565b90506000600b60008481526020019081526020016000205490506000600a8381548110612e7a57612e796143d8565b5b9060005260206000200154905080600a8381548110612e9c57612e9b6143d8565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612eeb57612eea6143a9565b5b6001900381819060005260206000200160009055905550505050565b6000612f1283611145565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fed90613e50565b60405180910390fd5b612fff816118f5565b1561303f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303690613d50565b60405180910390fd5b61304b60008383612162565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461309b9190614055565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461315c60008383612172565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546131d690614235565b90600052602060002090601f0160209004810192826131f8576000855561323f565b82601f1061321157805160ff191683800117855561323f565b8280016001018555821561323f579182015b8281111561323e578251825591602001919060010190613223565b5b50905061324c9190613250565b5090565b5b80821115613269576000816000905550600101613251565b5090565b600061328061327b84613fb0565b613f8b565b90508281526020810184848401111561329c5761329b61443b565b5b6132a78482856141c9565b509392505050565b60006132c26132bd84613fe1565b613f8b565b9050828152602081018484840111156132de576132dd61443b565b5b6132e98482856141c9565b509392505050565b60008135905061330081614a47565b92915050565b60008135905061331581614a5e565b92915050565b60008135905061332a81614a75565b92915050565b60008135905061333f81614a8c565b92915050565b60008135905061335481614aa3565b92915050565b60008151905061336981614aa3565b92915050565b600082601f83011261338457613383614436565b5b813561339484826020860161326d565b91505092915050565b600082601f8301126133b2576133b1614436565b5b81356133c28482602086016132af565b91505092915050565b6000813590506133da81614aba565b92915050565b6000602082840312156133f6576133f5614445565b5b6000613404848285016132f1565b91505092915050565b60006020828403121561342357613422614445565b5b600061343184828501613306565b91505092915050565b6000806040838503121561345157613450614445565b5b600061345f858286016132f1565b9250506020613470858286016132f1565b9150509250929050565b60008060006060848603121561349357613492614445565b5b60006134a1868287016132f1565b93505060206134b2868287016132f1565b92505060406134c3868287016133cb565b9150509250925092565b600080600080608085870312156134e7576134e6614445565b5b60006134f5878288016132f1565b9450506020613506878288016132f1565b9350506040613517878288016133cb565b925050606085013567ffffffffffffffff81111561353857613537614440565b5b6135448782880161336f565b91505092959194509250565b6000806040838503121561356757613566614445565b5b6000613575858286016132f1565b92505060206135868582860161331b565b9150509250929050565b600080604083850312156135a7576135a6614445565b5b60006135b5858286016132f1565b92505060206135c6858286016133cb565b9150509250929050565b6000602082840312156135e6576135e5614445565b5b60006135f484828501613330565b91505092915050565b6000806040838503121561361457613613614445565b5b600061362285828601613330565b9250506020613633858286016132f1565b9150509250929050565b6000806040838503121561365457613653614445565b5b600061366285828601613330565b9250506020613673858286016133cb565b9150509250929050565b60006020828403121561369357613692614445565b5b60006136a184828501613345565b91505092915050565b6000602082840312156136c0576136bf614445565b5b60006136ce8482850161335a565b91505092915050565b6000602082840312156136ed576136ec614445565b5b600082013567ffffffffffffffff81111561370b5761370a614440565b5b6137178482850161339d565b91505092915050565b60006020828403121561373657613735614445565b5b6000613744848285016133cb565b91505092915050565b61375681614139565b82525050565b6137658161415d565b82525050565b61377481614169565b82525050565b600061378582614012565b61378f8185614028565b935061379f8185602086016141d8565b6137a88161444a565b840191505092915050565b60006137be8261401d565b6137c88185614039565b93506137d88185602086016141d8565b6137e18161444a565b840191505092915050565b60006137f78261401d565b613801818561404a565b93506138118185602086016141d8565b80840191505092915050565b600061382a602083614039565b91506138358261445b565b602082019050919050565b600061384d601d83614039565b915061385882614484565b602082019050919050565b6000613870602b83614039565b915061387b826144ad565b604082019050919050565b6000613893603283614039565b915061389e826144fc565b604082019050919050565b60006138b6602583614039565b91506138c18261454b565b604082019050919050565b60006138d9601c83614039565b91506138e48261459a565b602082019050919050565b60006138fc602483614039565b9150613907826145c3565b604082019050919050565b600061391f601983614039565b915061392a82614612565b602082019050919050565b6000613942602c83614039565b915061394d8261463b565b604082019050919050565b6000613965603883614039565b91506139708261468a565b604082019050919050565b6000613988602a83614039565b9150613993826146d9565b604082019050919050565b60006139ab602983614039565b91506139b682614728565b604082019050919050565b60006139ce601683614039565b91506139d982614777565b602082019050919050565b60006139f1602083614039565b91506139fc826147a0565b602082019050919050565b6000613a14602c83614039565b9150613a1f826147c9565b604082019050919050565b6000613a37602f83614039565b9150613a4282614818565b604082019050919050565b6000613a5a601883614039565b9150613a6582614867565b602082019050919050565b6000613a7d602183614039565b9150613a8882614890565b604082019050919050565b6000613aa0601383614039565b9150613aab826148df565b602082019050919050565b6000613ac3603183614039565b9150613ace82614908565b604082019050919050565b6000613ae6602c83614039565b9150613af182614957565b604082019050919050565b6000613b0960178361404a565b9150613b14826149a6565b601782019050919050565b6000613b2c60118361404a565b9150613b37826149cf565b601182019050919050565b6000613b4f602f83614039565b9150613b5a826149f8565b604082019050919050565b613b6e816141bf565b82525050565b613b85613b80826141bf565b6142e1565b82525050565b6000613b9682613afc565b9150613ba282856137ec565b9150613bad82613b1f565b9150613bb982846137ec565b91508190509392505050565b6000613bd18285613b74565b602082019150613be18284613b74565b6020820191508190509392505050565b6000602082019050613c06600083018461374d565b92915050565b6000608082019050613c21600083018761374d565b613c2e602083018661374d565b613c3b6040830185613b65565b8181036060830152613c4d818461377a565b905095945050505050565b6000602082019050613c6d600083018461375c565b92915050565b6000602082019050613c88600083018461376b565b92915050565b60006020820190508181036000830152613ca881846137b3565b905092915050565b60006020820190508181036000830152613cc98161381d565b9050919050565b60006020820190508181036000830152613ce981613840565b9050919050565b60006020820190508181036000830152613d0981613863565b9050919050565b60006020820190508181036000830152613d2981613886565b9050919050565b60006020820190508181036000830152613d49816138a9565b9050919050565b60006020820190508181036000830152613d69816138cc565b9050919050565b60006020820190508181036000830152613d89816138ef565b9050919050565b60006020820190508181036000830152613da981613912565b9050919050565b60006020820190508181036000830152613dc981613935565b9050919050565b60006020820190508181036000830152613de981613958565b9050919050565b60006020820190508181036000830152613e098161397b565b9050919050565b60006020820190508181036000830152613e298161399e565b9050919050565b60006020820190508181036000830152613e49816139c1565b9050919050565b60006020820190508181036000830152613e69816139e4565b9050919050565b60006020820190508181036000830152613e8981613a07565b9050919050565b60006020820190508181036000830152613ea981613a2a565b9050919050565b60006020820190508181036000830152613ec981613a4d565b9050919050565b60006020820190508181036000830152613ee981613a70565b9050919050565b60006020820190508181036000830152613f0981613a93565b9050919050565b60006020820190508181036000830152613f2981613ab6565b9050919050565b60006020820190508181036000830152613f4981613ad9565b9050919050565b60006020820190508181036000830152613f6981613b42565b9050919050565b6000602082019050613f856000830184613b65565b92915050565b6000613f95613fa6565b9050613fa18282614267565b919050565b6000604051905090565b600067ffffffffffffffff821115613fcb57613fca614407565b5b613fd48261444a565b9050602081019050919050565b600067ffffffffffffffff821115613ffc57613ffb614407565b5b6140058261444a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614060826141bf565b915061406b836141bf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140a05761409f61431c565b5b828201905092915050565b60006140b6826141bf565b91506140c1836141bf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140fa576140f961431c565b5b828202905092915050565b6000614110826141bf565b915061411b836141bf565b92508282101561412e5761412d61431c565b5b828203905092915050565b60006141448261419f565b9050919050565b60006141568261419f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141f65780820151818401526020810190506141db565b83811115614205576000848401525b50505050565b6000614216826141bf565b9150600082141561422a5761422961431c565b5b600182039050919050565b6000600282049050600182168061424d57607f821691505b602082108114156142615761426061437a565b5b50919050565b6142708261444a565b810181811067ffffffffffffffff8211171561428f5761428e614407565b5b80604052505050565b60006142a3826141bf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142d6576142d561431c565b5b600182019050919050565b6000819050919050565b60006142f6826141bf565b9150614301836141bf565b9250826143115761431061434b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4d696e74696e672069732063757272656e746c79206e6f74206f70656e000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f416d6f756e742073656e7420697320696e636f72726563740000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f742061646d696e00000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614a5081614139565b8114614a5b57600080fd5b50565b614a678161414b565b8114614a7257600080fd5b50565b614a7e8161415d565b8114614a8957600080fd5b50565b614a9581614169565b8114614aa057600080fd5b50565b614aac81614173565b8114614ab757600080fd5b50565b614ac3816141bf565b8114614ace57600080fd5b5056fea264697066735822122051399a6316de2d7da205dabab02239eab5ca5e3939d28b63fcb51e971fb28e5664736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000001388000000000000000000000000000000000000000000000001158e460913d0000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000c46544d424c4f435041525459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034642500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f66746d646561642e6d7970696e6174612e636c6f75642f697066732f516d55425864727737664766444434314433626a545077694b53653631634650347552336b724554613470656843000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : max_supply (uint256): 5000
Arg [1] : price (uint256): 20000000000000000000
Arg [2] : name (string): FTMBLOCPARTY
Arg [3] : symbol (string): FBP
Arg [4] : normalURI (string): https://ftmdead.mypinata.cloud/ipfs/QmUBXdrw7fGfDD41D3bjTPwiKSe61cFP4uR3krETa4pehC
Arg [5] : baseExtension (string): .json
-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [1] : 000000000000000000000000000000000000000000000001158e460913d00000
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [7] : 46544d424c4f4350415254590000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 4642500000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000052
Arg [11] : 68747470733a2f2f66746d646561642e6d7970696e6174612e636c6f75642f69
Arg [12] : 7066732f516d55425864727737664766444434314433626a545077694b536536
Arg [13] : 31634650347552336b7245546134706568430000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [15] : 2e6a736f6e000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
74514:3672:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77033:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74683:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53675:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55235:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54758:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67494:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74728:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74760:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55985:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38611:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76039:435;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39004:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67162:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40052:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77608:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56395:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77698:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67684:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74856:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78032:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53369:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75838:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53099:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43561:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37071:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53844:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36176:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55528:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56651:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76482:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75742:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76775:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43888:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39396:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75611:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55754:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75949:82;;;;;;;;;;;;;:::i;:::-;;77033:237;77197:4;77226:36;77250:11;77226:23;:36::i;:::-;77219:43;;77033:237;;;:::o;74683:38::-;;;;;;;;;:::o;53675:100::-;53729:13;53762:5;53755:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53675:100;:::o;55235:221::-;55311:7;55339:16;55347:7;55339;:16::i;:::-;55331:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55424:15;:24;55440:7;55424:24;;;;;;;;;;;;;;;;;;;;;55417:31;;55235:221;;;:::o;54758:411::-;54839:13;54855:23;54870:7;54855:14;:23::i;:::-;54839:39;;54903:5;54897:11;;:2;:11;;;;54889:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54997:5;54981:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;55006:37;55023:5;55030:12;:10;:12::i;:::-;55006:16;:37::i;:::-;54981:62;54959:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;55140:21;55149:2;55153:7;55140:8;:21::i;:::-;54828:341;54758:411;;:::o;67494:113::-;67555:7;67582:10;:17;;;;67575:24;;67494:113;:::o;74728:25::-;;;;:::o;74760:21::-;;;;:::o;55985:339::-;56180:41;56199:12;:10;:12::i;:::-;56213:7;56180:18;:41::i;:::-;56172:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56288:28;56298:4;56304:2;56308:7;56288:9;:28::i;:::-;55985:339;;;:::o;38611:131::-;38685:7;38712:6;:12;38719:4;38712:12;;;;;;;;;;;:22;;;38705:29;;38611:131;;;:::o;76039:435::-;76124:4;76111:17;;:9;;;;;;;;;;;:17;;;76103:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;76173:14;76190:13;:11;:13::i;:::-;76173:30;;76246:10;;76231:11;76222:6;:20;;;;:::i;:::-;:34;;76214:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;76324:11;76315:6;;:20;;;;:::i;:::-;76302:9;:33;76294:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;76382:6;76377:90;76398:11;76394:1;:15;76377:90;;;76431:24;76444:10;76431:12;:24::i;:::-;;76411:3;;;;;:::i;:::-;;;;76377:90;;;;76092:382;76039:435;:::o;39004:147::-;39087:18;39100:4;39087:12;:18::i;:::-;36667:16;36678:4;36667:10;:16::i;:::-;39118:25:::1;39129:4;39135:7;39118:10;:25::i;:::-;39004:147:::0;;;:::o;67162:256::-;67259:7;67295:23;67312:5;67295:16;:23::i;:::-;67287:5;:31;67279:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;67384:12;:19;67397:5;67384:19;;;;;;;;;;;;;;;:26;67404:5;67384:26;;;;;;;;;;;;67377:33;;67162:256;;;;:::o;40052:218::-;40159:12;:10;:12::i;:::-;40148:23;;:7;:23;;;40140:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;40236:26;40248:4;40254:7;40236:11;:26::i;:::-;40052:218;;:::o;77608:82::-;75408:39;36221:4;75416:18;;75436:10;75408:7;:39::i;:::-;75400:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;77666:16:::1;77679:2;77666:12;:16::i;:::-;;77608:82:::0;:::o;56395:185::-;56533:39;56550:4;56556:2;56560:7;56533:39;;;;;;;;;;;;:16;:39::i;:::-;56395:185;;;:::o;77698:116::-;75408:39;36221:4;75416:18;;75436:10;75408:7;:39::i;:::-;75400:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;77777:29:::1;77795:2;77798:7;77777:17;:29::i;:::-;;77698:116:::0;;:::o;67684:233::-;67759:7;67795:30;:28;:30::i;:::-;67787:5;:38;67779:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;67892:10;67903:5;67892:17;;;;;;;;:::i;:::-;;;;;;;;;;67885:24;;67684:233;;;:::o;74856:29::-;;;;;;;;;;;;;:::o;78032:151::-;75408:39;36221:4;75416:18;;75436:10;75408:7;:39::i;:::-;75400:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;78108:12:::1;78123:21;78108:36;;78155:2;:11;;:20;78167:7;78155:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;78097:86;78032:151:::0;:::o;53369:239::-;53441:7;53461:13;53477:7;:16;53485:7;53477:16;;;;;;;;;;;;;;;;;;;;;53461:32;;53529:1;53512:19;;:5;:19;;;;53504:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53595:5;53588:12;;;53369:239;;;:::o;75838:103::-;75408:39;36221:4;75416:18;;75436:10;75408:7;:39::i;:::-;75400:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;75923:10:::1;75910;:23;;;;75838:103:::0;:::o;53099:208::-;53171:7;53216:1;53199:19;;:5;:19;;;;53191:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;53283:9;:16;53293:5;53283:16;;;;;;;;;;;;;;;;53276:23;;53099:208;;;:::o;43561:153::-;43651:7;43678:28;43700:5;43678:12;:18;43691:4;43678:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;43671:35;;43561:153;;;;:::o;37071:147::-;37157:4;37181:6;:12;37188:4;37181:12;;;;;;;;;;;:20;;:29;37202:7;37181:29;;;;;;;;;;;;;;;;;;;;;;;;;37174:36;;37071:147;;;;:::o;53844:104::-;53900:13;53933:7;53926:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53844:104;:::o;36176:49::-;36221:4;36176:49;;;:::o;55528:155::-;55623:52;55642:12;:10;:12::i;:::-;55656:8;55666;55623:18;:52::i;:::-;55528:155;;:::o;56651:328::-;56826:41;56845:12;:10;:12::i;:::-;56859:7;56826:18;:41::i;:::-;56818:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56932:39;56946:4;56952:2;56956:7;56965:5;56932:13;:39::i;:::-;56651:328;;;;:::o;76482:285::-;75408:39;36221:4;75416:18;;75436:10;75408:7;:39::i;:::-;75400:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;76547:14:::1;76564:13;:11;:13::i;:::-;76547:30;;76620:10;;76605:11;76596:6;:20;;;;:::i;:::-;:34;;76588:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;76675:6;76670:90;76691:11;76687:1;:15;76670:90;;;76724:24;76737:10;76724:12;:24::i;:::-;;76704:3;;;;;:::i;:::-;;;;76670:90;;;;76536:231;76482:285:::0;:::o;75742:88::-;75408:39;36221:4;75416:18;;75436:10;75408:7;:39::i;:::-;75400:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;75817:5:::1;75808:6;:14;;;;75742:88:::0;:::o;76775:250::-;76840:13;76874:16;76882:7;76874;:16::i;:::-;76866:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;76953:24;76980:10;76953:37;;77008:9;77001:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76775:250;;;:::o;43888:142::-;43968:7;43995:27;:12;:18;44008:4;43995:18;;;;;;;;;;;:25;:27::i;:::-;43988:34;;43888:142;;;:::o;39396:149::-;39480:18;39493:4;39480:12;:18::i;:::-;36667:16;36678:4;36667:10;:16::i;:::-;39511:26:::1;39523:4;39529:7;39511:11;:26::i;:::-;39396:149:::0;;;:::o;75611:123::-;75408:39;36221:4;75416:18;;75436:10;75408:7;:39::i;:::-;75400:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;75713:13:::1;75696:14;:30;;;;;;;;;;;;:::i;:::-;;75611:123:::0;:::o;55754:164::-;55851:4;55875:18;:25;55894:5;55875:25;;;;;;;;;;;;;;;:35;55901:8;55875:35;;;;;;;;;;;;;;;;;;;;;;;;;55868:42;;55754:164;;;;:::o;75949:82::-;75408:39;36221:4;75416:18;;75436:10;75408:7;:39::i;:::-;75400:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;76014:9:::1;;;;;;;;;;;76013:10;76001:9;;:22;;;;;;;;;;;;;;;;;;75949:82::o:0;41553:238::-;41637:22;41645:4;41651:7;41637;:22::i;:::-;41632:152;;41708:4;41676:6;:12;41683:4;41676:12;;;;;;;;;;;:20;;:29;41697:7;41676:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;41759:12;:10;:12::i;:::-;41732:40;;41750:7;41732:40;;41744:4;41732:40;;;;;;;;;;41632:152;41553:238;;:::o;9197:152::-;9267:4;9291:50;9296:3;:10;;9332:5;9316:23;;9308:32;;9291:4;:50::i;:::-;9284:57;;9197:152;;;;:::o;66854:224::-;66956:4;66995:35;66980:50;;;:11;:50;;;;:90;;;;67034:36;67058:11;67034:23;:36::i;:::-;66980:90;66973:97;;66854:224;;;:::o;58489:127::-;58554:4;58606:1;58578:30;;:7;:16;58586:7;58578:16;;;;;;;;;;;;;;;;;;;;;:30;;;;58571:37;;58489:127;;;:::o;22481:98::-;22534:7;22561:10;22554:17;;22481:98;:::o;62635:174::-;62737:2;62710:15;:24;62726:7;62710:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;62793:7;62789:2;62755:46;;62764:23;62779:7;62764:14;:23::i;:::-;62755:46;;;;;;;;;;;;62635:174;;:::o;58783:348::-;58876:4;58901:16;58909:7;58901;:16::i;:::-;58893:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58977:13;58993:23;59008:7;58993:14;:23::i;:::-;58977:39;;59046:5;59035:16;;:7;:16;;;:52;;;;59055:32;59072:5;59079:7;59055:16;:32::i;:::-;59035:52;:87;;;;59115:7;59091:31;;:20;59103:7;59091:11;:20::i;:::-;:31;;;59035:87;59027:96;;;58783:348;;;;:::o;61892:625::-;62051:4;62024:31;;:23;62039:7;62024:14;:23::i;:::-;:31;;;62016:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;62130:1;62116:16;;:2;:16;;;;62108:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;62186:39;62207:4;62213:2;62217:7;62186:20;:39::i;:::-;62290:29;62307:1;62311:7;62290:8;:29::i;:::-;62351:1;62332:9;:15;62342:4;62332:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;62380:1;62363:9;:13;62373:2;62363:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;62411:2;62392:7;:16;62400:7;62392:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;62450:7;62446:2;62431:27;;62440:4;62431:27;;;;;;;;;;;;62471:38;62491:4;62497:2;62501:7;62471:19;:38::i;:::-;61892:625;;;:::o;77278:169::-;77330:4;77347:12;77362:18;:16;:18::i;:::-;77347:33;;77391:22;77401:2;77405:7;77391:9;:22::i;:::-;77431:7;77424:14;;;77278:169;;;:::o;37522:105::-;37589:30;37600:4;37606:12;:10;:12::i;:::-;37589:10;:30::i;:::-;37522:105;:::o;44123:169::-;44211:31;44228:4;44234:7;44211:16;:31::i;:::-;44253;44276:7;44253:12;:18;44266:4;44253:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;44123:169;;:::o;44386:174::-;44475:32;44493:4;44499:7;44475:17;:32::i;:::-;44518:34;44544:7;44518:12;:18;44531:4;44518:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;44386:174;;:::o;77455:145::-;77528:4;77545:22;77555:2;77559:7;77545:9;:22::i;:::-;77585:7;77578:14;;77455:145;;;;:::o;10493:158::-;10567:7;10618:22;10622:3;:10;;10634:5;10618:3;:22::i;:::-;10610:31;;10587:56;;10493:158;;;;:::o;62951:315::-;63106:8;63097:17;;:5;:17;;;;63089:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;63193:8;63155:18;:25;63174:5;63155:25;;;;;;;;;;;;;;;:35;63181:8;63155:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;63239:8;63217:41;;63232:5;63217:41;;;63249:8;63217:41;;;;;;:::i;:::-;;;;;;;;62951:315;;;:::o;57861:::-;58018:28;58028:4;58034:2;58038:7;58018:9;:28::i;:::-;58065:48;58088:4;58094:2;58098:7;58107:5;58065:22;:48::i;:::-;58057:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;57861:315;;;;:::o;10022:117::-;10085:7;10112:19;10120:3;:10;;10112:7;:19::i;:::-;10105:26;;10022:117;;;:::o;3112:414::-;3175:4;3197:21;3207:3;3212:5;3197:9;:21::i;:::-;3192:327;;3235:3;:11;;3252:5;3235:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3418:3;:11;;:18;;;;3396:3;:12;;:19;3409:5;3396:19;;;;;;;;;;;:40;;;;3458:4;3451:11;;;;3192:327;3502:5;3495:12;;3112:414;;;;;:::o;52730:305::-;52832:4;52884:25;52869:40;;;:11;:40;;;;:105;;;;52941:33;52926:48;;;:11;:48;;;;52869:105;:158;;;;52991:36;53015:11;52991:23;:36::i;:::-;52869:158;52849:178;;52730:305;;;:::o;77823:201::-;77971:45;77998:4;78004:2;78008:7;77971:26;:45::i;:::-;77823:201;;;:::o;65713:125::-;;;;:::o;73533:786::-;73587:7;73607:13;73635:11;;73623:9;:23;;;;:::i;:::-;73607:39;;73657:12;73680:14;73707:9;73736:5;73719:14;:12;:14::i;:::-;:22;;;;:::i;:::-;73707:34;;73846:1;73820:11;:22;73840:1;73832:5;:9;;;;:::i;:::-;73820:22;;;;;;;;;;;;:27;73816:138;;;73879:1;73871:5;:9;;;;:::i;:::-;73864:16;;73816:138;;;73920:11;:22;73940:1;73932:5;:9;;;;:::i;:::-;73920:22;;;;;;;;;;;;73913:29;;73816:138;74096:1;74078:11;:14;74090:1;74078:14;;;;;;;;;;;;:19;74074:190;;;74123:1;74114:10;;74156:4;74139:11;:14;74151:1;74139:14;;;;;;;;;;;:21;;;;74074:190;;;74202:11;:14;74214:1;74202:14;;;;;;;;;;;;74193:23;;74248:4;74231:11;:14;74243:1;74231:14;;;;;;;;;;;:21;;;;74074:190;74274:11;;:13;;;;;;;;;:::i;:::-;;;;;;74305:6;74298:13;;;;;;73533:786;:::o;59473:110::-;59549:26;59559:2;59563:7;59549:26;;;;;;;;;;;;:9;:26::i;:::-;59473:110;;:::o;37917:505::-;38006:22;38014:4;38020:7;38006;:22::i;:::-;38001:414;;38194:41;38222:7;38194:41;;38232:2;38194:19;:41::i;:::-;38308:38;38336:4;38328:13;;38343:2;38308:19;:38::i;:::-;38099:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38045:358;;;;;;;;;;;:::i;:::-;;;;;;;;38001:414;37917:505;;:::o;41923:239::-;42007:22;42015:4;42021:7;42007;:22::i;:::-;42003:152;;;42078:5;42046:6;:12;42053:4;42046:12;;;;;;;;;;;:20;;:29;42067:7;42046:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;42130:12;:10;:12::i;:::-;42103:40;;42121:7;42103:40;;42115:4;42103:40;;;;;;;;;;42003:152;41923:239;;:::o;9525:158::-;9598:4;9622:53;9630:3;:10;;9666:5;9650:23;;9642:32;;9622:7;:53::i;:::-;9615:60;;9525:158;;;;:::o;5886:120::-;5953:7;5980:3;:11;;5992:5;5980:18;;;;;;;;:::i;:::-;;;;;;;;;;5973:25;;5886:120;;;;:::o;63831:799::-;63986:4;64007:15;:2;:13;;;:15::i;:::-;64003:620;;;64059:2;64043:36;;;64080:12;:10;:12::i;:::-;64094:4;64100:7;64109:5;64043:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;64039:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64302:1;64285:6;:13;:18;64281:272;;;64328:60;;;;;;;;;;:::i;:::-;;;;;;;;64281:272;64503:6;64497:13;64488:6;64484:2;64480:15;64473:38;64039:529;64176:41;;;64166:51;;;:6;:51;;;;64159:58;;;;;64003:620;64607:4;64600:11;;63831:799;;;;;;;:::o;5423:109::-;5479:7;5506:3;:11;;:18;;;;5499:25;;5423:109;;;:::o;5208:129::-;5281:4;5328:1;5305:3;:12;;:19;5318:5;5305:19;;;;;;;;;;;;:24;;5298:31;;5208:129;;;;:::o;42748:214::-;42833:4;42872:42;42857:57;;;:11;:57;;;;:97;;;;42918:36;42942:11;42918:23;:36::i;:::-;42857:97;42850:104;;42748:214;;;:::o;68530:589::-;68674:45;68701:4;68707:2;68711:7;68674:26;:45::i;:::-;68752:1;68736:18;;:4;:18;;;68732:187;;;68771:40;68803:7;68771:31;:40::i;:::-;68732:187;;;68841:2;68833:10;;:4;:10;;;68829:90;;68860:47;68893:4;68899:7;68860:32;:47::i;:::-;68829:90;68732:187;68947:1;68933:16;;:2;:16;;;68929:183;;;68966:45;69003:7;68966:36;:45::i;:::-;68929:183;;;69039:4;69033:10;;:2;:10;;;69029:83;;69060:40;69088:2;69092:7;69060:27;:40::i;:::-;69029:83;68929:183;68530:589;;;:::o;74327:153::-;74374:7;74436:16;74454:15;74419:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74409:62;;;;;;74401:71;;74394:78;;74327:153;:::o;59810:321::-;59940:18;59946:2;59950:7;59940:5;:18::i;:::-;59991:54;60022:1;60026:2;60030:7;60039:5;59991:22;:54::i;:::-;59969:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;59810:321;;;:::o;21344:451::-;21419:13;21445:19;21490:1;21481:6;21477:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;21467:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21445:47;;21503:15;:6;21510:1;21503:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;21529;:6;21536:1;21529:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;21560:9;21585:1;21576:6;21572:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;21560:26;;21555:135;21592:1;21588;:5;21555:135;;;21627:12;21648:3;21640:5;:11;21627:25;;;;;;;:::i;:::-;;;;;21615:6;21622:1;21615:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;21677:1;21667:11;;;;;21595:3;;;;:::i;:::-;;;21555:135;;;;21717:1;21708:5;:10;21700:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;21780:6;21766:21;;;21344:451;;;;:::o;3702:1420::-;3768:4;3886:18;3907:3;:12;;:19;3920:5;3907:19;;;;;;;;;;;;3886:40;;3957:1;3943:10;:15;3939:1176;;4318:21;4355:1;4342:10;:14;;;;:::i;:::-;4318:38;;4371:17;4412:1;4391:3;:11;;:18;;;;:22;;;;:::i;:::-;4371:42;;4447:13;4434:9;:26;4430:405;;4481:17;4501:3;:11;;4513:9;4501:22;;;;;;;;:::i;:::-;;;;;;;;;;4481:42;;4655:9;4626:3;:11;;4638:13;4626:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;4766:10;4740:3;:12;;:23;4753:9;4740:23;;;;;;;;;;;:36;;;;4462:373;4430:405;4916:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5011:3;:12;;:19;5024:5;5011:19;;;;;;;;;;;5004:26;;;5054:4;5047:11;;;;;;;3939:1176;5098:5;5091:12;;;3702:1420;;;;;:::o;23928:326::-;23988:4;24245:1;24223:7;:19;;;:23;24216:30;;23928:326;;;:::o;36775:204::-;36860:4;36899:32;36884:47;;;:11;:47;;;;:87;;;;36935:36;36959:11;36935:23;:36::i;:::-;36884:87;36877:94;;36775:204;;;:::o;65202:126::-;;;;:::o;69842:164::-;69946:10;:17;;;;69919:15;:24;69935:7;69919:24;;;;;;;;;;;:44;;;;69974:10;69990:7;69974:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69842:164;:::o;70633:988::-;70899:22;70949:1;70924:22;70941:4;70924:16;:22::i;:::-;:26;;;;:::i;:::-;70899:51;;70961:18;70982:17;:26;71000:7;70982:26;;;;;;;;;;;;70961:47;;71129:14;71115:10;:28;71111:328;;71160:19;71182:12;:18;71195:4;71182:18;;;;;;;;;;;;;;;:34;71201:14;71182:34;;;;;;;;;;;;71160:56;;71266:11;71233:12;:18;71246:4;71233:18;;;;;;;;;;;;;;;:30;71252:10;71233:30;;;;;;;;;;;:44;;;;71383:10;71350:17;:30;71368:11;71350:30;;;;;;;;;;;:43;;;;71145:294;71111:328;71535:17;:26;71553:7;71535:26;;;;;;;;;;;71528:33;;;71579:12;:18;71592:4;71579:18;;;;;;;;;;;;;;;:34;71598:14;71579:34;;;;;;;;;;;71572:41;;;70714:907;;70633:988;;:::o;71916:1079::-;72169:22;72214:1;72194:10;:17;;;;:21;;;;:::i;:::-;72169:46;;72226:18;72247:15;:24;72263:7;72247:24;;;;;;;;;;;;72226:45;;72598:19;72620:10;72631:14;72620:26;;;;;;;;:::i;:::-;;;;;;;;;;72598:48;;72684:11;72659:10;72670;72659:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;72795:10;72764:15;:28;72780:11;72764:28;;;;;;;;;;;:41;;;;72936:15;:24;72952:7;72936:24;;;;;;;;;;;72929:31;;;72971:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;71987:1008;;;71916:1079;:::o;69420:221::-;69505:14;69522:20;69539:2;69522:16;:20::i;:::-;69505:37;;69580:7;69553:12;:16;69566:2;69553:16;;;;;;;;;;;;;;;:24;69570:6;69553:24;;;;;;;;;;;:34;;;;69627:6;69598:17;:26;69616:7;69598:26;;;;;;;;;;;:35;;;;69494:147;69420:221;;:::o;60467:439::-;60561:1;60547:16;;:2;:16;;;;60539:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;60620:16;60628:7;60620;:16::i;:::-;60619:17;60611:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;60682:45;60711:1;60715:2;60719:7;60682:20;:45::i;:::-;60757:1;60740:9;:13;60750:2;60740:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;60788:2;60769:7;:16;60777:7;60769:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;60833:7;60829:2;60808:33;;60825:1;60808:33;;;;;;;;;;;;60854:44;60882:1;60886:2;60890:7;60854:19;:44::i;:::-;60467:439;;:::o;34034:157::-;34119:4;34158:25;34143:40;;;:11;:40;;;;34136:47;;34034:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1147:133::-;1190:5;1228:6;1215:20;1206:29;;1244:30;1268:5;1244:30;:::i;:::-;1147:133;;;;:::o;1286:139::-;1332:5;1370:6;1357:20;1348:29;;1386:33;1413:5;1386:33;:::i;:::-;1286:139;;;;:::o;1431:137::-;1476:5;1514:6;1501:20;1492:29;;1530:32;1556:5;1530:32;:::i;:::-;1431:137;;;;:::o;1574:141::-;1630:5;1661:6;1655:13;1646:22;;1677:32;1703:5;1677:32;:::i;:::-;1574:141;;;;:::o;1734:338::-;1789:5;1838:3;1831:4;1823:6;1819:17;1815:27;1805:122;;1846:79;;:::i;:::-;1805:122;1963:6;1950:20;1988:78;2062:3;2054:6;2047:4;2039:6;2035:17;1988:78;:::i;:::-;1979:87;;1795:277;1734:338;;;;:::o;2092:340::-;2148:5;2197:3;2190:4;2182:6;2178:17;2174:27;2164:122;;2205:79;;:::i;:::-;2164:122;2322:6;2309:20;2347:79;2422:3;2414:6;2407:4;2399:6;2395:17;2347:79;:::i;:::-;2338:88;;2154:278;2092:340;;;;:::o;2438:139::-;2484:5;2522:6;2509:20;2500:29;;2538:33;2565:5;2538:33;:::i;:::-;2438:139;;;;:::o;2583:329::-;2642:6;2691:2;2679:9;2670:7;2666:23;2662:32;2659:119;;;2697:79;;:::i;:::-;2659:119;2817:1;2842:53;2887:7;2878:6;2867:9;2863:22;2842:53;:::i;:::-;2832:63;;2788:117;2583:329;;;;:::o;2918:345::-;2985:6;3034:2;3022:9;3013:7;3009:23;3005:32;3002:119;;;3040:79;;:::i;:::-;3002:119;3160:1;3185:61;3238:7;3229:6;3218:9;3214:22;3185:61;:::i;:::-;3175:71;;3131:125;2918:345;;;;:::o;3269:474::-;3337:6;3345;3394:2;3382:9;3373:7;3369:23;3365:32;3362:119;;;3400:79;;:::i;:::-;3362:119;3520:1;3545:53;3590:7;3581:6;3570:9;3566:22;3545:53;:::i;:::-;3535:63;;3491:117;3647:2;3673:53;3718:7;3709:6;3698:9;3694:22;3673:53;:::i;:::-;3663:63;;3618:118;3269:474;;;;;:::o;3749:619::-;3826:6;3834;3842;3891:2;3879:9;3870:7;3866:23;3862:32;3859:119;;;3897:79;;:::i;:::-;3859:119;4017:1;4042:53;4087:7;4078:6;4067:9;4063:22;4042:53;:::i;:::-;4032:63;;3988:117;4144:2;4170:53;4215:7;4206:6;4195:9;4191:22;4170:53;:::i;:::-;4160:63;;4115:118;4272:2;4298:53;4343:7;4334:6;4323:9;4319:22;4298:53;:::i;:::-;4288:63;;4243:118;3749:619;;;;;:::o;4374:943::-;4469:6;4477;4485;4493;4542:3;4530:9;4521:7;4517:23;4513:33;4510:120;;;4549:79;;:::i;:::-;4510:120;4669:1;4694:53;4739:7;4730:6;4719:9;4715:22;4694:53;:::i;:::-;4684:63;;4640:117;4796:2;4822:53;4867:7;4858:6;4847:9;4843:22;4822:53;:::i;:::-;4812:63;;4767:118;4924:2;4950:53;4995:7;4986:6;4975:9;4971:22;4950:53;:::i;:::-;4940:63;;4895:118;5080:2;5069:9;5065:18;5052:32;5111:18;5103:6;5100:30;5097:117;;;5133:79;;:::i;:::-;5097:117;5238:62;5292:7;5283:6;5272:9;5268:22;5238:62;:::i;:::-;5228:72;;5023:287;4374:943;;;;;;;:::o;5323:468::-;5388:6;5396;5445:2;5433:9;5424:7;5420:23;5416:32;5413:119;;;5451:79;;:::i;:::-;5413:119;5571:1;5596:53;5641:7;5632:6;5621:9;5617:22;5596:53;:::i;:::-;5586:63;;5542:117;5698:2;5724:50;5766:7;5757:6;5746:9;5742:22;5724:50;:::i;:::-;5714:60;;5669:115;5323:468;;;;;:::o;5797:474::-;5865:6;5873;5922:2;5910:9;5901:7;5897:23;5893:32;5890:119;;;5928:79;;:::i;:::-;5890:119;6048:1;6073:53;6118:7;6109:6;6098:9;6094:22;6073:53;:::i;:::-;6063:63;;6019:117;6175:2;6201:53;6246:7;6237:6;6226:9;6222:22;6201:53;:::i;:::-;6191:63;;6146:118;5797:474;;;;;:::o;6277:329::-;6336:6;6385:2;6373:9;6364:7;6360:23;6356:32;6353:119;;;6391:79;;:::i;:::-;6353:119;6511:1;6536:53;6581:7;6572:6;6561:9;6557:22;6536:53;:::i;:::-;6526:63;;6482:117;6277:329;;;;:::o;6612:474::-;6680:6;6688;6737:2;6725:9;6716:7;6712:23;6708:32;6705:119;;;6743:79;;:::i;:::-;6705:119;6863:1;6888:53;6933:7;6924:6;6913:9;6909:22;6888:53;:::i;:::-;6878:63;;6834:117;6990:2;7016:53;7061:7;7052:6;7041:9;7037:22;7016:53;:::i;:::-;7006:63;;6961:118;6612:474;;;;;:::o;7092:::-;7160:6;7168;7217:2;7205:9;7196:7;7192:23;7188:32;7185:119;;;7223:79;;:::i;:::-;7185:119;7343:1;7368:53;7413:7;7404:6;7393:9;7389:22;7368:53;:::i;:::-;7358:63;;7314:117;7470:2;7496:53;7541:7;7532:6;7521:9;7517:22;7496:53;:::i;:::-;7486:63;;7441:118;7092:474;;;;;:::o;7572:327::-;7630:6;7679:2;7667:9;7658:7;7654:23;7650:32;7647:119;;;7685:79;;:::i;:::-;7647:119;7805:1;7830:52;7874:7;7865:6;7854:9;7850:22;7830:52;:::i;:::-;7820:62;;7776:116;7572:327;;;;:::o;7905:349::-;7974:6;8023:2;8011:9;8002:7;7998:23;7994:32;7991:119;;;8029:79;;:::i;:::-;7991:119;8149:1;8174:63;8229:7;8220:6;8209:9;8205:22;8174:63;:::i;:::-;8164:73;;8120:127;7905:349;;;;:::o;8260:509::-;8329:6;8378:2;8366:9;8357:7;8353:23;8349:32;8346:119;;;8384:79;;:::i;:::-;8346:119;8532:1;8521:9;8517:17;8504:31;8562:18;8554:6;8551:30;8548:117;;;8584:79;;:::i;:::-;8548:117;8689:63;8744:7;8735:6;8724:9;8720:22;8689:63;:::i;:::-;8679:73;;8475:287;8260:509;;;;:::o;8775:329::-;8834:6;8883:2;8871:9;8862:7;8858:23;8854:32;8851:119;;;8889:79;;:::i;:::-;8851:119;9009:1;9034:53;9079:7;9070:6;9059:9;9055:22;9034:53;:::i;:::-;9024:63;;8980:117;8775:329;;;;:::o;9110:118::-;9197:24;9215:5;9197:24;:::i;:::-;9192:3;9185:37;9110:118;;:::o;9234:109::-;9315:21;9330:5;9315:21;:::i;:::-;9310:3;9303:34;9234:109;;:::o;9349:118::-;9436:24;9454:5;9436:24;:::i;:::-;9431:3;9424:37;9349:118;;:::o;9473:360::-;9559:3;9587:38;9619:5;9587:38;:::i;:::-;9641:70;9704:6;9699:3;9641:70;:::i;:::-;9634:77;;9720:52;9765:6;9760:3;9753:4;9746:5;9742:16;9720:52;:::i;:::-;9797:29;9819:6;9797:29;:::i;:::-;9792:3;9788:39;9781:46;;9563:270;9473:360;;;;:::o;9839:364::-;9927:3;9955:39;9988:5;9955:39;:::i;:::-;10010:71;10074:6;10069:3;10010:71;:::i;:::-;10003:78;;10090:52;10135:6;10130:3;10123:4;10116:5;10112:16;10090:52;:::i;:::-;10167:29;10189:6;10167:29;:::i;:::-;10162:3;10158:39;10151:46;;9931:272;9839:364;;;;:::o;10209:377::-;10315:3;10343:39;10376:5;10343:39;:::i;:::-;10398:89;10480:6;10475:3;10398:89;:::i;:::-;10391:96;;10496:52;10541:6;10536:3;10529:4;10522:5;10518:16;10496:52;:::i;:::-;10573:6;10568:3;10564:16;10557:23;;10319:267;10209:377;;;;:::o;10592:366::-;10734:3;10755:67;10819:2;10814:3;10755:67;:::i;:::-;10748:74;;10831:93;10920:3;10831:93;:::i;:::-;10949:2;10944:3;10940:12;10933:19;;10592:366;;;:::o;10964:::-;11106:3;11127:67;11191:2;11186:3;11127:67;:::i;:::-;11120:74;;11203:93;11292:3;11203:93;:::i;:::-;11321:2;11316:3;11312:12;11305:19;;10964:366;;;:::o;11336:::-;11478:3;11499:67;11563:2;11558:3;11499:67;:::i;:::-;11492:74;;11575:93;11664:3;11575:93;:::i;:::-;11693:2;11688:3;11684:12;11677:19;;11336:366;;;:::o;11708:::-;11850:3;11871:67;11935:2;11930:3;11871:67;:::i;:::-;11864:74;;11947:93;12036:3;11947:93;:::i;:::-;12065:2;12060:3;12056:12;12049:19;;11708:366;;;:::o;12080:::-;12222:3;12243:67;12307:2;12302:3;12243:67;:::i;:::-;12236:74;;12319:93;12408:3;12319:93;:::i;:::-;12437:2;12432:3;12428:12;12421:19;;12080:366;;;:::o;12452:::-;12594:3;12615:67;12679:2;12674:3;12615:67;:::i;:::-;12608:74;;12691:93;12780:3;12691:93;:::i;:::-;12809:2;12804:3;12800:12;12793:19;;12452:366;;;:::o;12824:::-;12966:3;12987:67;13051:2;13046:3;12987:67;:::i;:::-;12980:74;;13063:93;13152:3;13063:93;:::i;:::-;13181:2;13176:3;13172:12;13165:19;;12824:366;;;:::o;13196:::-;13338:3;13359:67;13423:2;13418:3;13359:67;:::i;:::-;13352:74;;13435:93;13524:3;13435:93;:::i;:::-;13553:2;13548:3;13544:12;13537:19;;13196:366;;;:::o;13568:::-;13710:3;13731:67;13795:2;13790:3;13731:67;:::i;:::-;13724:74;;13807:93;13896:3;13807:93;:::i;:::-;13925:2;13920:3;13916:12;13909:19;;13568:366;;;:::o;13940:::-;14082:3;14103:67;14167:2;14162:3;14103:67;:::i;:::-;14096:74;;14179:93;14268:3;14179:93;:::i;:::-;14297:2;14292:3;14288:12;14281:19;;13940:366;;;:::o;14312:::-;14454:3;14475:67;14539:2;14534:3;14475:67;:::i;:::-;14468:74;;14551:93;14640:3;14551:93;:::i;:::-;14669:2;14664:3;14660:12;14653:19;;14312:366;;;:::o;14684:::-;14826:3;14847:67;14911:2;14906:3;14847:67;:::i;:::-;14840:74;;14923:93;15012:3;14923:93;:::i;:::-;15041:2;15036:3;15032:12;15025:19;;14684:366;;;:::o;15056:::-;15198:3;15219:67;15283:2;15278:3;15219:67;:::i;:::-;15212:74;;15295:93;15384:3;15295:93;:::i;:::-;15413:2;15408:3;15404:12;15397:19;;15056:366;;;:::o;15428:::-;15570:3;15591:67;15655:2;15650:3;15591:67;:::i;:::-;15584:74;;15667:93;15756:3;15667:93;:::i;:::-;15785:2;15780:3;15776:12;15769:19;;15428:366;;;:::o;15800:::-;15942:3;15963:67;16027:2;16022:3;15963:67;:::i;:::-;15956:74;;16039:93;16128:3;16039:93;:::i;:::-;16157:2;16152:3;16148:12;16141:19;;15800:366;;;:::o;16172:::-;16314:3;16335:67;16399:2;16394:3;16335:67;:::i;:::-;16328:74;;16411:93;16500:3;16411:93;:::i;:::-;16529:2;16524:3;16520:12;16513:19;;16172:366;;;:::o;16544:::-;16686:3;16707:67;16771:2;16766:3;16707:67;:::i;:::-;16700:74;;16783:93;16872:3;16783:93;:::i;:::-;16901:2;16896:3;16892:12;16885:19;;16544:366;;;:::o;16916:::-;17058:3;17079:67;17143:2;17138:3;17079:67;:::i;:::-;17072:74;;17155:93;17244:3;17155:93;:::i;:::-;17273:2;17268:3;17264:12;17257:19;;16916:366;;;:::o;17288:::-;17430:3;17451:67;17515:2;17510:3;17451:67;:::i;:::-;17444:74;;17527:93;17616:3;17527:93;:::i;:::-;17645:2;17640:3;17636:12;17629:19;;17288:366;;;:::o;17660:::-;17802:3;17823:67;17887:2;17882:3;17823:67;:::i;:::-;17816:74;;17899:93;17988:3;17899:93;:::i;:::-;18017:2;18012:3;18008:12;18001:19;;17660:366;;;:::o;18032:::-;18174:3;18195:67;18259:2;18254:3;18195:67;:::i;:::-;18188:74;;18271:93;18360:3;18271:93;:::i;:::-;18389:2;18384:3;18380:12;18373:19;;18032:366;;;:::o;18404:402::-;18564:3;18585:85;18667:2;18662:3;18585:85;:::i;:::-;18578:92;;18679:93;18768:3;18679:93;:::i;:::-;18797:2;18792:3;18788:12;18781:19;;18404:402;;;:::o;18812:::-;18972:3;18993:85;19075:2;19070:3;18993:85;:::i;:::-;18986:92;;19087:93;19176:3;19087:93;:::i;:::-;19205:2;19200:3;19196:12;19189:19;;18812:402;;;:::o;19220:366::-;19362:3;19383:67;19447:2;19442:3;19383:67;:::i;:::-;19376:74;;19459:93;19548:3;19459:93;:::i;:::-;19577:2;19572:3;19568:12;19561:19;;19220:366;;;:::o;19592:118::-;19679:24;19697:5;19679:24;:::i;:::-;19674:3;19667:37;19592:118;;:::o;19716:157::-;19821:45;19841:24;19859:5;19841:24;:::i;:::-;19821:45;:::i;:::-;19816:3;19809:58;19716:157;;:::o;19879:967::-;20261:3;20283:148;20427:3;20283:148;:::i;:::-;20276:155;;20448:95;20539:3;20530:6;20448:95;:::i;:::-;20441:102;;20560:148;20704:3;20560:148;:::i;:::-;20553:155;;20725:95;20816:3;20807:6;20725:95;:::i;:::-;20718:102;;20837:3;20830:10;;19879:967;;;;;:::o;20852:397::-;20992:3;21007:75;21078:3;21069:6;21007:75;:::i;:::-;21107:2;21102:3;21098:12;21091:19;;21120:75;21191:3;21182:6;21120:75;:::i;:::-;21220:2;21215:3;21211:12;21204:19;;21240:3;21233:10;;20852:397;;;;;:::o;21255:222::-;21348:4;21386:2;21375:9;21371:18;21363:26;;21399:71;21467:1;21456:9;21452:17;21443:6;21399:71;:::i;:::-;21255:222;;;;:::o;21483:640::-;21678:4;21716:3;21705:9;21701:19;21693:27;;21730:71;21798:1;21787:9;21783:17;21774:6;21730:71;:::i;:::-;21811:72;21879:2;21868:9;21864:18;21855:6;21811:72;:::i;:::-;21893;21961:2;21950:9;21946:18;21937:6;21893:72;:::i;:::-;22012:9;22006:4;22002:20;21997:2;21986:9;21982:18;21975:48;22040:76;22111:4;22102:6;22040:76;:::i;:::-;22032:84;;21483:640;;;;;;;:::o;22129:210::-;22216:4;22254:2;22243:9;22239:18;22231:26;;22267:65;22329:1;22318:9;22314:17;22305:6;22267:65;:::i;:::-;22129:210;;;;:::o;22345:222::-;22438:4;22476:2;22465:9;22461:18;22453:26;;22489:71;22557:1;22546:9;22542:17;22533:6;22489:71;:::i;:::-;22345:222;;;;:::o;22573:313::-;22686:4;22724:2;22713:9;22709:18;22701:26;;22773:9;22767:4;22763:20;22759:1;22748:9;22744:17;22737:47;22801:78;22874:4;22865:6;22801:78;:::i;:::-;22793:86;;22573:313;;;;:::o;22892:419::-;23058:4;23096:2;23085:9;23081:18;23073:26;;23145:9;23139:4;23135:20;23131:1;23120:9;23116:17;23109:47;23173:131;23299:4;23173:131;:::i;:::-;23165:139;;22892:419;;;:::o;23317:::-;23483:4;23521:2;23510:9;23506:18;23498:26;;23570:9;23564:4;23560:20;23556:1;23545:9;23541:17;23534:47;23598:131;23724:4;23598:131;:::i;:::-;23590:139;;23317:419;;;:::o;23742:::-;23908:4;23946:2;23935:9;23931:18;23923:26;;23995:9;23989:4;23985:20;23981:1;23970:9;23966:17;23959:47;24023:131;24149:4;24023:131;:::i;:::-;24015:139;;23742:419;;;:::o;24167:::-;24333:4;24371:2;24360:9;24356:18;24348:26;;24420:9;24414:4;24410:20;24406:1;24395:9;24391:17;24384:47;24448:131;24574:4;24448:131;:::i;:::-;24440:139;;24167:419;;;:::o;24592:::-;24758:4;24796:2;24785:9;24781:18;24773:26;;24845:9;24839:4;24835:20;24831:1;24820:9;24816:17;24809:47;24873:131;24999:4;24873:131;:::i;:::-;24865:139;;24592:419;;;:::o;25017:::-;25183:4;25221:2;25210:9;25206:18;25198:26;;25270:9;25264:4;25260:20;25256:1;25245:9;25241:17;25234:47;25298:131;25424:4;25298:131;:::i;:::-;25290:139;;25017:419;;;:::o;25442:::-;25608:4;25646:2;25635:9;25631:18;25623:26;;25695:9;25689:4;25685:20;25681:1;25670:9;25666:17;25659:47;25723:131;25849:4;25723:131;:::i;:::-;25715:139;;25442:419;;;:::o;25867:::-;26033:4;26071:2;26060:9;26056:18;26048:26;;26120:9;26114:4;26110:20;26106:1;26095:9;26091:17;26084:47;26148:131;26274:4;26148:131;:::i;:::-;26140:139;;25867:419;;;:::o;26292:::-;26458:4;26496:2;26485:9;26481:18;26473:26;;26545:9;26539:4;26535:20;26531:1;26520:9;26516:17;26509:47;26573:131;26699:4;26573:131;:::i;:::-;26565:139;;26292:419;;;:::o;26717:::-;26883:4;26921:2;26910:9;26906:18;26898:26;;26970:9;26964:4;26960:20;26956:1;26945:9;26941:17;26934:47;26998:131;27124:4;26998:131;:::i;:::-;26990:139;;26717:419;;;:::o;27142:::-;27308:4;27346:2;27335:9;27331:18;27323:26;;27395:9;27389:4;27385:20;27381:1;27370:9;27366:17;27359:47;27423:131;27549:4;27423:131;:::i;:::-;27415:139;;27142:419;;;:::o;27567:::-;27733:4;27771:2;27760:9;27756:18;27748:26;;27820:9;27814:4;27810:20;27806:1;27795:9;27791:17;27784:47;27848:131;27974:4;27848:131;:::i;:::-;27840:139;;27567:419;;;:::o;27992:::-;28158:4;28196:2;28185:9;28181:18;28173:26;;28245:9;28239:4;28235:20;28231:1;28220:9;28216:17;28209:47;28273:131;28399:4;28273:131;:::i;:::-;28265:139;;27992:419;;;:::o;28417:::-;28583:4;28621:2;28610:9;28606:18;28598:26;;28670:9;28664:4;28660:20;28656:1;28645:9;28641:17;28634:47;28698:131;28824:4;28698:131;:::i;:::-;28690:139;;28417:419;;;:::o;28842:::-;29008:4;29046:2;29035:9;29031:18;29023:26;;29095:9;29089:4;29085:20;29081:1;29070:9;29066:17;29059:47;29123:131;29249:4;29123:131;:::i;:::-;29115:139;;28842:419;;;:::o;29267:::-;29433:4;29471:2;29460:9;29456:18;29448:26;;29520:9;29514:4;29510:20;29506:1;29495:9;29491:17;29484:47;29548:131;29674:4;29548:131;:::i;:::-;29540:139;;29267:419;;;:::o;29692:::-;29858:4;29896:2;29885:9;29881:18;29873:26;;29945:9;29939:4;29935:20;29931:1;29920:9;29916:17;29909:47;29973:131;30099:4;29973:131;:::i;:::-;29965:139;;29692:419;;;:::o;30117:::-;30283:4;30321:2;30310:9;30306:18;30298:26;;30370:9;30364:4;30360:20;30356:1;30345:9;30341:17;30334:47;30398:131;30524:4;30398:131;:::i;:::-;30390:139;;30117:419;;;:::o;30542:::-;30708:4;30746:2;30735:9;30731:18;30723:26;;30795:9;30789:4;30785:20;30781:1;30770:9;30766:17;30759:47;30823:131;30949:4;30823:131;:::i;:::-;30815:139;;30542:419;;;:::o;30967:::-;31133:4;31171:2;31160:9;31156:18;31148:26;;31220:9;31214:4;31210:20;31206:1;31195:9;31191:17;31184:47;31248:131;31374:4;31248:131;:::i;:::-;31240:139;;30967:419;;;:::o;31392:::-;31558:4;31596:2;31585:9;31581:18;31573:26;;31645:9;31639:4;31635:20;31631:1;31620:9;31616:17;31609:47;31673:131;31799:4;31673:131;:::i;:::-;31665:139;;31392:419;;;:::o;31817:::-;31983:4;32021:2;32010:9;32006:18;31998:26;;32070:9;32064:4;32060:20;32056:1;32045:9;32041:17;32034:47;32098:131;32224:4;32098:131;:::i;:::-;32090:139;;31817:419;;;:::o;32242:222::-;32335:4;32373:2;32362:9;32358:18;32350:26;;32386:71;32454:1;32443:9;32439:17;32430:6;32386:71;:::i;:::-;32242:222;;;;:::o;32470:129::-;32504:6;32531:20;;:::i;:::-;32521:30;;32560:33;32588:4;32580:6;32560:33;:::i;:::-;32470:129;;;:::o;32605:75::-;32638:6;32671:2;32665:9;32655:19;;32605:75;:::o;32686:307::-;32747:4;32837:18;32829:6;32826:30;32823:56;;;32859:18;;:::i;:::-;32823:56;32897:29;32919:6;32897:29;:::i;:::-;32889:37;;32981:4;32975;32971:15;32963:23;;32686:307;;;:::o;32999:308::-;33061:4;33151:18;33143:6;33140:30;33137:56;;;33173:18;;:::i;:::-;33137:56;33211:29;33233:6;33211:29;:::i;:::-;33203:37;;33295:4;33289;33285:15;33277:23;;32999:308;;;:::o;33313:98::-;33364:6;33398:5;33392:12;33382:22;;33313:98;;;:::o;33417:99::-;33469:6;33503:5;33497:12;33487:22;;33417:99;;;:::o;33522:168::-;33605:11;33639:6;33634:3;33627:19;33679:4;33674:3;33670:14;33655:29;;33522:168;;;;:::o;33696:169::-;33780:11;33814:6;33809:3;33802:19;33854:4;33849:3;33845:14;33830:29;;33696:169;;;;:::o;33871:148::-;33973:11;34010:3;33995:18;;33871:148;;;;:::o;34025:305::-;34065:3;34084:20;34102:1;34084:20;:::i;:::-;34079:25;;34118:20;34136:1;34118:20;:::i;:::-;34113:25;;34272:1;34204:66;34200:74;34197:1;34194:81;34191:107;;;34278:18;;:::i;:::-;34191:107;34322:1;34319;34315:9;34308:16;;34025:305;;;;:::o;34336:348::-;34376:7;34399:20;34417:1;34399:20;:::i;:::-;34394:25;;34433:20;34451:1;34433:20;:::i;:::-;34428:25;;34621:1;34553:66;34549:74;34546:1;34543:81;34538:1;34531:9;34524:17;34520:105;34517:131;;;34628:18;;:::i;:::-;34517:131;34676:1;34673;34669:9;34658:20;;34336:348;;;;:::o;34690:191::-;34730:4;34750:20;34768:1;34750:20;:::i;:::-;34745:25;;34784:20;34802:1;34784:20;:::i;:::-;34779:25;;34823:1;34820;34817:8;34814:34;;;34828:18;;:::i;:::-;34814:34;34873:1;34870;34866:9;34858:17;;34690:191;;;;:::o;34887:96::-;34924:7;34953:24;34971:5;34953:24;:::i;:::-;34942:35;;34887:96;;;:::o;34989:104::-;35034:7;35063:24;35081:5;35063:24;:::i;:::-;35052:35;;34989:104;;;:::o;35099:90::-;35133:7;35176:5;35169:13;35162:21;35151:32;;35099:90;;;:::o;35195:77::-;35232:7;35261:5;35250:16;;35195:77;;;:::o;35278:149::-;35314:7;35354:66;35347:5;35343:78;35332:89;;35278:149;;;:::o;35433:126::-;35470:7;35510:42;35503:5;35499:54;35488:65;;35433:126;;;:::o;35565:77::-;35602:7;35631:5;35620:16;;35565:77;;;:::o;35648:154::-;35732:6;35727:3;35722;35709:30;35794:1;35785:6;35780:3;35776:16;35769:27;35648:154;;;:::o;35808:307::-;35876:1;35886:113;35900:6;35897:1;35894:13;35886:113;;;35985:1;35980:3;35976:11;35970:18;35966:1;35961:3;35957:11;35950:39;35922:2;35919:1;35915:10;35910:15;;35886:113;;;36017:6;36014:1;36011:13;36008:101;;;36097:1;36088:6;36083:3;36079:16;36072:27;36008:101;35857:258;35808:307;;;:::o;36121:171::-;36160:3;36183:24;36201:5;36183:24;:::i;:::-;36174:33;;36229:4;36222:5;36219:15;36216:41;;;36237:18;;:::i;:::-;36216:41;36284:1;36277:5;36273:13;36266:20;;36121:171;;;:::o;36298:320::-;36342:6;36379:1;36373:4;36369:12;36359:22;;36426:1;36420:4;36416:12;36447:18;36437:81;;36503:4;36495:6;36491:17;36481:27;;36437:81;36565:2;36557:6;36554:14;36534:18;36531:38;36528:84;;;36584:18;;:::i;:::-;36528:84;36349:269;36298:320;;;:::o;36624:281::-;36707:27;36729:4;36707:27;:::i;:::-;36699:6;36695:40;36837:6;36825:10;36822:22;36801:18;36789:10;36786:34;36783:62;36780:88;;;36848:18;;:::i;:::-;36780:88;36888:10;36884:2;36877:22;36667:238;36624:281;;:::o;36911:233::-;36950:3;36973:24;36991:5;36973:24;:::i;:::-;36964:33;;37019:66;37012:5;37009:77;37006:103;;;37089:18;;:::i;:::-;37006:103;37136:1;37129:5;37125:13;37118:20;;36911:233;;;:::o;37150:79::-;37189:7;37218:5;37207:16;;37150:79;;;:::o;37235:176::-;37267:1;37284:20;37302:1;37284:20;:::i;:::-;37279:25;;37318:20;37336:1;37318:20;:::i;:::-;37313:25;;37357:1;37347:35;;37362:18;;:::i;:::-;37347:35;37403:1;37400;37396:9;37391:14;;37235:176;;;;:::o;37417:180::-;37465:77;37462:1;37455:88;37562:4;37559:1;37552:15;37586:4;37583:1;37576:15;37603:180;37651:77;37648:1;37641:88;37748:4;37745:1;37738:15;37772:4;37769:1;37762:15;37789:180;37837:77;37834:1;37827:88;37934:4;37931:1;37924:15;37958:4;37955:1;37948:15;37975:180;38023:77;38020:1;38013:88;38120:4;38117:1;38110:15;38144:4;38141:1;38134:15;38161:180;38209:77;38206:1;38199:88;38306:4;38303:1;38296:15;38330:4;38327:1;38320:15;38347:180;38395:77;38392:1;38385:88;38492:4;38489:1;38482:15;38516:4;38513:1;38506:15;38533:117;38642:1;38639;38632:12;38656:117;38765:1;38762;38755:12;38779:117;38888:1;38885;38878:12;38902:117;39011:1;39008;39001:12;39025:102;39066:6;39117:2;39113:7;39108:2;39101:5;39097:14;39093:28;39083:38;;39025:102;;;:::o;39133:182::-;39273:34;39269:1;39261:6;39257:14;39250:58;39133:182;:::o;39321:179::-;39461:31;39457:1;39449:6;39445:14;39438:55;39321:179;:::o;39506:230::-;39646:34;39642:1;39634:6;39630:14;39623:58;39715:13;39710:2;39702:6;39698:15;39691:38;39506:230;:::o;39742:237::-;39882:34;39878:1;39870:6;39866:14;39859:58;39951:20;39946:2;39938:6;39934:15;39927:45;39742:237;:::o;39985:224::-;40125:34;40121:1;40113:6;40109:14;40102:58;40194:7;40189:2;40181:6;40177:15;40170:32;39985:224;:::o;40215:178::-;40355:30;40351:1;40343:6;40339:14;40332:54;40215:178;:::o;40399:223::-;40539:34;40535:1;40527:6;40523:14;40516:58;40608:6;40603:2;40595:6;40591:15;40584:31;40399:223;:::o;40628:175::-;40768:27;40764:1;40756:6;40752:14;40745:51;40628:175;:::o;40809:231::-;40949:34;40945:1;40937:6;40933:14;40926:58;41018:14;41013:2;41005:6;41001:15;40994:39;40809:231;:::o;41046:243::-;41186:34;41182:1;41174:6;41170:14;41163:58;41255:26;41250:2;41242:6;41238:15;41231:51;41046:243;:::o;41295:229::-;41435:34;41431:1;41423:6;41419:14;41412:58;41504:12;41499:2;41491:6;41487:15;41480:37;41295:229;:::o;41530:228::-;41670:34;41666:1;41658:6;41654:14;41647:58;41739:11;41734:2;41726:6;41722:15;41715:36;41530:228;:::o;41764:172::-;41904:24;41900:1;41892:6;41888:14;41881:48;41764:172;:::o;41942:182::-;42082:34;42078:1;42070:6;42066:14;42059:58;41942:182;:::o;42130:231::-;42270:34;42266:1;42258:6;42254:14;42247:58;42339:14;42334:2;42326:6;42322:15;42315:39;42130:231;:::o;42367:234::-;42507:34;42503:1;42495:6;42491:14;42484:58;42576:17;42571:2;42563:6;42559:15;42552:42;42367:234;:::o;42607:174::-;42747:26;42743:1;42735:6;42731:14;42724:50;42607:174;:::o;42787:220::-;42927:34;42923:1;42915:6;42911:14;42904:58;42996:3;42991:2;42983:6;42979:15;42972:28;42787:220;:::o;43013:169::-;43153:21;43149:1;43141:6;43137:14;43130:45;43013:169;:::o;43188:236::-;43328:34;43324:1;43316:6;43312:14;43305:58;43397:19;43392:2;43384:6;43380:15;43373:44;43188:236;:::o;43430:231::-;43570:34;43566:1;43558:6;43554:14;43547:58;43639:14;43634:2;43626:6;43622:15;43615:39;43430:231;:::o;43667:173::-;43807:25;43803:1;43795:6;43791:14;43784:49;43667:173;:::o;43846:167::-;43986:19;43982:1;43974:6;43970:14;43963:43;43846:167;:::o;44019:234::-;44159:34;44155:1;44147:6;44143:14;44136:58;44228:17;44223:2;44215:6;44211:15;44204:42;44019:234;:::o;44259:122::-;44332:24;44350:5;44332:24;:::i;:::-;44325:5;44322:35;44312:63;;44371:1;44368;44361:12;44312:63;44259:122;:::o;44387:138::-;44468:32;44494:5;44468:32;:::i;:::-;44461:5;44458:43;44448:71;;44515:1;44512;44505:12;44448:71;44387:138;:::o;44531:116::-;44601:21;44616:5;44601:21;:::i;:::-;44594:5;44591:32;44581:60;;44637:1;44634;44627:12;44581:60;44531:116;:::o;44653:122::-;44726:24;44744:5;44726:24;:::i;:::-;44719:5;44716:35;44706:63;;44765:1;44762;44755:12;44706:63;44653:122;:::o;44781:120::-;44853:23;44870:5;44853:23;:::i;:::-;44846:5;44843:34;44833:62;;44891:1;44888;44881:12;44833:62;44781:120;:::o;44907:122::-;44980:24;44998:5;44980:24;:::i;:::-;44973:5;44970:35;44960:63;;45019:1;45016;45009:12;44960:63;44907:122;:::o
Swarm Source
ipfs://51399a6316de2d7da205dabab02239eab5ca5e3939d28b63fcb51e971fb28e56
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.