Overview
TokenID
20
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BEKX_PRIDE
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-21 */ //SPDX-License-Identifier: MIT /* ____ _ _ _____ _ _ | _ \ | | /\ | | | __ \ (_) | | | |_) | ___| | ____ __ / \ _ __| |_ | |__) | __ _ __| | ___ | _ < / _ \ |/ /\ \/ / / /\ \ | '__| __| | ___/ '__| |/ _` |/ _ \ | |_) | __/ < > < / ____ \| | | |_ | | | | | | (_| | __/ |____/ \___|_|\_\/_/\_\/_/ _ \_\_| \__|_|_| _|_|__|_|\__,_|\___| /\ | | (_) (_) | | | \/ (_) | | / \ _ __ ___| | _ __ _ _ _ _ __| | | \ / |_ _ __ | |_ / /\ \ | '_ \ / _ \ | | |/ _` | | | | |/ _` | | |\/| | | '_ \| __| / ____ \| |_) | __/ |____| | (_| | |_| | | (_| | | | | | | | | | |_ /_/ \_\ .__/ \___|______|_|\__, |\__,_|_|\__,_| |_| |_|_|_| |_|\__| | | | | |_| |_| */ // SPDX-License-Identifier: MIT // 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; } 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); } 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); } 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; } } pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } 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 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } 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); } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } 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; } } 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); } } 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; } } 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 overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _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 || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev 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 {} } 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, _msgSender()); _; } /** * @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 `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()); } } } 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(); } } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } 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); } } pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } pragma solidity ^0.8.0; contract BEKX_PRIDE is ERC721A, ReentrancyGuard, Ownable, PaymentSplitter { // Minting Variables uint256 public mintPrice = 0.0969 ether; uint256 public maxPurchase = 3; uint256 public maxSupply = 112; address[] public _payees = [ 0x0B0237aD59e1BbCb611fdf0c9Fa07350C3f41e87, 0x5f3ca358E464650327AD24DEf75f22494A349a28 ]; uint256[] private _shares = [5, 95]; // Sale Status bool public saleIsActive = false; mapping(address => uint) public addressesThatMinted; // Metadata string _baseTokenURI = "https://ipfs.io/ipfs/QmPdYqxA642wHsWbHpwofPhg6wgy5VDx2Lur1jRYNu86d3/"; bool public locked; // Events event SaleActivation(bool isActive); constructor() ERC721A("Bekx Pride", "BEKX_PRIDE") PaymentSplitter(_payees, _shares) { } //Holder status validation // Minting function ownerMint(address _to, uint256 _count) external onlyOwner { require( totalSupply() + _count <= maxSupply, "SOLD_OUT" ); _safeMint(_to, _count); } function mint(uint256 _count) external payable nonReentrant { require(saleIsActive, "SALE_INACTIVE"); require(((addressesThatMinted[msg.sender] + _count) ) <= maxPurchase , "this would exceed mint max allowance"); require( totalSupply() + _count <= maxSupply, "SOLD_OUT" ); require( mintPrice * _count <= msg.value, "INCORRECT_ETHER_VALUE" ); _safeMint(msg.sender, _count); addressesThatMinted[msg.sender] += _count; } function toggleSaleStatus() external onlyOwner { saleIsActive = !saleIsActive; emit SaleActivation(saleIsActive); } function setMintPrice(uint256 _mintPrice) external onlyOwner { mintPrice = _mintPrice; } function setMaxPurchase(uint256 _maxPurchase) external onlyOwner { maxPurchase = _maxPurchase; } function lockMetadata() external onlyOwner { locked = true; } // Payment function claim() external { release(payable(msg.sender)); } function getWalletOfOwner(address owner) external view returns (uint256[] memory) { unchecked { uint256[] memory a = new uint256[](balanceOf(owner)); uint256 end = _currentIndex; uint256 tokenIdsIdx; address currOwnershipAddr; for (uint256 i; i < end; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { a[tokenIdsIdx++] = i; } } return a; } } function getTotalSupply() external view returns (uint256) { return totalSupply(); } function setBaseURI(string memory baseURI) external onlyOwner { require(!locked, "METADATA_LOCKED"); _baseTokenURI = baseURI; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function tokenURI(uint256 tokenId) public view override returns (string memory){ return string(abi.encodePacked(super.tokenURI(tokenId), ".json")); } function _startTokenId() internal view virtual override returns (uint256){ return 1; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SaleActivation","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_payees","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressesThatMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getWalletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","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":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPurchase","type":"uint256"}],"name":"setMaxPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405267015842095ebc4000601155600360125560706013556040518060400160405280730b0237ad59e1bbcb611fdf0c9fa07350c3f41e8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735f3ca358e464650327ad24def75f22494a349a2873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506014906002620000c19291906200071e565b506040518060400160405280600560ff168152602001605f60ff168152506015906002620000f1929190620007ad565b506000601660006101000a81548160ff02191690831515021790555060405180608001604052806044815260200162005d3760449139601890805190602001906200013e92919062000804565b503480156200014c57600080fd5b506014805480602002602001604051908101604052809291908181526020018280548015620001d157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831162000186575b505050505060158054806020026020016040519081016040528092919081815260200182805480156200022457602002820191906000526020600020905b8154815260200190600101908083116200020f575b50505050506040518060400160405280600a81526020017f42656b78205072696465000000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f42454b585f5052494445000000000000000000000000000000000000000000008152508160029080519060200190620002ad92919062000804565b508060039080519060200190620002c692919062000804565b50620002d76200040d60201b60201c565b6000819055505050600160088190555062000307620002fb6200041660201b60201c565b6200041e60201b60201c565b80518251146200034e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034590620009e8565b60405180910390fd5b600082511162000395576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038c9062000a2c565b60405180910390fd5b60005b82518110156200040457620003ee838281518110620003bc57620003bb62000bfe565b5b6020026020010151838381518110620003da57620003d962000bfe565b5b6020026020010151620004e460201b60201c565b8080620003fb9062000b52565b91505062000398565b50505062000d6c565b60006001905090565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000557576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200054e90620009c6565b60405180910390fd5b600081116200059d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005949062000a4e565b60405180910390fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006199062000a0a565b60405180910390fd5b600e829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600a54620006d9919062000a81565b600a819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200071292919062000999565b60405180910390a15050565b8280548282559060005260206000209081019282156200079a579160200282015b82811115620007995782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906200073f565b5b509050620007a9919062000895565b5090565b828054828255906000526020600020908101928215620007f1579160200282015b82811115620007f0578251829060ff16905591602001919060010190620007ce565b5b50905062000800919062000895565b5090565b828054620008129062000b1c565b90600052602060002090601f01602090048101928262000836576000855562000882565b82601f106200085157805160ff191683800117855562000882565b8280016001018555821562000882579182015b828111156200088157825182559160200191906001019062000864565b5b50905062000891919062000895565b5090565b5b80821115620008b057600081600090555060010162000896565b5090565b620008bf8162000ade565b82525050565b6000620008d4602c8362000a70565b9150620008e18262000c2d565b604082019050919050565b6000620008fb60328362000a70565b9150620009088262000c7c565b604082019050919050565b600062000922602b8362000a70565b91506200092f8262000ccb565b604082019050919050565b600062000949601a8362000a70565b9150620009568262000d1a565b602082019050919050565b600062000970601d8362000a70565b91506200097d8262000d43565b602082019050919050565b620009938162000b12565b82525050565b6000604082019050620009b06000830185620008b4565b620009bf602083018462000988565b9392505050565b60006020820190508181036000830152620009e181620008c5565b9050919050565b6000602082019050818103600083015262000a0381620008ec565b9050919050565b6000602082019050818103600083015262000a258162000913565b9050919050565b6000602082019050818103600083015262000a47816200093a565b9050919050565b6000602082019050818103600083015262000a698162000961565b9050919050565b600082825260208201905092915050565b600062000a8e8262000b12565b915062000a9b8362000b12565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000ad35762000ad262000ba0565b5b828201905092915050565b600062000aeb8262000af2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000b3557607f821691505b6020821081141562000b4c5762000b4b62000bcf565b5b50919050565b600062000b5f8262000b12565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000b955762000b9462000ba0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b614fbb8062000d7c6000396000f3fe6080604052600436106102605760003560e01c8063715018a611610144578063c4e41b22116100b6578063d79779b21161007a578063d79779b214610948578063e33b7de314610985578063e985e9c5146109b0578063eb8d2444146109ed578063f2fde38b14610a18578063f4a0a52814610a41576102a7565b8063c4e41b221461084d578063c87b56dd14610878578063ce7c2ac2146108b5578063cf309012146108f2578063d5abeb011461091d576102a7565b80639852595c116101085780639852595c1461074e578063989bdbb61461078b578063a0712d68146107a2578063a22cb465146107be578063ab2fdb0c146107e7578063b88d4fde14610824576102a7565b8063715018a6146106795780638b83209b146106905780638da5cb5b146106cd57806395d89b41146106f8578063977b055b14610723576102a7565b8063406072a9116101dd57806355f804b3116101a157806355f804b314610545578063627fdeab1461056e5780636352211e146105ab5780636817c76c146105e857806370a08231146106135780637118974214610650576102a7565b8063406072a91461047657806342842e0e146104b3578063484b973c146104dc57806348b75044146105055780634e71d92d1461052e576102a7565b806318160ddd1161022457806318160ddd1461039157806319165587146103bc57806323b872dd146103e5578063283248be1461040e5780633a98ef391461044b576102a7565b806301ffc9a7146102ac578063049c5c49146102e957806306fdde0314610300578063081812fc1461032b578063095ea7b314610368576102a7565b366102a7577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061028e610a6a565b3460405161029d9291906143bb565b60405180910390a1005b600080fd5b3480156102b857600080fd5b506102d360048036038101906102ce9190613d67565b610a72565b6040516102e09190614406565b60405180910390f35b3480156102f557600080fd5b506102fe610b54565b005b34801561030c57600080fd5b50610315610c42565b6040516103229190614421565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190613e77565b610cd4565b60405161035f919061432b565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190613cfa565b610d50565b005b34801561039d57600080fd5b506103a6610e5b565b6040516103b39190614623565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de9190613b77565b610e72565b005b3480156103f157600080fd5b5061040c60048036038101906104079190613be4565b61101d565b005b34801561041a57600080fd5b5061043560048036038101906104309190613e77565b61102d565b604051610442919061432b565b60405180910390f35b34801561045757600080fd5b5061046061106c565b60405161046d9190614623565b60405180910390f35b34801561048257600080fd5b5061049d60048036038101906104989190613dee565b611076565b6040516104aa9190614623565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190613be4565b6110fd565b005b3480156104e857600080fd5b5061050360048036038101906104fe9190613cfa565b61111d565b005b34801561051157600080fd5b5061052c60048036038101906105279190613dee565b6111fe565b005b34801561053a57600080fd5b506105436114c6565b005b34801561055157600080fd5b5061056c60048036038101906105679190613e2e565b6114d1565b005b34801561057a57600080fd5b5061059560048036038101906105909190613b4a565b6115b7565b6040516105a291906143e4565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190613e77565b6117ae565b6040516105df919061432b565b60405180910390f35b3480156105f457600080fd5b506105fd6117c4565b60405161060a9190614623565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190613b4a565b6117ca565b6040516106479190614623565b60405180910390f35b34801561065c57600080fd5b5061067760048036038101906106729190613e77565b61189a565b005b34801561068557600080fd5b5061068e611920565b005b34801561069c57600080fd5b506106b760048036038101906106b29190613e77565b6119a8565b6040516106c4919061432b565b60405180910390f35b3480156106d957600080fd5b506106e26119f0565b6040516106ef919061432b565b60405180910390f35b34801561070457600080fd5b5061070d611a1a565b60405161071a9190614421565b60405180910390f35b34801561072f57600080fd5b50610738611aac565b6040516107459190614623565b60405180910390f35b34801561075a57600080fd5b5061077560048036038101906107709190613b4a565b611ab2565b6040516107829190614623565b60405180910390f35b34801561079757600080fd5b506107a0611afb565b005b6107bc60048036038101906107b79190613e77565b611b94565b005b3480156107ca57600080fd5b506107e560048036038101906107e09190613cba565b611dd2565b005b3480156107f357600080fd5b5061080e60048036038101906108099190613b4a565b611f4a565b60405161081b9190614623565b60405180910390f35b34801561083057600080fd5b5061084b60048036038101906108469190613c37565b611f62565b005b34801561085957600080fd5b50610862611fde565b60405161086f9190614623565b60405180910390f35b34801561088457600080fd5b5061089f600480360381019061089a9190613e77565b611fed565b6040516108ac9190614421565b60405180910390f35b3480156108c157600080fd5b506108dc60048036038101906108d79190613b4a565b61201e565b6040516108e99190614623565b60405180910390f35b3480156108fe57600080fd5b50610907612067565b6040516109149190614406565b60405180910390f35b34801561092957600080fd5b5061093261207a565b60405161093f9190614623565b60405180910390f35b34801561095457600080fd5b5061096f600480360381019061096a9190613dc1565b612080565b60405161097c9190614623565b60405180910390f35b34801561099157600080fd5b5061099a6120c9565b6040516109a79190614623565b60405180910390f35b3480156109bc57600080fd5b506109d760048036038101906109d29190613ba4565b6120d3565b6040516109e49190614406565b60405180910390f35b3480156109f957600080fd5b50610a02612167565b604051610a0f9190614406565b60405180910390f35b348015610a2457600080fd5b50610a3f6004803603810190610a3a9190613b4a565b61217a565b005b348015610a4d57600080fd5b50610a686004803603810190610a639190613e77565b612272565b005b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b3d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4d5750610b4c826122f8565b5b9050919050565b610b5c610a6a565b73ffffffffffffffffffffffffffffffffffffffff16610b7a6119f0565b73ffffffffffffffffffffffffffffffffffffffff1614610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc790614583565b60405180910390fd5b601660009054906101000a900460ff1615601660006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f601660009054906101000a900460ff16604051610c389190614406565b60405180910390a1565b606060028054610c5190614971565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7d90614971565b8015610cca5780601f10610c9f57610100808354040283529160200191610cca565b820191906000526020600020905b815481529060010190602001808311610cad57829003601f168201915b5050505050905090565b6000610cdf82612362565b610d15576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d5b826117ae565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dc3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610de2610a6a565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e145750610e1281610e0d610a6a565b6120d3565b155b15610e4b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e568383836123b0565b505050565b6000610e65612462565b6001546000540303905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb90614483565b60405180910390fd5b6000610efe6120c9565b47610f09919061474c565b90506000610f208383610f1b86611ab2565b61246b565b90506000811415610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90614523565b60405180910390fd5b80600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fb5919061474c565b9250508190555080600b6000828254610fce919061474c565b92505081905550610fdf83826124d9565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051611010929190614346565b60405180910390a1505050565b6110288383836125cd565b505050565b6014818154811061103d57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a54905090565b6000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61111883838360405180602001604052806000815250611f62565b505050565b611125610a6a565b73ffffffffffffffffffffffffffffffffffffffff166111436119f0565b73ffffffffffffffffffffffffffffffffffffffff1614611199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119090614583565b60405180910390fd5b601354816111a5610e5b565b6111af919061474c565b11156111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790614543565b60405180910390fd5b6111fa8282612a83565b5050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127790614483565b60405180910390fd5b600061128b83612080565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112c4919061432b565b60206040518083038186803b1580156112dc57600080fd5b505afa1580156112f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113149190613ea4565b61131e919061474c565b9050600061133683836113318787611076565b61246b565b9050600081141561137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390614523565b60405180910390fd5b80601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611408919061474c565b9250508190555080600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461145e919061474c565b92505081905550611470848483612aa1565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516114b89291906143bb565b60405180910390a250505050565b6114cf33610e72565b565b6114d9610a6a565b73ffffffffffffffffffffffffffffffffffffffff166114f76119f0565b73ffffffffffffffffffffffffffffffffffffffff161461154d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154490614583565b60405180910390fd5b601960009054906101000a900460ff161561159d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611594906144a3565b60405180910390fd5b80601890805190602001906115b39291906138c7565b5050565b606060006115c4836117ca565b67ffffffffffffffff8111156115dd576115dc614b0a565b5b60405190808252806020026020018201604052801561160b5781602001602082028036833780820191505090505b50905060008054905060008060005b838110156117a1576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156116f75750611794565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461173757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611792578186858060010196508151811061178557611784614adb565b5b6020026020010181815250505b505b808060010191505061161a565b5083945050505050919050565b60006117b982612b27565b600001519050919050565b60115481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611832576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6118a2610a6a565b73ffffffffffffffffffffffffffffffffffffffff166118c06119f0565b73ffffffffffffffffffffffffffffffffffffffff1614611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90614583565b60405180910390fd5b8060128190555050565b611928610a6a565b73ffffffffffffffffffffffffffffffffffffffff166119466119f0565b73ffffffffffffffffffffffffffffffffffffffff161461199c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199390614583565b60405180910390fd5b6119a66000612db6565b565b6000600e82815481106119be576119bd614adb565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611a2990614971565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5590614971565b8015611aa25780601f10611a7757610100808354040283529160200191611aa2565b820191906000526020600020905b815481529060010190602001808311611a8557829003601f168201915b5050505050905090565b60125481565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b03610a6a565b73ffffffffffffffffffffffffffffffffffffffff16611b216119f0565b73ffffffffffffffffffffffffffffffffffffffff1614611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e90614583565b60405180910390fd5b6001601960006101000a81548160ff021916908315150217905550565b60026008541415611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd190614603565b60405180910390fd5b6002600881905550601660009054906101000a900460ff16611c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2890614563565b60405180910390fd5b60125481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c7f919061474c565b1115611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb7906145a3565b60405180910390fd5b60135481611ccc610e5b565b611cd6919061474c565b1115611d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0e90614543565b60405180910390fd5b3481601154611d2691906147d3565b1115611d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5e90614463565b60405180910390fd5b611d713382612a83565b80601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dc0919061474c565b92505081905550600160088190555050565b611dda610a6a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e3f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e4c610a6a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ef9610a6a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f3e9190614406565b60405180910390a35050565b60176020528060005260406000206000915090505481565b611f6d8484846125cd565b611f8c8373ffffffffffffffffffffffffffffffffffffffff16612e7c565b8015611fa15750611f9f84848484612e8f565b155b15611fd8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000611fe8610e5b565b905090565b6060611ff882612fef565b60405160200161200891906142f4565b6040516020818303038152906040529050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601960009054906101000a900460ff1681565b60135481565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600b54905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601660009054906101000a900460ff1681565b612182610a6a565b73ffffffffffffffffffffffffffffffffffffffff166121a06119f0565b73ffffffffffffffffffffffffffffffffffffffff16146121f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ed90614583565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225d90614443565b60405180910390fd5b61226f81612db6565b50565b61227a610a6a565b73ffffffffffffffffffffffffffffffffffffffff166122986119f0565b73ffffffffffffffffffffffffffffffffffffffff16146122ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e590614583565b60405180910390fd5b8060118190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161236d612462565b1115801561237c575060005482105b80156123a9575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600081600a54600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856124bc91906147d3565b6124c691906147a2565b6124d0919061482d565b90509392505050565b8047101561251c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612513906144e3565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161254290614316565b60006040518083038185875af1925050503d806000811461257f576040519150601f19603f3d011682016040523d82523d6000602084013e612584565b606091505b50509050806125c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bf906144c3565b60405180910390fd5b505050565b60006125d882612b27565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612643576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612664610a6a565b73ffffffffffffffffffffffffffffffffffffffff16148061269357506126928561268d610a6a565b6120d3565b5b806126d857506126a1610a6a565b73ffffffffffffffffffffffffffffffffffffffff166126c084610cd4565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612711576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612778576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612785858585600161308e565b612791600084876123b0565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a11576000548214612a1057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a7c8585856001613094565b5050505050565b612a9d82826040518060200160405280600081525061309a565b5050565b612b228363a9059cbb60e01b8484604051602401612ac09291906143bb565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130ac565b505050565b612b2f61394d565b600082905080612b3d612462565b11158015612b4c575060005481105b15612d7f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d7d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c61578092505050612db1565b5b600115612d7c57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d77578092505050612db1565b612c62565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612eb5610a6a565b8786866040518563ffffffff1660e01b8152600401612ed7949392919061436f565b602060405180830381600087803b158015612ef157600080fd5b505af1925050508015612f2257506040513d601f19601f82011682018060405250810190612f1f9190613d94565b60015b612f9c573d8060008114612f52576040519150601f19603f3d011682016040523d82523d6000602084013e612f57565b606091505b50600081511415612f94576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060612ffa82612362565b613030576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061303a613173565b905060008151141561305b5760405180602001604052806000815250613086565b8061306584613205565b6040516020016130769291906142d0565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b6130a78383836001613366565b505050565b600061310e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137349092919063ffffffff16565b905060008151111561316e578080602001905181019061312e9190613d3a565b61316d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613164906145e3565b60405180910390fd5b5b505050565b60606018805461318290614971565b80601f01602080910402602001604051908101604052809291908181526020018280546131ae90614971565b80156131fb5780601f106131d0576101008083540402835291602001916131fb565b820191906000526020600020905b8154815290600101906020018083116131de57829003601f168201915b5050505050905090565b6060600082141561324d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613361565b600082905060005b6000821461327f578080613268906149d4565b915050600a8261327891906147a2565b9150613255565b60008167ffffffffffffffff81111561329b5761329a614b0a565b5b6040519080825280601f01601f1916602001820160405280156132cd5781602001600182028036833780820191505090505b5090505b6000851461335a576001826132e6919061482d565b9150600a856132f59190614a1d565b6030613301919061474c565b60f81b81838151811061331757613316614adb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561335391906147a2565b94506132d1565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156133d3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561340e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61341b600086838761308e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156135e557506135e48773ffffffffffffffffffffffffffffffffffffffff16612e7c565b5b156136ab575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461365a6000888480600101955088612e8f565b613690576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156135eb5782600054146136a657600080fd5b613717565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156136ac575b81600081905550505061372d6000868387613094565b5050505050565b6060613743848460008561374c565b90509392505050565b606082471015613791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378890614503565b60405180910390fd5b61379a85612e7c565b6137d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d0906145c3565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161380291906142b9565b60006040518083038185875af1925050503d806000811461383f576040519150601f19603f3d011682016040523d82523d6000602084013e613844565b606091505b5091509150613854828286613860565b92505050949350505050565b60608315613870578290506138c0565b6000835111156138835782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b79190614421565b60405180910390fd5b9392505050565b8280546138d390614971565b90600052602060002090601f0160209004810192826138f5576000855561393c565b82601f1061390e57805160ff191683800117855561393c565b8280016001018555821561393c579182015b8281111561393b578251825591602001919060010190613920565b5b5090506139499190613990565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139a9576000816000905550600101613991565b5090565b60006139c06139bb84614663565b61463e565b9050828152602081018484840111156139dc576139db614b3e565b5b6139e784828561492f565b509392505050565b6000613a026139fd84614694565b61463e565b905082815260208101848484011115613a1e57613a1d614b3e565b5b613a2984828561492f565b509392505050565b600081359050613a4081614efb565b92915050565b600081359050613a5581614f12565b92915050565b600081359050613a6a81614f29565b92915050565b600081519050613a7f81614f29565b92915050565b600081359050613a9481614f40565b92915050565b600081519050613aa981614f40565b92915050565b600082601f830112613ac457613ac3614b39565b5b8135613ad48482602086016139ad565b91505092915050565b600081359050613aec81614f57565b92915050565b600082601f830112613b0757613b06614b39565b5b8135613b178482602086016139ef565b91505092915050565b600081359050613b2f81614f6e565b92915050565b600081519050613b4481614f6e565b92915050565b600060208284031215613b6057613b5f614b48565b5b6000613b6e84828501613a31565b91505092915050565b600060208284031215613b8d57613b8c614b48565b5b6000613b9b84828501613a46565b91505092915050565b60008060408385031215613bbb57613bba614b48565b5b6000613bc985828601613a31565b9250506020613bda85828601613a31565b9150509250929050565b600080600060608486031215613bfd57613bfc614b48565b5b6000613c0b86828701613a31565b9350506020613c1c86828701613a31565b9250506040613c2d86828701613b20565b9150509250925092565b60008060008060808587031215613c5157613c50614b48565b5b6000613c5f87828801613a31565b9450506020613c7087828801613a31565b9350506040613c8187828801613b20565b925050606085013567ffffffffffffffff811115613ca257613ca1614b43565b5b613cae87828801613aaf565b91505092959194509250565b60008060408385031215613cd157613cd0614b48565b5b6000613cdf85828601613a31565b9250506020613cf085828601613a5b565b9150509250929050565b60008060408385031215613d1157613d10614b48565b5b6000613d1f85828601613a31565b9250506020613d3085828601613b20565b9150509250929050565b600060208284031215613d5057613d4f614b48565b5b6000613d5e84828501613a70565b91505092915050565b600060208284031215613d7d57613d7c614b48565b5b6000613d8b84828501613a85565b91505092915050565b600060208284031215613daa57613da9614b48565b5b6000613db884828501613a9a565b91505092915050565b600060208284031215613dd757613dd6614b48565b5b6000613de584828501613add565b91505092915050565b60008060408385031215613e0557613e04614b48565b5b6000613e1385828601613add565b9250506020613e2485828601613a31565b9150509250929050565b600060208284031215613e4457613e43614b48565b5b600082013567ffffffffffffffff811115613e6257613e61614b43565b5b613e6e84828501613af2565b91505092915050565b600060208284031215613e8d57613e8c614b48565b5b6000613e9b84828501613b20565b91505092915050565b600060208284031215613eba57613eb9614b48565b5b6000613ec884828501613b35565b91505092915050565b6000613edd838361429b565b60208301905092915050565b613ef2816148f9565b82525050565b613f0181614861565b82525050565b6000613f12826146d5565b613f1c8185614703565b9350613f27836146c5565b8060005b83811015613f58578151613f3f8882613ed1565b9750613f4a836146f6565b925050600181019050613f2b565b5085935050505092915050565b613f6e81614885565b82525050565b6000613f7f826146e0565b613f898185614714565b9350613f9981856020860161493e565b613fa281614b4d565b840191505092915050565b6000613fb8826146e0565b613fc28185614725565b9350613fd281856020860161493e565b80840191505092915050565b6000613fe9826146eb565b613ff38185614730565b935061400381856020860161493e565b61400c81614b4d565b840191505092915050565b6000614022826146eb565b61402c8185614741565b935061403c81856020860161493e565b80840191505092915050565b6000614055602683614730565b915061406082614b5e565b604082019050919050565b6000614078601583614730565b915061408382614bad565b602082019050919050565b600061409b602683614730565b91506140a682614bd6565b604082019050919050565b60006140be600f83614730565b91506140c982614c25565b602082019050919050565b60006140e1603a83614730565b91506140ec82614c4e565b604082019050919050565b6000614104601d83614730565b915061410f82614c9d565b602082019050919050565b6000614127602683614730565b915061413282614cc6565b604082019050919050565b600061414a602b83614730565b915061415582614d15565b604082019050919050565b600061416d600883614730565b915061417882614d64565b602082019050919050565b6000614190600583614741565b915061419b82614d8d565b600582019050919050565b60006141b3600d83614730565b91506141be82614db6565b602082019050919050565b60006141d6602083614730565b91506141e182614ddf565b602082019050919050565b60006141f9602483614730565b915061420482614e08565b604082019050919050565b600061421c600083614725565b915061422782614e57565b600082019050919050565b600061423f601d83614730565b915061424a82614e5a565b602082019050919050565b6000614262602a83614730565b915061426d82614e83565b604082019050919050565b6000614285601f83614730565b915061429082614ed2565b602082019050919050565b6142a4816148ef565b82525050565b6142b3816148ef565b82525050565b60006142c58284613fad565b915081905092915050565b60006142dc8285614017565b91506142e88284614017565b91508190509392505050565b60006143008284614017565b915061430b82614183565b915081905092915050565b60006143218261420f565b9150819050919050565b60006020820190506143406000830184613ef8565b92915050565b600060408201905061435b6000830185613ee9565b61436860208301846142aa565b9392505050565b60006080820190506143846000830187613ef8565b6143916020830186613ef8565b61439e60408301856142aa565b81810360608301526143b08184613f74565b905095945050505050565b60006040820190506143d06000830185613ef8565b6143dd60208301846142aa565b9392505050565b600060208201905081810360008301526143fe8184613f07565b905092915050565b600060208201905061441b6000830184613f65565b92915050565b6000602082019050818103600083015261443b8184613fde565b905092915050565b6000602082019050818103600083015261445c81614048565b9050919050565b6000602082019050818103600083015261447c8161406b565b9050919050565b6000602082019050818103600083015261449c8161408e565b9050919050565b600060208201905081810360008301526144bc816140b1565b9050919050565b600060208201905081810360008301526144dc816140d4565b9050919050565b600060208201905081810360008301526144fc816140f7565b9050919050565b6000602082019050818103600083015261451c8161411a565b9050919050565b6000602082019050818103600083015261453c8161413d565b9050919050565b6000602082019050818103600083015261455c81614160565b9050919050565b6000602082019050818103600083015261457c816141a6565b9050919050565b6000602082019050818103600083015261459c816141c9565b9050919050565b600060208201905081810360008301526145bc816141ec565b9050919050565b600060208201905081810360008301526145dc81614232565b9050919050565b600060208201905081810360008301526145fc81614255565b9050919050565b6000602082019050818103600083015261461c81614278565b9050919050565b600060208201905061463860008301846142aa565b92915050565b6000614648614659565b905061465482826149a3565b919050565b6000604051905090565b600067ffffffffffffffff82111561467e5761467d614b0a565b5b61468782614b4d565b9050602081019050919050565b600067ffffffffffffffff8211156146af576146ae614b0a565b5b6146b882614b4d565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614757826148ef565b9150614762836148ef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561479757614796614a4e565b5b828201905092915050565b60006147ad826148ef565b91506147b8836148ef565b9250826147c8576147c7614a7d565b5b828204905092915050565b60006147de826148ef565b91506147e9836148ef565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561482257614821614a4e565b5b828202905092915050565b6000614838826148ef565b9150614843836148ef565b92508282101561485657614855614a4e565b5b828203905092915050565b600061486c826148cf565b9050919050565b600061487e826148cf565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006148c882614861565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006149048261490b565b9050919050565b60006149168261491d565b9050919050565b6000614928826148cf565b9050919050565b82818337600083830152505050565b60005b8381101561495c578082015181840152602081019050614941565b8381111561496b576000848401525b50505050565b6000600282049050600182168061498957607f821691505b6020821081141561499d5761499c614aac565b5b50919050565b6149ac82614b4d565b810181811067ffffffffffffffff821117156149cb576149ca614b0a565b5b80604052505050565b60006149df826148ef565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a1257614a11614a4e565b5b600182019050919050565b6000614a28826148ef565b9150614a33836148ef565b925082614a4357614a42614a7d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f494e434f52524543545f45544845525f56414c55450000000000000000000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4d455441444154415f4c4f434b45440000000000000000000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f534f4c445f4f5554000000000000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f53414c455f494e41435449564500000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7468697320776f756c6420657863656564206d696e74206d617820616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614f0481614861565b8114614f0f57600080fd5b50565b614f1b81614873565b8114614f2657600080fd5b50565b614f3281614885565b8114614f3d57600080fd5b50565b614f4981614891565b8114614f5457600080fd5b50565b614f60816148bd565b8114614f6b57600080fd5b50565b614f77816148ef565b8114614f8257600080fd5b5056fea26469706673582212206bd6054d8d0a86081b2e7c09f5ee777033dac47bd35961770b3e155fc061389864736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d50645971784136343277487357624870776f665068673677677935564478324c7572316a52594e75383664332f
Deployed Bytecode
0x6080604052600436106102605760003560e01c8063715018a611610144578063c4e41b22116100b6578063d79779b21161007a578063d79779b214610948578063e33b7de314610985578063e985e9c5146109b0578063eb8d2444146109ed578063f2fde38b14610a18578063f4a0a52814610a41576102a7565b8063c4e41b221461084d578063c87b56dd14610878578063ce7c2ac2146108b5578063cf309012146108f2578063d5abeb011461091d576102a7565b80639852595c116101085780639852595c1461074e578063989bdbb61461078b578063a0712d68146107a2578063a22cb465146107be578063ab2fdb0c146107e7578063b88d4fde14610824576102a7565b8063715018a6146106795780638b83209b146106905780638da5cb5b146106cd57806395d89b41146106f8578063977b055b14610723576102a7565b8063406072a9116101dd57806355f804b3116101a157806355f804b314610545578063627fdeab1461056e5780636352211e146105ab5780636817c76c146105e857806370a08231146106135780637118974214610650576102a7565b8063406072a91461047657806342842e0e146104b3578063484b973c146104dc57806348b75044146105055780634e71d92d1461052e576102a7565b806318160ddd1161022457806318160ddd1461039157806319165587146103bc57806323b872dd146103e5578063283248be1461040e5780633a98ef391461044b576102a7565b806301ffc9a7146102ac578063049c5c49146102e957806306fdde0314610300578063081812fc1461032b578063095ea7b314610368576102a7565b366102a7577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061028e610a6a565b3460405161029d9291906143bb565b60405180910390a1005b600080fd5b3480156102b857600080fd5b506102d360048036038101906102ce9190613d67565b610a72565b6040516102e09190614406565b60405180910390f35b3480156102f557600080fd5b506102fe610b54565b005b34801561030c57600080fd5b50610315610c42565b6040516103229190614421565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190613e77565b610cd4565b60405161035f919061432b565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190613cfa565b610d50565b005b34801561039d57600080fd5b506103a6610e5b565b6040516103b39190614623565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de9190613b77565b610e72565b005b3480156103f157600080fd5b5061040c60048036038101906104079190613be4565b61101d565b005b34801561041a57600080fd5b5061043560048036038101906104309190613e77565b61102d565b604051610442919061432b565b60405180910390f35b34801561045757600080fd5b5061046061106c565b60405161046d9190614623565b60405180910390f35b34801561048257600080fd5b5061049d60048036038101906104989190613dee565b611076565b6040516104aa9190614623565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190613be4565b6110fd565b005b3480156104e857600080fd5b5061050360048036038101906104fe9190613cfa565b61111d565b005b34801561051157600080fd5b5061052c60048036038101906105279190613dee565b6111fe565b005b34801561053a57600080fd5b506105436114c6565b005b34801561055157600080fd5b5061056c60048036038101906105679190613e2e565b6114d1565b005b34801561057a57600080fd5b5061059560048036038101906105909190613b4a565b6115b7565b6040516105a291906143e4565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190613e77565b6117ae565b6040516105df919061432b565b60405180910390f35b3480156105f457600080fd5b506105fd6117c4565b60405161060a9190614623565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190613b4a565b6117ca565b6040516106479190614623565b60405180910390f35b34801561065c57600080fd5b5061067760048036038101906106729190613e77565b61189a565b005b34801561068557600080fd5b5061068e611920565b005b34801561069c57600080fd5b506106b760048036038101906106b29190613e77565b6119a8565b6040516106c4919061432b565b60405180910390f35b3480156106d957600080fd5b506106e26119f0565b6040516106ef919061432b565b60405180910390f35b34801561070457600080fd5b5061070d611a1a565b60405161071a9190614421565b60405180910390f35b34801561072f57600080fd5b50610738611aac565b6040516107459190614623565b60405180910390f35b34801561075a57600080fd5b5061077560048036038101906107709190613b4a565b611ab2565b6040516107829190614623565b60405180910390f35b34801561079757600080fd5b506107a0611afb565b005b6107bc60048036038101906107b79190613e77565b611b94565b005b3480156107ca57600080fd5b506107e560048036038101906107e09190613cba565b611dd2565b005b3480156107f357600080fd5b5061080e60048036038101906108099190613b4a565b611f4a565b60405161081b9190614623565b60405180910390f35b34801561083057600080fd5b5061084b60048036038101906108469190613c37565b611f62565b005b34801561085957600080fd5b50610862611fde565b60405161086f9190614623565b60405180910390f35b34801561088457600080fd5b5061089f600480360381019061089a9190613e77565b611fed565b6040516108ac9190614421565b60405180910390f35b3480156108c157600080fd5b506108dc60048036038101906108d79190613b4a565b61201e565b6040516108e99190614623565b60405180910390f35b3480156108fe57600080fd5b50610907612067565b6040516109149190614406565b60405180910390f35b34801561092957600080fd5b5061093261207a565b60405161093f9190614623565b60405180910390f35b34801561095457600080fd5b5061096f600480360381019061096a9190613dc1565b612080565b60405161097c9190614623565b60405180910390f35b34801561099157600080fd5b5061099a6120c9565b6040516109a79190614623565b60405180910390f35b3480156109bc57600080fd5b506109d760048036038101906109d29190613ba4565b6120d3565b6040516109e49190614406565b60405180910390f35b3480156109f957600080fd5b50610a02612167565b604051610a0f9190614406565b60405180910390f35b348015610a2457600080fd5b50610a3f6004803603810190610a3a9190613b4a565b61217a565b005b348015610a4d57600080fd5b50610a686004803603810190610a639190613e77565b612272565b005b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b3d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4d5750610b4c826122f8565b5b9050919050565b610b5c610a6a565b73ffffffffffffffffffffffffffffffffffffffff16610b7a6119f0565b73ffffffffffffffffffffffffffffffffffffffff1614610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc790614583565b60405180910390fd5b601660009054906101000a900460ff1615601660006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f601660009054906101000a900460ff16604051610c389190614406565b60405180910390a1565b606060028054610c5190614971565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7d90614971565b8015610cca5780601f10610c9f57610100808354040283529160200191610cca565b820191906000526020600020905b815481529060010190602001808311610cad57829003601f168201915b5050505050905090565b6000610cdf82612362565b610d15576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d5b826117ae565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dc3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610de2610a6a565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e145750610e1281610e0d610a6a565b6120d3565b155b15610e4b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e568383836123b0565b505050565b6000610e65612462565b6001546000540303905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb90614483565b60405180910390fd5b6000610efe6120c9565b47610f09919061474c565b90506000610f208383610f1b86611ab2565b61246b565b90506000811415610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90614523565b60405180910390fd5b80600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fb5919061474c565b9250508190555080600b6000828254610fce919061474c565b92505081905550610fdf83826124d9565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051611010929190614346565b60405180910390a1505050565b6110288383836125cd565b505050565b6014818154811061103d57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a54905090565b6000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61111883838360405180602001604052806000815250611f62565b505050565b611125610a6a565b73ffffffffffffffffffffffffffffffffffffffff166111436119f0565b73ffffffffffffffffffffffffffffffffffffffff1614611199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119090614583565b60405180910390fd5b601354816111a5610e5b565b6111af919061474c565b11156111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790614543565b60405180910390fd5b6111fa8282612a83565b5050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127790614483565b60405180910390fd5b600061128b83612080565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112c4919061432b565b60206040518083038186803b1580156112dc57600080fd5b505afa1580156112f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113149190613ea4565b61131e919061474c565b9050600061133683836113318787611076565b61246b565b9050600081141561137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390614523565b60405180910390fd5b80601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611408919061474c565b9250508190555080600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461145e919061474c565b92505081905550611470848483612aa1565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516114b89291906143bb565b60405180910390a250505050565b6114cf33610e72565b565b6114d9610a6a565b73ffffffffffffffffffffffffffffffffffffffff166114f76119f0565b73ffffffffffffffffffffffffffffffffffffffff161461154d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154490614583565b60405180910390fd5b601960009054906101000a900460ff161561159d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611594906144a3565b60405180910390fd5b80601890805190602001906115b39291906138c7565b5050565b606060006115c4836117ca565b67ffffffffffffffff8111156115dd576115dc614b0a565b5b60405190808252806020026020018201604052801561160b5781602001602082028036833780820191505090505b50905060008054905060008060005b838110156117a1576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156116f75750611794565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461173757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611792578186858060010196508151811061178557611784614adb565b5b6020026020010181815250505b505b808060010191505061161a565b5083945050505050919050565b60006117b982612b27565b600001519050919050565b60115481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611832576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6118a2610a6a565b73ffffffffffffffffffffffffffffffffffffffff166118c06119f0565b73ffffffffffffffffffffffffffffffffffffffff1614611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90614583565b60405180910390fd5b8060128190555050565b611928610a6a565b73ffffffffffffffffffffffffffffffffffffffff166119466119f0565b73ffffffffffffffffffffffffffffffffffffffff161461199c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199390614583565b60405180910390fd5b6119a66000612db6565b565b6000600e82815481106119be576119bd614adb565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611a2990614971565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5590614971565b8015611aa25780601f10611a7757610100808354040283529160200191611aa2565b820191906000526020600020905b815481529060010190602001808311611a8557829003601f168201915b5050505050905090565b60125481565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b03610a6a565b73ffffffffffffffffffffffffffffffffffffffff16611b216119f0565b73ffffffffffffffffffffffffffffffffffffffff1614611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e90614583565b60405180910390fd5b6001601960006101000a81548160ff021916908315150217905550565b60026008541415611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd190614603565b60405180910390fd5b6002600881905550601660009054906101000a900460ff16611c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2890614563565b60405180910390fd5b60125481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c7f919061474c565b1115611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb7906145a3565b60405180910390fd5b60135481611ccc610e5b565b611cd6919061474c565b1115611d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0e90614543565b60405180910390fd5b3481601154611d2691906147d3565b1115611d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5e90614463565b60405180910390fd5b611d713382612a83565b80601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dc0919061474c565b92505081905550600160088190555050565b611dda610a6a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e3f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e4c610a6a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ef9610a6a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f3e9190614406565b60405180910390a35050565b60176020528060005260406000206000915090505481565b611f6d8484846125cd565b611f8c8373ffffffffffffffffffffffffffffffffffffffff16612e7c565b8015611fa15750611f9f84848484612e8f565b155b15611fd8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000611fe8610e5b565b905090565b6060611ff882612fef565b60405160200161200891906142f4565b6040516020818303038152906040529050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601960009054906101000a900460ff1681565b60135481565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600b54905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601660009054906101000a900460ff1681565b612182610a6a565b73ffffffffffffffffffffffffffffffffffffffff166121a06119f0565b73ffffffffffffffffffffffffffffffffffffffff16146121f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ed90614583565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225d90614443565b60405180910390fd5b61226f81612db6565b50565b61227a610a6a565b73ffffffffffffffffffffffffffffffffffffffff166122986119f0565b73ffffffffffffffffffffffffffffffffffffffff16146122ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e590614583565b60405180910390fd5b8060118190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161236d612462565b1115801561237c575060005482105b80156123a9575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600081600a54600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856124bc91906147d3565b6124c691906147a2565b6124d0919061482d565b90509392505050565b8047101561251c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612513906144e3565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161254290614316565b60006040518083038185875af1925050503d806000811461257f576040519150601f19603f3d011682016040523d82523d6000602084013e612584565b606091505b50509050806125c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bf906144c3565b60405180910390fd5b505050565b60006125d882612b27565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612643576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612664610a6a565b73ffffffffffffffffffffffffffffffffffffffff16148061269357506126928561268d610a6a565b6120d3565b5b806126d857506126a1610a6a565b73ffffffffffffffffffffffffffffffffffffffff166126c084610cd4565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612711576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612778576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612785858585600161308e565b612791600084876123b0565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a11576000548214612a1057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a7c8585856001613094565b5050505050565b612a9d82826040518060200160405280600081525061309a565b5050565b612b228363a9059cbb60e01b8484604051602401612ac09291906143bb565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130ac565b505050565b612b2f61394d565b600082905080612b3d612462565b11158015612b4c575060005481105b15612d7f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d7d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c61578092505050612db1565b5b600115612d7c57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d77578092505050612db1565b612c62565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612eb5610a6a565b8786866040518563ffffffff1660e01b8152600401612ed7949392919061436f565b602060405180830381600087803b158015612ef157600080fd5b505af1925050508015612f2257506040513d601f19601f82011682018060405250810190612f1f9190613d94565b60015b612f9c573d8060008114612f52576040519150601f19603f3d011682016040523d82523d6000602084013e612f57565b606091505b50600081511415612f94576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060612ffa82612362565b613030576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061303a613173565b905060008151141561305b5760405180602001604052806000815250613086565b8061306584613205565b6040516020016130769291906142d0565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b6130a78383836001613366565b505050565b600061310e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137349092919063ffffffff16565b905060008151111561316e578080602001905181019061312e9190613d3a565b61316d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613164906145e3565b60405180910390fd5b5b505050565b60606018805461318290614971565b80601f01602080910402602001604051908101604052809291908181526020018280546131ae90614971565b80156131fb5780601f106131d0576101008083540402835291602001916131fb565b820191906000526020600020905b8154815290600101906020018083116131de57829003601f168201915b5050505050905090565b6060600082141561324d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613361565b600082905060005b6000821461327f578080613268906149d4565b915050600a8261327891906147a2565b9150613255565b60008167ffffffffffffffff81111561329b5761329a614b0a565b5b6040519080825280601f01601f1916602001820160405280156132cd5781602001600182028036833780820191505090505b5090505b6000851461335a576001826132e6919061482d565b9150600a856132f59190614a1d565b6030613301919061474c565b60f81b81838151811061331757613316614adb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561335391906147a2565b94506132d1565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156133d3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561340e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61341b600086838761308e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156135e557506135e48773ffffffffffffffffffffffffffffffffffffffff16612e7c565b5b156136ab575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461365a6000888480600101955088612e8f565b613690576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156135eb5782600054146136a657600080fd5b613717565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156136ac575b81600081905550505061372d6000868387613094565b5050505050565b6060613743848460008561374c565b90509392505050565b606082471015613791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378890614503565b60405180910390fd5b61379a85612e7c565b6137d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d0906145c3565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161380291906142b9565b60006040518083038185875af1925050503d806000811461383f576040519150601f19603f3d011682016040523d82523d6000602084013e613844565b606091505b5091509150613854828286613860565b92505050949350505050565b60608315613870578290506138c0565b6000835111156138835782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b79190614421565b60405180910390fd5b9392505050565b8280546138d390614971565b90600052602060002090601f0160209004810192826138f5576000855561393c565b82601f1061390e57805160ff191683800117855561393c565b8280016001018555821561393c579182015b8281111561393b578251825591602001919060010190613920565b5b5090506139499190613990565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139a9576000816000905550600101613991565b5090565b60006139c06139bb84614663565b61463e565b9050828152602081018484840111156139dc576139db614b3e565b5b6139e784828561492f565b509392505050565b6000613a026139fd84614694565b61463e565b905082815260208101848484011115613a1e57613a1d614b3e565b5b613a2984828561492f565b509392505050565b600081359050613a4081614efb565b92915050565b600081359050613a5581614f12565b92915050565b600081359050613a6a81614f29565b92915050565b600081519050613a7f81614f29565b92915050565b600081359050613a9481614f40565b92915050565b600081519050613aa981614f40565b92915050565b600082601f830112613ac457613ac3614b39565b5b8135613ad48482602086016139ad565b91505092915050565b600081359050613aec81614f57565b92915050565b600082601f830112613b0757613b06614b39565b5b8135613b178482602086016139ef565b91505092915050565b600081359050613b2f81614f6e565b92915050565b600081519050613b4481614f6e565b92915050565b600060208284031215613b6057613b5f614b48565b5b6000613b6e84828501613a31565b91505092915050565b600060208284031215613b8d57613b8c614b48565b5b6000613b9b84828501613a46565b91505092915050565b60008060408385031215613bbb57613bba614b48565b5b6000613bc985828601613a31565b9250506020613bda85828601613a31565b9150509250929050565b600080600060608486031215613bfd57613bfc614b48565b5b6000613c0b86828701613a31565b9350506020613c1c86828701613a31565b9250506040613c2d86828701613b20565b9150509250925092565b60008060008060808587031215613c5157613c50614b48565b5b6000613c5f87828801613a31565b9450506020613c7087828801613a31565b9350506040613c8187828801613b20565b925050606085013567ffffffffffffffff811115613ca257613ca1614b43565b5b613cae87828801613aaf565b91505092959194509250565b60008060408385031215613cd157613cd0614b48565b5b6000613cdf85828601613a31565b9250506020613cf085828601613a5b565b9150509250929050565b60008060408385031215613d1157613d10614b48565b5b6000613d1f85828601613a31565b9250506020613d3085828601613b20565b9150509250929050565b600060208284031215613d5057613d4f614b48565b5b6000613d5e84828501613a70565b91505092915050565b600060208284031215613d7d57613d7c614b48565b5b6000613d8b84828501613a85565b91505092915050565b600060208284031215613daa57613da9614b48565b5b6000613db884828501613a9a565b91505092915050565b600060208284031215613dd757613dd6614b48565b5b6000613de584828501613add565b91505092915050565b60008060408385031215613e0557613e04614b48565b5b6000613e1385828601613add565b9250506020613e2485828601613a31565b9150509250929050565b600060208284031215613e4457613e43614b48565b5b600082013567ffffffffffffffff811115613e6257613e61614b43565b5b613e6e84828501613af2565b91505092915050565b600060208284031215613e8d57613e8c614b48565b5b6000613e9b84828501613b20565b91505092915050565b600060208284031215613eba57613eb9614b48565b5b6000613ec884828501613b35565b91505092915050565b6000613edd838361429b565b60208301905092915050565b613ef2816148f9565b82525050565b613f0181614861565b82525050565b6000613f12826146d5565b613f1c8185614703565b9350613f27836146c5565b8060005b83811015613f58578151613f3f8882613ed1565b9750613f4a836146f6565b925050600181019050613f2b565b5085935050505092915050565b613f6e81614885565b82525050565b6000613f7f826146e0565b613f898185614714565b9350613f9981856020860161493e565b613fa281614b4d565b840191505092915050565b6000613fb8826146e0565b613fc28185614725565b9350613fd281856020860161493e565b80840191505092915050565b6000613fe9826146eb565b613ff38185614730565b935061400381856020860161493e565b61400c81614b4d565b840191505092915050565b6000614022826146eb565b61402c8185614741565b935061403c81856020860161493e565b80840191505092915050565b6000614055602683614730565b915061406082614b5e565b604082019050919050565b6000614078601583614730565b915061408382614bad565b602082019050919050565b600061409b602683614730565b91506140a682614bd6565b604082019050919050565b60006140be600f83614730565b91506140c982614c25565b602082019050919050565b60006140e1603a83614730565b91506140ec82614c4e565b604082019050919050565b6000614104601d83614730565b915061410f82614c9d565b602082019050919050565b6000614127602683614730565b915061413282614cc6565b604082019050919050565b600061414a602b83614730565b915061415582614d15565b604082019050919050565b600061416d600883614730565b915061417882614d64565b602082019050919050565b6000614190600583614741565b915061419b82614d8d565b600582019050919050565b60006141b3600d83614730565b91506141be82614db6565b602082019050919050565b60006141d6602083614730565b91506141e182614ddf565b602082019050919050565b60006141f9602483614730565b915061420482614e08565b604082019050919050565b600061421c600083614725565b915061422782614e57565b600082019050919050565b600061423f601d83614730565b915061424a82614e5a565b602082019050919050565b6000614262602a83614730565b915061426d82614e83565b604082019050919050565b6000614285601f83614730565b915061429082614ed2565b602082019050919050565b6142a4816148ef565b82525050565b6142b3816148ef565b82525050565b60006142c58284613fad565b915081905092915050565b60006142dc8285614017565b91506142e88284614017565b91508190509392505050565b60006143008284614017565b915061430b82614183565b915081905092915050565b60006143218261420f565b9150819050919050565b60006020820190506143406000830184613ef8565b92915050565b600060408201905061435b6000830185613ee9565b61436860208301846142aa565b9392505050565b60006080820190506143846000830187613ef8565b6143916020830186613ef8565b61439e60408301856142aa565b81810360608301526143b08184613f74565b905095945050505050565b60006040820190506143d06000830185613ef8565b6143dd60208301846142aa565b9392505050565b600060208201905081810360008301526143fe8184613f07565b905092915050565b600060208201905061441b6000830184613f65565b92915050565b6000602082019050818103600083015261443b8184613fde565b905092915050565b6000602082019050818103600083015261445c81614048565b9050919050565b6000602082019050818103600083015261447c8161406b565b9050919050565b6000602082019050818103600083015261449c8161408e565b9050919050565b600060208201905081810360008301526144bc816140b1565b9050919050565b600060208201905081810360008301526144dc816140d4565b9050919050565b600060208201905081810360008301526144fc816140f7565b9050919050565b6000602082019050818103600083015261451c8161411a565b9050919050565b6000602082019050818103600083015261453c8161413d565b9050919050565b6000602082019050818103600083015261455c81614160565b9050919050565b6000602082019050818103600083015261457c816141a6565b9050919050565b6000602082019050818103600083015261459c816141c9565b9050919050565b600060208201905081810360008301526145bc816141ec565b9050919050565b600060208201905081810360008301526145dc81614232565b9050919050565b600060208201905081810360008301526145fc81614255565b9050919050565b6000602082019050818103600083015261461c81614278565b9050919050565b600060208201905061463860008301846142aa565b92915050565b6000614648614659565b905061465482826149a3565b919050565b6000604051905090565b600067ffffffffffffffff82111561467e5761467d614b0a565b5b61468782614b4d565b9050602081019050919050565b600067ffffffffffffffff8211156146af576146ae614b0a565b5b6146b882614b4d565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614757826148ef565b9150614762836148ef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561479757614796614a4e565b5b828201905092915050565b60006147ad826148ef565b91506147b8836148ef565b9250826147c8576147c7614a7d565b5b828204905092915050565b60006147de826148ef565b91506147e9836148ef565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561482257614821614a4e565b5b828202905092915050565b6000614838826148ef565b9150614843836148ef565b92508282101561485657614855614a4e565b5b828203905092915050565b600061486c826148cf565b9050919050565b600061487e826148cf565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006148c882614861565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006149048261490b565b9050919050565b60006149168261491d565b9050919050565b6000614928826148cf565b9050919050565b82818337600083830152505050565b60005b8381101561495c578082015181840152602081019050614941565b8381111561496b576000848401525b50505050565b6000600282049050600182168061498957607f821691505b6020821081141561499d5761499c614aac565b5b50919050565b6149ac82614b4d565b810181811067ffffffffffffffff821117156149cb576149ca614b0a565b5b80604052505050565b60006149df826148ef565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a1257614a11614a4e565b5b600182019050919050565b6000614a28826148ef565b9150614a33836148ef565b925082614a4357614a42614a7d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f494e434f52524543545f45544845525f56414c55450000000000000000000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4d455441444154415f4c4f434b45440000000000000000000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f534f4c445f4f5554000000000000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f53414c455f494e41435449564500000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7468697320776f756c6420657863656564206d696e74206d617820616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614f0481614861565b8114614f0f57600080fd5b50565b614f1b81614873565b8114614f2657600080fd5b50565b614f3281614885565b8114614f3d57600080fd5b50565b614f4981614891565b8114614f5457600080fd5b50565b614f60816148bd565b8114614f6b57600080fd5b50565b614f77816148ef565b8114614f8257600080fd5b5056fea26469706673582212206bd6054d8d0a86081b2e7c09f5ee777033dac47bd35961770b3e155fc061389864736f6c63430008070033
Deployed Bytecode Sourcemap
108717:3681:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104323:40;104339:12;:10;:12::i;:::-;104353:9;104323:40;;;;;;;:::i;:::-;;;;;;;;108717:3681;;;;;76858:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110453:138;;;;;;;;;;;;;:::i;:::-;;79971:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81474:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81037:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76107:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106109:566;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82339:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108948:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104454:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105583:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82580:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109648:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106943:641;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;110932:73;;;;;;;;;;;;;:::i;:::-;;111840:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111015:712;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79779:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108826:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77227:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110709:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66981:103;;;;;;;;;;;;;:::i;:::-;;105809:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66330:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80140:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108872:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105305:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110827:75;;;;;;;;;;;;;:::i;:::-;;109870:573;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81750:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109202:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82836:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111735:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112120:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105101:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109385:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108909:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104891:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104639:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82108:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109161:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67239:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;110599:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34129:98;34182:7;34209:10;34202:17;;34129:98;:::o;76858:305::-;76960:4;77012:25;76997:40;;;:11;:40;;;;:105;;;;77069:33;77054:48;;;:11;:48;;;;76997:105;:158;;;;77119:36;77143:11;77119:23;:36::i;:::-;76997:158;76977:178;;76858:305;;;:::o;110453:138::-;66561:12;:10;:12::i;:::-;66550:23;;:7;:5;:7::i;:::-;:23;;;66542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;110527:12:::1;;;;;;;;;;;110526:13;110511:12;;:28;;;;;;;;;;;;;;;;;;110555;110570:12;;;;;;;;;;;110555:28;;;;;;:::i;:::-;;;;;;;;110453:138::o:0;79971:100::-;80025:13;80058:5;80051:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79971:100;:::o;81474:204::-;81542:7;81567:16;81575:7;81567;:16::i;:::-;81562:64;;81592:34;;;;;;;;;;;;;;81562:64;81646:15;:24;81662:7;81646:24;;;;;;;;;;;;;;;;;;;;;81639:31;;81474:204;;;:::o;81037:371::-;81110:13;81126:24;81142:7;81126:15;:24::i;:::-;81110:40;;81171:5;81165:11;;:2;:11;;;81161:48;;;81185:24;;;;;;;;;;;;;;81161:48;81242:5;81226:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;81252:37;81269:5;81276:12;:10;:12::i;:::-;81252:16;:37::i;:::-;81251:38;81226:63;81222:138;;;81313:35;;;;;;;;;;;;;;81222:138;81372:28;81381:2;81385:7;81394:5;81372:8;:28::i;:::-;81099:309;81037:371;;:::o;76107:303::-;76151:7;76376:15;:13;:15::i;:::-;76361:12;;76345:13;;:28;:46;76338:53;;76107:303;:::o;106109:566::-;106204:1;106185:7;:16;106193:7;106185:16;;;;;;;;;;;;;;;;:20;106177:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;106261:21;106309:15;:13;:15::i;:::-;106285:21;:39;;;;:::i;:::-;106261:63;;106335:15;106353:58;106369:7;106378:13;106393:17;106402:7;106393:8;:17::i;:::-;106353:15;:58::i;:::-;106335:76;;106443:1;106432:7;:12;;106424:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;106527:7;106505:9;:18;106515:7;106505:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;106563:7;106545:14;;:25;;;;;;;:::i;:::-;;;;;;;;106583:35;106601:7;106610;106583:17;:35::i;:::-;106634:33;106650:7;106659;106634:33;;;;;;;:::i;:::-;;;;;;;;106166:509;;106109:566;:::o;82339:170::-;82473:28;82483:4;82489:2;82493:7;82473:9;:28::i;:::-;82339:170;;;:::o;108948:140::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;104454:91::-;104498:7;104525:12;;104518:19;;104454:91;:::o;105583:135::-;105653:7;105680:14;:21;105695:5;105680:21;;;;;;;;;;;;;;;:30;105702:7;105680:30;;;;;;;;;;;;;;;;105673:37;;105583:135;;;;:::o;82580:185::-;82718:39;82735:4;82741:2;82745:7;82718:39;;;;;;;;;;;;:16;:39::i;:::-;82580:185;;;:::o;109648:212::-;66561:12;:10;:12::i;:::-;66550:23;;:7;:5;:7::i;:::-;:23;;;66542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;109774:9:::1;;109764:6;109748:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;109726:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;109830:22;109840:3;109845:6;109830:9;:22::i;:::-;109648:212:::0;;:::o;106943:641::-;107044:1;107025:7;:16;107033:7;107025:16;;;;;;;;;;;;;;;;:20;107017:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;107101:21;107158:20;107172:5;107158:13;:20::i;:::-;107125:5;:15;;;107149:4;107125:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;107101:77;;107189:15;107207:65;107223:7;107232:13;107247:24;107256:5;107263:7;107247:8;:24::i;:::-;107207:15;:65::i;:::-;107189:83;;107304:1;107293:7;:12;;107285:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;107400:7;107366:14;:21;107381:5;107366:21;;;;;;;;;;;;;;;:30;107388:7;107366:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;107448:7;107418:19;:26;107438:5;107418:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;107468:47;107491:5;107498:7;107507;107468:22;:47::i;:::-;107552:5;107531:45;;;107559:7;107568;107531:45;;;;;;;:::i;:::-;;;;;;;;107006:578;;106943:641;;:::o;110932:73::-;110969:28;110985:10;110969:7;:28::i;:::-;110932:73::o;111840:150::-;66561:12;:10;:12::i;:::-;66550:23;;:7;:5;:7::i;:::-;:23;;;66542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;111922:6:::1;;;;;;;;;;;111921:7;111913:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;111975:7;111959:13;:23;;;;;;;;;;;;:::i;:::-;;111840:150:::0;:::o;111015:712::-;111079:16;111125:18;111160:16;111170:5;111160:9;:16::i;:::-;111146:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111125:52;;111188:11;111202:13;;111188:27;;111226:19;111256:25;111297:9;111292:402;111312:3;111308:1;:7;111292:402;;;111337:31;111371:11;:14;111383:1;111371:14;;;;;;;;;;;111337:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111404:9;:16;;;111400:65;;;111441:8;;;111400:65;111509:1;111483:28;;:9;:14;;;:28;;;111479:103;;111552:9;:14;;;111532:34;;111479:103;111621:5;111600:26;;:17;:26;;;111596:87;;;111666:1;111647;111649:13;;;;;;111647:16;;;;;;;;:::i;:::-;;;;;;;:20;;;;;111596:87;111322:372;111292:402;111317:3;;;;;;;111292:402;;;;111711:1;111704:8;;;;;;111015:712;;;:::o;79779:125::-;79843:7;79870:21;79883:7;79870:12;:21::i;:::-;:26;;;79863:33;;79779:125;;;:::o;108826:39::-;;;;:::o;77227:206::-;77291:7;77332:1;77315:19;;:5;:19;;;77311:60;;;77343:28;;;;;;;;;;;;;;77311:60;77397:12;:19;77410:5;77397:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;77389:36;;77382:43;;77227:206;;;:::o;110709:110::-;66561:12;:10;:12::i;:::-;66550:23;;:7;:5;:7::i;:::-;:23;;;66542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;110799:12:::1;110785:11;:26;;;;110709:110:::0;:::o;66981:103::-;66561:12;:10;:12::i;:::-;66550:23;;:7;:5;:7::i;:::-;:23;;;66542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67046:30:::1;67073:1;67046:18;:30::i;:::-;66981:103::o:0;105809:100::-;105860:7;105887;105895:5;105887:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;105880:21;;105809:100;;;:::o;66330:87::-;66376:7;66403:6;;;;;;;;;;;66396:13;;66330:87;:::o;80140:104::-;80196:13;80229:7;80222:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80140:104;:::o;108872:30::-;;;;:::o;105305:109::-;105361:7;105388:9;:18;105398:7;105388:18;;;;;;;;;;;;;;;;105381:25;;105305:109;;;:::o;110827:75::-;66561:12;:10;:12::i;:::-;66550:23;;:7;:5;:7::i;:::-;:23;;;66542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;110890:4:::1;110881:6;;:13;;;;;;;;;;;;;;;;;;110827:75::o:0;109870:573::-;71715:1;72313:7;;:19;;72305:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;71715:1;72446:7;:18;;;;109949:12:::1;;;;;;;;;;;109941:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;110047:11;;110034:6;110000:19;:31;110020:10;110000:31;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;109998:60;;109990:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;110161:9;;110151:6;110135:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;110113:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;110263:9;110253:6;110241:9;;:18;;;;:::i;:::-;:31;;110219:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;110342:29;110352:10;110364:6;110342:9;:29::i;:::-;110425:6;110390:19;:31;110410:10;110390:31;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;71671:1:::0;72625:7;:22;;;;109870:573;:::o;81750:287::-;81861:12;:10;:12::i;:::-;81849:24;;:8;:24;;;81845:54;;;81882:17;;;;;;;;;;;;;;81845:54;81957:8;81912:18;:32;81931:12;:10;:12::i;:::-;81912:32;;;;;;;;;;;;;;;:42;81945:8;81912:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;82010:8;81981:48;;81996:12;:10;:12::i;:::-;81981:48;;;82020:8;81981:48;;;;;;:::i;:::-;;;;;;;;81750:287;;:::o;109202:51::-;;;;;;;;;;;;;;;;;:::o;82836:369::-;83003:28;83013:4;83019:2;83023:7;83003:9;:28::i;:::-;83046:15;:2;:13;;;:15::i;:::-;:76;;;;;83066:56;83097:4;83103:2;83107:7;83116:5;83066:30;:56::i;:::-;83065:57;83046:76;83042:156;;;83146:40;;;;;;;;;;;;;;83042:156;82836:369;;;;:::o;111735:97::-;111784:7;111811:13;:11;:13::i;:::-;111804:20;;111735:97;:::o;112120:163::-;112185:13;112241:23;112256:7;112241:14;:23::i;:::-;112224:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;112210:65;;112120:163;;;:::o;105101:105::-;105155:7;105182;:16;105190:7;105182:16;;;;;;;;;;;;;;;;105175:23;;105101:105;;;:::o;109385:18::-;;;;;;;;;;;;;:::o;108909:30::-;;;;:::o;104891:119::-;104949:7;104976:19;:26;104996:5;104976:26;;;;;;;;;;;;;;;;104969:33;;104891:119;;;:::o;104639:95::-;104685:7;104712:14;;104705:21;;104639:95;:::o;82108:164::-;82205:4;82229:18;:25;82248:5;82229:25;;;;;;;;;;;;;;;:35;82255:8;82229:35;;;;;;;;;;;;;;;;;;;;;;;;;82222:42;;82108:164;;;;:::o;109161:32::-;;;;;;;;;;;;;:::o;67239:201::-;66561:12;:10;:12::i;:::-;66550:23;;:7;:5;:7::i;:::-;:23;;;66542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67348:1:::1;67328:22;;:8;:22;;;;67320:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;67404:28;67423:8;67404:18;:28::i;:::-;67239:201:::0;:::o;110599:102::-;66561:12;:10;:12::i;:::-;66550:23;;:7;:5;:7::i;:::-;:23;;;66542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;110683:10:::1;110671:9;:22;;;;110599:102:::0;:::o;37086:157::-;37171:4;37210:25;37195:40;;;:11;:40;;;;37188:47;;37086:157;;;:::o;83460:187::-;83517:4;83560:7;83541:15;:13;:15::i;:::-;:26;;:53;;;;;83581:13;;83571:7;:23;83541:53;:98;;;;;83612:11;:20;83624:7;83612:20;;;;;;;;;;;:27;;;;;;;;;;;;83611:28;83541:98;83534:105;;83460:187;;;:::o;91630:196::-;91772:2;91745:15;:24;91761:7;91745:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;91810:7;91806:2;91790:28;;91799:5;91790:28;;;;;;;;;;;;91630:196;;;:::o;112291:100::-;112356:7;112382:1;112375:8;;112291:100;:::o;107762:248::-;107908:7;107987:15;107972:12;;107952:7;:16;107960:7;107952:16;;;;;;;;;;;;;;;;107936:13;:32;;;;:::i;:::-;107935:49;;;;:::i;:::-;:67;;;;:::i;:::-;107928:74;;107762:248;;;;;:::o;27551:317::-;27666:6;27641:21;:31;;27633:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27720:12;27738:9;:14;;27760:6;27738:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27719:52;;;27790:7;27782:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;27622:246;27551:317;;:::o;86573:2130::-;86688:35;86726:21;86739:7;86726:12;:21::i;:::-;86688:59;;86786:4;86764:26;;:13;:18;;;:26;;;86760:67;;86799:28;;;;;;;;;;;;;;86760:67;86840:22;86882:4;86866:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;86903:36;86920:4;86926:12;:10;:12::i;:::-;86903:16;:36::i;:::-;86866:73;:126;;;;86980:12;:10;:12::i;:::-;86956:36;;:20;86968:7;86956:11;:20::i;:::-;:36;;;86866:126;86840:153;;87011:17;87006:66;;87037:35;;;;;;;;;;;;;;87006:66;87101:1;87087:16;;:2;:16;;;87083:52;;;87112:23;;;;;;;;;;;;;;87083:52;87148:43;87170:4;87176:2;87180:7;87189:1;87148:21;:43::i;:::-;87256:35;87273:1;87277:7;87286:4;87256:8;:35::i;:::-;87617:1;87587:12;:18;87600:4;87587:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87661:1;87633:12;:16;87646:2;87633:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87679:31;87713:11;:20;87725:7;87713:20;;;;;;;;;;;87679:54;;87764:2;87748:8;:13;;;:18;;;;;;;;;;;;;;;;;;87814:15;87781:8;:23;;;:49;;;;;;;;;;;;;;;;;;88082:19;88114:1;88104:7;:11;88082:33;;88130:31;88164:11;:24;88176:11;88164:24;;;;;;;;;;;88130:58;;88232:1;88207:27;;:8;:13;;;;;;;;;;;;:27;;;88203:384;;;88417:13;;88402:11;:28;88398:174;;88471:4;88455:8;:13;;;:20;;;;;;;;;;;;;;;;;;88524:13;:28;;;88498:8;:23;;;:54;;;;;;;;;;;;;;;;;;88398:174;88203:384;87562:1036;;;88634:7;88630:2;88615:27;;88624:4;88615:27;;;;;;;;;;;;88653:42;88674:4;88680:2;88684:7;88693:1;88653:20;:42::i;:::-;86677:2026;;86573:2130;;;:::o;83655:104::-;83724:27;83734:2;83738:8;83724:27;;;;;;;;;;;;:9;:27::i;:::-;83655:104;;:::o;97915:211::-;98032:86;98052:5;98082:23;;;98107:2;98111:5;98059:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98032:19;:86::i;:::-;97915:211;;;:::o;78608:1109::-;78670:21;;:::i;:::-;78704:12;78719:7;78704:22;;78787:4;78768:15;:13;:15::i;:::-;:23;;:47;;;;;78802:13;;78795:4;:20;78768:47;78764:886;;;78836:31;78870:11;:17;78882:4;78870:17;;;;;;;;;;;78836:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78911:9;:16;;;78906:729;;78982:1;78956:28;;:9;:14;;;:28;;;78952:101;;79020:9;79013:16;;;;;;78952:101;79355:261;79362:4;79355:261;;;79395:6;;;;;;;;79440:11;:17;79452:4;79440:17;;;;;;;;;;;79428:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79514:1;79488:28;;:9;:14;;;:28;;;79484:109;;79556:9;79549:16;;;;;;79484:109;79355:261;;;78906:729;78817:833;78764:886;79678:31;;;;;;;;;;;;;;78608:1109;;;;:::o;67600:191::-;67674:16;67693:6;;;;;;;;;;;67674:25;;67719:8;67710:6;;:17;;;;;;;;;;;;;;;;;;67774:8;67743:40;;67764:8;67743:40;;;;;;;;;;;;67663:128;67600:191;:::o;26229:387::-;26289:4;26497:12;26564:7;26552:20;26544:28;;26607:1;26600:4;:8;26593:15;;;26229:387;;;:::o;92318:667::-;92481:4;92518:2;92502:36;;;92539:12;:10;:12::i;:::-;92553:4;92559:7;92568:5;92502:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;92498:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92753:1;92736:6;:13;:18;92732:235;;;92782:40;;;;;;;;;;;;;;92732:235;92925:6;92919:13;92910:6;92906:2;92902:15;92895:38;92498:480;92631:45;;;92621:55;;;:6;:55;;;;92614:62;;;92318:667;;;;;;:::o;80315:318::-;80388:13;80419:16;80427:7;80419;:16::i;:::-;80414:59;;80444:29;;;;;;;;;;;;;;80414:59;80486:21;80510:10;:8;:10::i;:::-;80486:34;;80563:1;80544:7;80538:21;:26;;:87;;;;;;;;;;;;;;;;;80591:7;80600:18;:7;:16;:18::i;:::-;80574:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80538:87;80531:94;;;80315:318;;;:::o;93633:159::-;;;;;:::o;94451:158::-;;;;;:::o;84122:163::-;84245:32;84251:2;84255:8;84265:5;84272:4;84245:5;:32::i;:::-;84122:163;;;:::o;100488:716::-;100912:23;100938:69;100966:4;100938:69;;;;;;;;;;;;;;;;;100946:5;100938:27;;;;:69;;;;;:::i;:::-;100912:95;;101042:1;101022:10;:17;:21;101018:179;;;101119:10;101108:30;;;;;;;;;;;;:::i;:::-;101100:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;101018:179;100558:646;100488:716;;:::o;111998:114::-;112058:13;112091;112084:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111998:114;:::o;34598:723::-;34654:13;34884:1;34875:5;:10;34871:53;;;34902:10;;;;;;;;;;;;;;;;;;;;;34871:53;34934:12;34949:5;34934:20;;34965:14;34990:78;35005:1;34997:4;:9;34990:78;;35023:8;;;;;:::i;:::-;;;;35054:2;35046:10;;;;;:::i;:::-;;;34990:78;;;35078:19;35110:6;35100:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35078:39;;35128:154;35144:1;35135:5;:10;35128:154;;35172:1;35162:11;;;;;:::i;:::-;;;35239:2;35231:5;:10;;;;:::i;:::-;35218:2;:24;;;;:::i;:::-;35205:39;;35188:6;35195;35188:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;35268:2;35259:11;;;;;:::i;:::-;;;35128:154;;;35306:6;35292:21;;;;;34598:723;;;;:::o;84544:1775::-;84683:20;84706:13;;84683:36;;84748:1;84734:16;;:2;:16;;;84730:48;;;84759:19;;;;;;;;;;;;;;84730:48;84805:1;84793:8;:13;84789:44;;;84815:18;;;;;;;;;;;;;;84789:44;84846:61;84876:1;84880:2;84884:12;84898:8;84846:21;:61::i;:::-;85219:8;85184:12;:16;85197:2;85184:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85283:8;85243:12;:16;85256:2;85243:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85342:2;85309:11;:25;85321:12;85309:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;85409:15;85359:11;:25;85371:12;85359:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;85442:20;85465:12;85442:35;;85492:11;85521:8;85506:12;:23;85492:37;;85550:4;:23;;;;;85558:15;:2;:13;;;:15::i;:::-;85550:23;85546:641;;;85594:314;85650:12;85646:2;85625:38;;85642:1;85625:38;;;;;;;;;;;;85691:69;85730:1;85734:2;85738:14;;;;;;85754:5;85691:30;:69::i;:::-;85686:174;;85796:40;;;;;;;;;;;;;;85686:174;85903:3;85887:12;:19;;85594:314;;85989:12;85972:13;;:29;85968:43;;86003:8;;;85968:43;85546:641;;;86052:120;86108:14;;;;;;86104:2;86083:40;;86100:1;86083:40;;;;;;;;;;;;86167:3;86151:12;:19;;86052:120;;85546:641;86217:12;86201:13;:28;;;;85159:1082;;86251:60;86280:1;86284:2;86288:12;86302:8;86251:20;:60::i;:::-;84672:1647;84544:1775;;;;:::o;29035:229::-;29172:12;29204:52;29226:6;29234:4;29240:1;29243:12;29204:21;:52::i;:::-;29197:59;;29035:229;;;;;:::o;30155:510::-;30325:12;30383:5;30358:21;:30;;30350:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30450:18;30461:6;30450:10;:18::i;:::-;30442:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;30516:12;30530:23;30557:6;:11;;30576:5;30583:4;30557:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30515:73;;;;30606:51;30623:7;30632:10;30644:12;30606:16;:51::i;:::-;30599:58;;;;30155:510;;;;;;:::o;32841:712::-;32991:12;33020:7;33016:530;;;33051:10;33044:17;;;;33016:530;33185:1;33165:10;:17;:21;33161:374;;;33363:10;33357:17;33424:15;33411:10;33407:2;33403:19;33396:44;33161:374;33506:12;33499:20;;;;;;;;;;;:::i;:::-;;;;;;;;32841:712;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:137::-;1340:5;1371:6;1365:13;1356:22;;1387:30;1411:5;1387:30;:::i;:::-;1286:137;;;;:::o;1429:::-;1474:5;1512:6;1499:20;1490:29;;1528:32;1554:5;1528:32;:::i;:::-;1429:137;;;;:::o;1572:141::-;1628:5;1659:6;1653:13;1644:22;;1675:32;1701:5;1675:32;:::i;:::-;1572:141;;;;:::o;1732:338::-;1787:5;1836:3;1829:4;1821:6;1817:17;1813:27;1803:122;;1844:79;;:::i;:::-;1803:122;1961:6;1948:20;1986:78;2060:3;2052:6;2045:4;2037:6;2033:17;1986:78;:::i;:::-;1977:87;;1793:277;1732:338;;;;:::o;2076:169::-;2137:5;2175:6;2162:20;2153:29;;2191:48;2233:5;2191:48;:::i;:::-;2076:169;;;;:::o;2265:340::-;2321:5;2370:3;2363:4;2355:6;2351:17;2347:27;2337:122;;2378:79;;:::i;:::-;2337:122;2495:6;2482:20;2520:79;2595:3;2587:6;2580:4;2572:6;2568:17;2520:79;:::i;:::-;2511:88;;2327:278;2265:340;;;;:::o;2611:139::-;2657:5;2695:6;2682:20;2673:29;;2711:33;2738:5;2711:33;:::i;:::-;2611:139;;;;:::o;2756:143::-;2813:5;2844:6;2838:13;2829:22;;2860:33;2887:5;2860:33;:::i;:::-;2756:143;;;;:::o;2905:329::-;2964:6;3013:2;3001:9;2992:7;2988:23;2984:32;2981:119;;;3019:79;;:::i;:::-;2981:119;3139:1;3164:53;3209:7;3200:6;3189:9;3185:22;3164:53;:::i;:::-;3154:63;;3110:117;2905:329;;;;:::o;3240:345::-;3307:6;3356:2;3344:9;3335:7;3331:23;3327:32;3324:119;;;3362:79;;:::i;:::-;3324:119;3482:1;3507:61;3560:7;3551:6;3540:9;3536:22;3507:61;:::i;:::-;3497:71;;3453:125;3240:345;;;;:::o;3591:474::-;3659:6;3667;3716:2;3704:9;3695:7;3691:23;3687:32;3684:119;;;3722:79;;:::i;:::-;3684:119;3842:1;3867:53;3912:7;3903:6;3892:9;3888:22;3867:53;:::i;:::-;3857:63;;3813:117;3969:2;3995:53;4040:7;4031:6;4020:9;4016:22;3995:53;:::i;:::-;3985:63;;3940:118;3591:474;;;;;:::o;4071:619::-;4148:6;4156;4164;4213:2;4201:9;4192:7;4188:23;4184:32;4181:119;;;4219:79;;:::i;:::-;4181:119;4339:1;4364:53;4409:7;4400:6;4389:9;4385:22;4364:53;:::i;:::-;4354:63;;4310:117;4466:2;4492:53;4537:7;4528:6;4517:9;4513:22;4492:53;:::i;:::-;4482:63;;4437:118;4594:2;4620:53;4665:7;4656:6;4645:9;4641:22;4620:53;:::i;:::-;4610:63;;4565:118;4071:619;;;;;:::o;4696:943::-;4791:6;4799;4807;4815;4864:3;4852:9;4843:7;4839:23;4835:33;4832:120;;;4871:79;;:::i;:::-;4832:120;4991:1;5016:53;5061:7;5052:6;5041:9;5037:22;5016:53;:::i;:::-;5006:63;;4962:117;5118:2;5144:53;5189:7;5180:6;5169:9;5165:22;5144:53;:::i;:::-;5134:63;;5089:118;5246:2;5272:53;5317:7;5308:6;5297:9;5293:22;5272:53;:::i;:::-;5262:63;;5217:118;5402:2;5391:9;5387:18;5374:32;5433:18;5425:6;5422:30;5419:117;;;5455:79;;:::i;:::-;5419:117;5560:62;5614:7;5605:6;5594:9;5590:22;5560:62;:::i;:::-;5550:72;;5345:287;4696:943;;;;;;;:::o;5645:468::-;5710:6;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:50;6088:7;6079:6;6068:9;6064:22;6046:50;:::i;:::-;6036:60;;5991:115;5645:468;;;;;:::o;6119:474::-;6187:6;6195;6244:2;6232:9;6223:7;6219:23;6215:32;6212:119;;;6250:79;;:::i;:::-;6212:119;6370:1;6395:53;6440:7;6431:6;6420:9;6416:22;6395:53;:::i;:::-;6385:63;;6341:117;6497:2;6523:53;6568:7;6559:6;6548:9;6544:22;6523:53;:::i;:::-;6513:63;;6468:118;6119:474;;;;;:::o;6599:345::-;6666:6;6715:2;6703:9;6694:7;6690:23;6686:32;6683:119;;;6721:79;;:::i;:::-;6683:119;6841:1;6866:61;6919:7;6910:6;6899:9;6895:22;6866:61;:::i;:::-;6856:71;;6812:125;6599:345;;;;:::o;6950:327::-;7008:6;7057:2;7045:9;7036:7;7032:23;7028:32;7025:119;;;7063:79;;:::i;:::-;7025:119;7183:1;7208:52;7252:7;7243:6;7232:9;7228:22;7208:52;:::i;:::-;7198:62;;7154:116;6950:327;;;;:::o;7283:349::-;7352:6;7401:2;7389:9;7380:7;7376:23;7372:32;7369:119;;;7407:79;;:::i;:::-;7369:119;7527:1;7552:63;7607:7;7598:6;7587:9;7583:22;7552:63;:::i;:::-;7542:73;;7498:127;7283:349;;;;:::o;7638:359::-;7712:6;7761:2;7749:9;7740:7;7736:23;7732:32;7729:119;;;7767:79;;:::i;:::-;7729:119;7887:1;7912:68;7972:7;7963:6;7952:9;7948:22;7912:68;:::i;:::-;7902:78;;7858:132;7638:359;;;;:::o;8003:504::-;8086:6;8094;8143:2;8131:9;8122:7;8118:23;8114:32;8111:119;;;8149:79;;:::i;:::-;8111:119;8269:1;8294:68;8354:7;8345:6;8334:9;8330:22;8294:68;:::i;:::-;8284:78;;8240:132;8411:2;8437:53;8482:7;8473:6;8462:9;8458:22;8437:53;:::i;:::-;8427:63;;8382:118;8003:504;;;;;:::o;8513:509::-;8582:6;8631:2;8619:9;8610:7;8606:23;8602:32;8599:119;;;8637:79;;:::i;:::-;8599:119;8785:1;8774:9;8770:17;8757:31;8815:18;8807:6;8804:30;8801:117;;;8837:79;;:::i;:::-;8801:117;8942:63;8997:7;8988:6;8977:9;8973:22;8942:63;:::i;:::-;8932:73;;8728:287;8513:509;;;;:::o;9028:329::-;9087:6;9136:2;9124:9;9115:7;9111:23;9107:32;9104:119;;;9142:79;;:::i;:::-;9104:119;9262:1;9287:53;9332:7;9323:6;9312:9;9308:22;9287:53;:::i;:::-;9277:63;;9233:117;9028:329;;;;:::o;9363:351::-;9433:6;9482:2;9470:9;9461:7;9457:23;9453:32;9450:119;;;9488:79;;:::i;:::-;9450:119;9608:1;9633:64;9689:7;9680:6;9669:9;9665:22;9633:64;:::i;:::-;9623:74;;9579:128;9363:351;;;;:::o;9720:179::-;9789:10;9810:46;9852:3;9844:6;9810:46;:::i;:::-;9888:4;9883:3;9879:14;9865:28;;9720:179;;;;:::o;9905:147::-;10000:45;10039:5;10000:45;:::i;:::-;9995:3;9988:58;9905:147;;:::o;10058:118::-;10145:24;10163:5;10145:24;:::i;:::-;10140:3;10133:37;10058:118;;:::o;10212:732::-;10331:3;10360:54;10408:5;10360:54;:::i;:::-;10430:86;10509:6;10504:3;10430:86;:::i;:::-;10423:93;;10540:56;10590:5;10540:56;:::i;:::-;10619:7;10650:1;10635:284;10660:6;10657:1;10654:13;10635:284;;;10736:6;10730:13;10763:63;10822:3;10807:13;10763:63;:::i;:::-;10756:70;;10849:60;10902:6;10849:60;:::i;:::-;10839:70;;10695:224;10682:1;10679;10675:9;10670:14;;10635:284;;;10639:14;10935:3;10928:10;;10336:608;;;10212:732;;;;:::o;10950:109::-;11031:21;11046:5;11031:21;:::i;:::-;11026:3;11019:34;10950:109;;:::o;11065:360::-;11151:3;11179:38;11211:5;11179:38;:::i;:::-;11233:70;11296:6;11291:3;11233:70;:::i;:::-;11226:77;;11312:52;11357:6;11352:3;11345:4;11338:5;11334:16;11312:52;:::i;:::-;11389:29;11411:6;11389:29;:::i;:::-;11384:3;11380:39;11373:46;;11155:270;11065:360;;;;:::o;11431:373::-;11535:3;11563:38;11595:5;11563:38;:::i;:::-;11617:88;11698:6;11693:3;11617:88;:::i;:::-;11610:95;;11714:52;11759:6;11754:3;11747:4;11740:5;11736:16;11714:52;:::i;:::-;11791:6;11786:3;11782:16;11775:23;;11539:265;11431:373;;;;:::o;11810:364::-;11898:3;11926:39;11959:5;11926:39;:::i;:::-;11981:71;12045:6;12040:3;11981:71;:::i;:::-;11974:78;;12061:52;12106:6;12101:3;12094:4;12087:5;12083:16;12061:52;:::i;:::-;12138:29;12160:6;12138:29;:::i;:::-;12133:3;12129:39;12122:46;;11902:272;11810:364;;;;:::o;12180:377::-;12286:3;12314:39;12347:5;12314:39;:::i;:::-;12369:89;12451:6;12446:3;12369:89;:::i;:::-;12362:96;;12467:52;12512:6;12507:3;12500:4;12493:5;12489:16;12467:52;:::i;:::-;12544:6;12539:3;12535:16;12528:23;;12290:267;12180:377;;;;:::o;12563:366::-;12705:3;12726:67;12790:2;12785:3;12726:67;:::i;:::-;12719:74;;12802:93;12891:3;12802:93;:::i;:::-;12920:2;12915:3;12911:12;12904:19;;12563:366;;;:::o;12935:::-;13077:3;13098:67;13162:2;13157:3;13098:67;:::i;:::-;13091:74;;13174:93;13263:3;13174:93;:::i;:::-;13292:2;13287:3;13283:12;13276:19;;12935:366;;;:::o;13307:::-;13449:3;13470:67;13534:2;13529:3;13470:67;:::i;:::-;13463:74;;13546:93;13635:3;13546:93;:::i;:::-;13664:2;13659:3;13655:12;13648:19;;13307:366;;;:::o;13679:::-;13821:3;13842:67;13906:2;13901:3;13842:67;:::i;:::-;13835:74;;13918:93;14007:3;13918:93;:::i;:::-;14036:2;14031:3;14027:12;14020:19;;13679:366;;;:::o;14051:::-;14193:3;14214:67;14278:2;14273:3;14214:67;:::i;:::-;14207:74;;14290:93;14379:3;14290:93;:::i;:::-;14408:2;14403:3;14399:12;14392:19;;14051:366;;;:::o;14423:::-;14565:3;14586:67;14650:2;14645:3;14586:67;:::i;:::-;14579:74;;14662:93;14751:3;14662:93;:::i;:::-;14780:2;14775:3;14771:12;14764:19;;14423:366;;;:::o;14795:::-;14937:3;14958:67;15022:2;15017:3;14958:67;:::i;:::-;14951:74;;15034:93;15123:3;15034:93;:::i;:::-;15152:2;15147:3;15143:12;15136:19;;14795:366;;;:::o;15167:::-;15309:3;15330:67;15394:2;15389:3;15330:67;:::i;:::-;15323:74;;15406:93;15495:3;15406:93;:::i;:::-;15524:2;15519:3;15515:12;15508:19;;15167:366;;;:::o;15539:365::-;15681:3;15702:66;15766:1;15761:3;15702:66;:::i;:::-;15695:73;;15777:93;15866:3;15777:93;:::i;:::-;15895:2;15890:3;15886:12;15879:19;;15539:365;;;:::o;15910:400::-;16070:3;16091:84;16173:1;16168:3;16091:84;:::i;:::-;16084:91;;16184:93;16273:3;16184:93;:::i;:::-;16302:1;16297:3;16293:11;16286:18;;15910:400;;;:::o;16316:366::-;16458:3;16479:67;16543:2;16538:3;16479:67;:::i;:::-;16472:74;;16555:93;16644:3;16555:93;:::i;:::-;16673:2;16668:3;16664:12;16657:19;;16316:366;;;:::o;16688:::-;16830:3;16851:67;16915:2;16910:3;16851:67;:::i;:::-;16844:74;;16927:93;17016:3;16927:93;:::i;:::-;17045:2;17040:3;17036:12;17029:19;;16688:366;;;:::o;17060:::-;17202:3;17223:67;17287:2;17282:3;17223:67;:::i;:::-;17216:74;;17299:93;17388:3;17299:93;:::i;:::-;17417:2;17412:3;17408:12;17401:19;;17060:366;;;:::o;17432:398::-;17591:3;17612:83;17693:1;17688:3;17612:83;:::i;:::-;17605:90;;17704:93;17793:3;17704:93;:::i;:::-;17822:1;17817:3;17813:11;17806:18;;17432:398;;;:::o;17836:366::-;17978:3;17999:67;18063:2;18058:3;17999:67;:::i;:::-;17992:74;;18075:93;18164:3;18075:93;:::i;:::-;18193:2;18188:3;18184:12;18177:19;;17836:366;;;:::o;18208:::-;18350:3;18371:67;18435:2;18430:3;18371:67;:::i;:::-;18364:74;;18447:93;18536:3;18447:93;:::i;:::-;18565:2;18560:3;18556:12;18549:19;;18208:366;;;:::o;18580:::-;18722:3;18743:67;18807:2;18802:3;18743:67;:::i;:::-;18736:74;;18819:93;18908:3;18819:93;:::i;:::-;18937:2;18932:3;18928:12;18921:19;;18580:366;;;:::o;18952:108::-;19029:24;19047:5;19029:24;:::i;:::-;19024:3;19017:37;18952:108;;:::o;19066:118::-;19153:24;19171:5;19153:24;:::i;:::-;19148:3;19141:37;19066:118;;:::o;19190:271::-;19320:3;19342:93;19431:3;19422:6;19342:93;:::i;:::-;19335:100;;19452:3;19445:10;;19190:271;;;;:::o;19467:435::-;19647:3;19669:95;19760:3;19751:6;19669:95;:::i;:::-;19662:102;;19781:95;19872:3;19863:6;19781:95;:::i;:::-;19774:102;;19893:3;19886:10;;19467:435;;;;;:::o;19908:541::-;20141:3;20163:95;20254:3;20245:6;20163:95;:::i;:::-;20156:102;;20275:148;20419:3;20275:148;:::i;:::-;20268:155;;20440:3;20433:10;;19908:541;;;;:::o;20455:379::-;20639:3;20661:147;20804:3;20661:147;:::i;:::-;20654:154;;20825:3;20818:10;;20455:379;;;:::o;20840:222::-;20933:4;20971:2;20960:9;20956:18;20948:26;;20984:71;21052:1;21041:9;21037:17;21028:6;20984:71;:::i;:::-;20840:222;;;;:::o;21068:348::-;21197:4;21235:2;21224:9;21220:18;21212:26;;21248:79;21324:1;21313:9;21309:17;21300:6;21248:79;:::i;:::-;21337:72;21405:2;21394:9;21390:18;21381:6;21337:72;:::i;:::-;21068:348;;;;;:::o;21422:640::-;21617:4;21655:3;21644:9;21640:19;21632:27;;21669:71;21737:1;21726:9;21722:17;21713:6;21669:71;:::i;:::-;21750:72;21818:2;21807:9;21803:18;21794:6;21750:72;:::i;:::-;21832;21900:2;21889:9;21885:18;21876:6;21832:72;:::i;:::-;21951:9;21945:4;21941:20;21936:2;21925:9;21921:18;21914:48;21979:76;22050:4;22041:6;21979:76;:::i;:::-;21971:84;;21422:640;;;;;;;:::o;22068:332::-;22189:4;22227:2;22216:9;22212:18;22204:26;;22240:71;22308:1;22297:9;22293:17;22284:6;22240:71;:::i;:::-;22321:72;22389:2;22378:9;22374:18;22365:6;22321:72;:::i;:::-;22068:332;;;;;:::o;22406:373::-;22549:4;22587:2;22576:9;22572:18;22564:26;;22636:9;22630:4;22626:20;22622:1;22611:9;22607:17;22600:47;22664:108;22767:4;22758:6;22664:108;:::i;:::-;22656:116;;22406:373;;;;:::o;22785:210::-;22872:4;22910:2;22899:9;22895:18;22887:26;;22923:65;22985:1;22974:9;22970:17;22961:6;22923:65;:::i;:::-;22785:210;;;;:::o;23001:313::-;23114:4;23152:2;23141:9;23137:18;23129:26;;23201:9;23195:4;23191:20;23187:1;23176:9;23172:17;23165:47;23229:78;23302:4;23293:6;23229:78;:::i;:::-;23221:86;;23001:313;;;;:::o;23320:419::-;23486:4;23524:2;23513:9;23509:18;23501:26;;23573:9;23567:4;23563:20;23559:1;23548:9;23544:17;23537:47;23601:131;23727:4;23601:131;:::i;:::-;23593:139;;23320:419;;;:::o;23745:::-;23911:4;23949:2;23938:9;23934:18;23926:26;;23998:9;23992:4;23988:20;23984:1;23973:9;23969:17;23962:47;24026:131;24152:4;24026:131;:::i;:::-;24018:139;;23745:419;;;:::o;24170:::-;24336:4;24374:2;24363:9;24359:18;24351:26;;24423:9;24417:4;24413:20;24409:1;24398:9;24394:17;24387:47;24451:131;24577:4;24451:131;:::i;:::-;24443:139;;24170:419;;;:::o;24595:::-;24761:4;24799:2;24788:9;24784:18;24776:26;;24848:9;24842:4;24838:20;24834:1;24823:9;24819:17;24812:47;24876:131;25002:4;24876:131;:::i;:::-;24868:139;;24595:419;;;:::o;25020:::-;25186:4;25224:2;25213:9;25209:18;25201:26;;25273:9;25267:4;25263:20;25259:1;25248:9;25244:17;25237:47;25301:131;25427:4;25301:131;:::i;:::-;25293:139;;25020:419;;;:::o;25445:::-;25611:4;25649:2;25638:9;25634:18;25626:26;;25698:9;25692:4;25688:20;25684:1;25673:9;25669:17;25662:47;25726:131;25852:4;25726:131;:::i;:::-;25718:139;;25445:419;;;:::o;25870:::-;26036:4;26074:2;26063:9;26059:18;26051:26;;26123:9;26117:4;26113:20;26109:1;26098:9;26094:17;26087:47;26151:131;26277:4;26151:131;:::i;:::-;26143:139;;25870:419;;;:::o;26295:::-;26461:4;26499:2;26488:9;26484:18;26476:26;;26548:9;26542:4;26538:20;26534:1;26523:9;26519:17;26512:47;26576:131;26702:4;26576:131;:::i;:::-;26568:139;;26295:419;;;:::o;26720:::-;26886:4;26924:2;26913:9;26909:18;26901:26;;26973:9;26967:4;26963:20;26959:1;26948:9;26944:17;26937:47;27001:131;27127:4;27001:131;:::i;:::-;26993:139;;26720:419;;;:::o;27145:::-;27311:4;27349:2;27338:9;27334:18;27326:26;;27398:9;27392:4;27388:20;27384:1;27373:9;27369:17;27362:47;27426:131;27552:4;27426:131;:::i;:::-;27418:139;;27145:419;;;:::o;27570:::-;27736:4;27774:2;27763:9;27759:18;27751:26;;27823:9;27817:4;27813:20;27809:1;27798:9;27794:17;27787:47;27851:131;27977:4;27851:131;:::i;:::-;27843:139;;27570:419;;;:::o;27995:::-;28161:4;28199:2;28188:9;28184:18;28176:26;;28248:9;28242:4;28238:20;28234:1;28223:9;28219:17;28212:47;28276:131;28402:4;28276:131;:::i;:::-;28268:139;;27995:419;;;:::o;28420:::-;28586:4;28624:2;28613:9;28609:18;28601:26;;28673:9;28667:4;28663:20;28659:1;28648:9;28644:17;28637:47;28701:131;28827:4;28701:131;:::i;:::-;28693:139;;28420:419;;;:::o;28845:::-;29011:4;29049:2;29038:9;29034:18;29026:26;;29098:9;29092:4;29088:20;29084:1;29073:9;29069:17;29062:47;29126:131;29252:4;29126:131;:::i;:::-;29118:139;;28845:419;;;:::o;29270:::-;29436:4;29474:2;29463:9;29459:18;29451:26;;29523:9;29517:4;29513:20;29509:1;29498:9;29494:17;29487:47;29551:131;29677:4;29551:131;:::i;:::-;29543:139;;29270:419;;;:::o;29695:222::-;29788:4;29826:2;29815:9;29811:18;29803:26;;29839:71;29907:1;29896:9;29892:17;29883:6;29839:71;:::i;:::-;29695:222;;;;:::o;29923:129::-;29957:6;29984:20;;:::i;:::-;29974:30;;30013:33;30041:4;30033:6;30013:33;:::i;:::-;29923:129;;;:::o;30058:75::-;30091:6;30124:2;30118:9;30108:19;;30058:75;:::o;30139:307::-;30200:4;30290:18;30282:6;30279:30;30276:56;;;30312:18;;:::i;:::-;30276:56;30350:29;30372:6;30350:29;:::i;:::-;30342:37;;30434:4;30428;30424:15;30416:23;;30139:307;;;:::o;30452:308::-;30514:4;30604:18;30596:6;30593:30;30590:56;;;30626:18;;:::i;:::-;30590:56;30664:29;30686:6;30664:29;:::i;:::-;30656:37;;30748:4;30742;30738:15;30730:23;;30452:308;;;:::o;30766:132::-;30833:4;30856:3;30848:11;;30886:4;30881:3;30877:14;30869:22;;30766:132;;;:::o;30904:114::-;30971:6;31005:5;30999:12;30989:22;;30904:114;;;:::o;31024:98::-;31075:6;31109:5;31103:12;31093:22;;31024:98;;;:::o;31128:99::-;31180:6;31214:5;31208:12;31198:22;;31128:99;;;:::o;31233:113::-;31303:4;31335;31330:3;31326:14;31318:22;;31233:113;;;:::o;31352:184::-;31451:11;31485:6;31480:3;31473:19;31525:4;31520:3;31516:14;31501:29;;31352:184;;;;:::o;31542:168::-;31625:11;31659:6;31654:3;31647:19;31699:4;31694:3;31690:14;31675:29;;31542:168;;;;:::o;31716:147::-;31817:11;31854:3;31839:18;;31716:147;;;;:::o;31869:169::-;31953:11;31987:6;31982:3;31975:19;32027:4;32022:3;32018:14;32003:29;;31869:169;;;;:::o;32044:148::-;32146:11;32183:3;32168:18;;32044:148;;;;:::o;32198:305::-;32238:3;32257:20;32275:1;32257:20;:::i;:::-;32252:25;;32291:20;32309:1;32291:20;:::i;:::-;32286:25;;32445:1;32377:66;32373:74;32370:1;32367:81;32364:107;;;32451:18;;:::i;:::-;32364:107;32495:1;32492;32488:9;32481:16;;32198:305;;;;:::o;32509:185::-;32549:1;32566:20;32584:1;32566:20;:::i;:::-;32561:25;;32600:20;32618:1;32600:20;:::i;:::-;32595:25;;32639:1;32629:35;;32644:18;;:::i;:::-;32629:35;32686:1;32683;32679:9;32674:14;;32509:185;;;;:::o;32700:348::-;32740:7;32763:20;32781:1;32763:20;:::i;:::-;32758:25;;32797:20;32815:1;32797:20;:::i;:::-;32792:25;;32985:1;32917:66;32913:74;32910:1;32907:81;32902:1;32895:9;32888:17;32884:105;32881:131;;;32992:18;;:::i;:::-;32881:131;33040:1;33037;33033:9;33022:20;;32700:348;;;;:::o;33054:191::-;33094:4;33114:20;33132:1;33114:20;:::i;:::-;33109:25;;33148:20;33166:1;33148:20;:::i;:::-;33143:25;;33187:1;33184;33181:8;33178:34;;;33192:18;;:::i;:::-;33178:34;33237:1;33234;33230:9;33222:17;;33054:191;;;;:::o;33251:96::-;33288:7;33317:24;33335:5;33317:24;:::i;:::-;33306:35;;33251:96;;;:::o;33353:104::-;33398:7;33427:24;33445:5;33427:24;:::i;:::-;33416:35;;33353:104;;;:::o;33463:90::-;33497:7;33540:5;33533:13;33526:21;33515:32;;33463:90;;;:::o;33559:149::-;33595:7;33635:66;33628:5;33624:78;33613:89;;33559:149;;;:::o;33714:111::-;33766:7;33795:24;33813:5;33795:24;:::i;:::-;33784:35;;33714:111;;;:::o;33831:126::-;33868:7;33908:42;33901:5;33897:54;33886:65;;33831:126;;;:::o;33963:77::-;34000:7;34029:5;34018:16;;33963:77;;;:::o;34046:134::-;34104:9;34137:37;34168:5;34137:37;:::i;:::-;34124:50;;34046:134;;;:::o;34186:126::-;34236:9;34269:37;34300:5;34269:37;:::i;:::-;34256:50;;34186:126;;;:::o;34318:113::-;34368:9;34401:24;34419:5;34401:24;:::i;:::-;34388:37;;34318:113;;;:::o;34437:154::-;34521:6;34516:3;34511;34498:30;34583:1;34574:6;34569:3;34565:16;34558:27;34437:154;;;:::o;34597:307::-;34665:1;34675:113;34689:6;34686:1;34683:13;34675:113;;;34774:1;34769:3;34765:11;34759:18;34755:1;34750:3;34746:11;34739:39;34711:2;34708:1;34704:10;34699:15;;34675:113;;;34806:6;34803:1;34800:13;34797:101;;;34886:1;34877:6;34872:3;34868:16;34861:27;34797:101;34646:258;34597:307;;;:::o;34910:320::-;34954:6;34991:1;34985:4;34981:12;34971:22;;35038:1;35032:4;35028:12;35059:18;35049:81;;35115:4;35107:6;35103:17;35093:27;;35049:81;35177:2;35169:6;35166:14;35146:18;35143:38;35140:84;;;35196:18;;:::i;:::-;35140:84;34961:269;34910:320;;;:::o;35236:281::-;35319:27;35341:4;35319:27;:::i;:::-;35311:6;35307:40;35449:6;35437:10;35434:22;35413:18;35401:10;35398:34;35395:62;35392:88;;;35460:18;;:::i;:::-;35392:88;35500:10;35496:2;35489:22;35279:238;35236:281;;:::o;35523:233::-;35562:3;35585:24;35603:5;35585:24;:::i;:::-;35576:33;;35631:66;35624:5;35621:77;35618:103;;;35701:18;;:::i;:::-;35618:103;35748:1;35741:5;35737:13;35730:20;;35523:233;;;:::o;35762:176::-;35794:1;35811:20;35829:1;35811:20;:::i;:::-;35806:25;;35845:20;35863:1;35845:20;:::i;:::-;35840:25;;35884:1;35874:35;;35889:18;;:::i;:::-;35874:35;35930:1;35927;35923:9;35918:14;;35762:176;;;;:::o;35944:180::-;35992:77;35989:1;35982:88;36089:4;36086:1;36079:15;36113:4;36110:1;36103:15;36130:180;36178:77;36175:1;36168:88;36275:4;36272:1;36265:15;36299:4;36296:1;36289:15;36316:180;36364:77;36361:1;36354:88;36461:4;36458:1;36451:15;36485:4;36482:1;36475:15;36502:180;36550:77;36547:1;36540:88;36647:4;36644:1;36637:15;36671:4;36668:1;36661:15;36688:180;36736:77;36733:1;36726:88;36833:4;36830:1;36823:15;36857:4;36854:1;36847:15;36874:117;36983:1;36980;36973:12;36997:117;37106:1;37103;37096:12;37120:117;37229:1;37226;37219:12;37243:117;37352:1;37349;37342:12;37366:102;37407:6;37458:2;37454:7;37449:2;37442:5;37438:14;37434:28;37424:38;;37366:102;;;:::o;37474:225::-;37614:34;37610:1;37602:6;37598:14;37591:58;37683:8;37678:2;37670:6;37666:15;37659:33;37474:225;:::o;37705:171::-;37845:23;37841:1;37833:6;37829:14;37822:47;37705:171;:::o;37882:225::-;38022:34;38018:1;38010:6;38006:14;37999:58;38091:8;38086:2;38078:6;38074:15;38067:33;37882:225;:::o;38113:165::-;38253:17;38249:1;38241:6;38237:14;38230:41;38113:165;:::o;38284:245::-;38424:34;38420:1;38412:6;38408:14;38401:58;38493:28;38488:2;38480:6;38476:15;38469:53;38284:245;:::o;38535:179::-;38675:31;38671:1;38663:6;38659:14;38652:55;38535:179;:::o;38720:225::-;38860:34;38856:1;38848:6;38844:14;38837:58;38929:8;38924:2;38916:6;38912:15;38905:33;38720:225;:::o;38951:230::-;39091:34;39087:1;39079:6;39075:14;39068:58;39160:13;39155:2;39147:6;39143:15;39136:38;38951:230;:::o;39187:158::-;39327:10;39323:1;39315:6;39311:14;39304:34;39187:158;:::o;39351:155::-;39491:7;39487:1;39479:6;39475:14;39468:31;39351:155;:::o;39512:163::-;39652:15;39648:1;39640:6;39636:14;39629:39;39512:163;:::o;39681:182::-;39821:34;39817:1;39809:6;39805:14;39798:58;39681:182;:::o;39869:223::-;40009:34;40005:1;39997:6;39993:14;39986:58;40078:6;40073:2;40065:6;40061:15;40054:31;39869:223;:::o;40098:114::-;;:::o;40218:179::-;40358:31;40354:1;40346:6;40342:14;40335:55;40218:179;:::o;40403:229::-;40543:34;40539:1;40531:6;40527:14;40520:58;40612:12;40607:2;40599:6;40595:15;40588:37;40403:229;:::o;40638:181::-;40778:33;40774:1;40766:6;40762:14;40755:57;40638:181;:::o;40825:122::-;40898:24;40916:5;40898:24;:::i;:::-;40891:5;40888:35;40878:63;;40937:1;40934;40927:12;40878:63;40825:122;:::o;40953:138::-;41034:32;41060:5;41034:32;:::i;:::-;41027:5;41024:43;41014:71;;41081:1;41078;41071:12;41014:71;40953:138;:::o;41097:116::-;41167:21;41182:5;41167:21;:::i;:::-;41160:5;41157:32;41147:60;;41203:1;41200;41193:12;41147:60;41097:116;:::o;41219:120::-;41291:23;41308:5;41291:23;:::i;:::-;41284:5;41281:34;41271:62;;41329:1;41326;41319:12;41271:62;41219:120;:::o;41345:152::-;41433:39;41466:5;41433:39;:::i;:::-;41426:5;41423:50;41413:78;;41487:1;41484;41477:12;41413:78;41345:152;:::o;41503:122::-;41576:24;41594:5;41576:24;:::i;:::-;41569:5;41566:35;41556:63;;41615:1;41612;41605:12;41556:63;41503:122;:::o
Swarm Source
ipfs://6bd6054d8d0a86081b2e7c09f5ee777033dac47bd35961770b3e155fc0613898
Loading...
Loading
Loading...
Loading
[ 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.