Contract Overview
Balance:
0 MATIC
My Name Tag:
Not Available
TokenTracker:
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
CarchainNFT
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-03-27 */ // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " 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. * * May emit a {RoleGranted} event. */ 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. * * May emit a {RoleRevoked} event. */ 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`. * * May emit a {RoleRevoked} event. */ 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. * * May emit a {RoleGranted} event. * * [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. * * May emit a {RoleGranted} event. */ 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. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: Carchain/New/Meta.sol pragma solidity ^0.8.19; contract AccessControlMixin is AccessControl { string private _revertMsg; function _setupContractId(string memory contractId) internal { _revertMsg = string(abi.encodePacked(contractId, ": INSUFFICIENT_PERMISSIONS")); } modifier only(bytes32 role) { require( hasRole(role, _msgSender()), _revertMsg ); _; } } contract Initializable { bool inited = false; modifier initializer() { require(!inited, "already inited"); _; inited = true; } } contract EIP712Base is Initializable { struct EIP712Domain { string name; string version; address verifyingContract; bytes32 salt; } string constant public ERC712_VERSION = "1"; bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)" ) ); bytes32 internal domainSeperator; // supposed to be called once while initializing. // one of the contractsa that inherits this contract follows proxy pattern // so it is not possible to do this in a constructor function _initializeEIP712( string memory name ) internal initializer { _setDomainSeperator(name); } function _setDomainSeperator(string memory name) internal { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(ERC712_VERSION)), address(this), bytes32(getChainId()) ) ); } function getDomainSeperator() public view returns (bytes32) { return domainSeperator; } function getChainId() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } } contract NativeMetaTransaction is EIP712Base { bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable returns (bytes memory) { MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match" ); // increase nonce for user (to avoid re-use) nonces[userAddress] = nonces[userAddress] + 1; emit MetaTransactionExecuted( userAddress, payable(msg.sender), functionSignature ); // Append userAddress and relayer address at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "Function call not successful"); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) public view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address signer, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER"); return signer == ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); } } abstract contract ContextMixin { function msgSender() internal view returns (address payable sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = payable(msg.sender); } return sender; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: Carchain/New/CarchainNFT.sol pragma solidity ^0.8.19; contract CarchainNFT is ERC721, ERC721Enumerable, Pausable, AccessControlMixin, NativeMetaTransaction, ContextMixin { using Counters for Counters.Counter; bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); Counters.Counter private _tokenIdCounter; mapping(string=>uint256) public vins; mapping(string=>uint256) public hashToTokenID; mapping(string=>uint256[]) public hashToTokenIDs; event CarCreated(uint256 indexed _id, address indexed sender, string hash, string make, string model, uint256 year, string vin, string engine, string colour, string plate, uint256 mileage, uint256 c02); event MileageUpdated(uint256 indexed _id, address indexed sender, uint256 mileage, string hash); event MileageUpdatedBatch(uint256[] indexed _id, address indexed sender, uint256 mileage, string hash); event ColourUpdated(uint256 indexed _id, address indexed sender, string colour, string hash); event C02Updated(uint256 indexed _id, address indexed sender, uint256 c02, string hash); event C02UpdatedBatch(uint256[] indexed _id, address indexed sender, uint256 c02, string hash); event PlateUpdated(uint256 indexed _id, address indexed sender, string plate, string hash); event EngineUpdated(uint256 indexed _id, address indexed sender, string engine, string hash); event EventStated(uint256 indexed _id, address indexed sender, string details, string hash); event CarBurnt(uint256 indexed _id, address indexed sender); constructor() ERC721("Carchain", "CAR") { _initializeEIP712('Carchain NFT'); _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(PAUSER_ROLE, msg.sender); _grantRole(MINTER_ROLE, msg.sender); } function _baseURI() internal pure override returns (string memory) { return "https://testing.api.carchain.app/api/erc721/token/"; } function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(PAUSER_ROLE) { _unpause(); } function safeMint(address to) public onlyRole(MINTER_ROLE) { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal whenNotPaused override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } // The following functions are overrides required by Solidity. function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } struct Properties { string hash; string make; string model; uint256 year; string vin; string engine; string colour; string plate; uint256 mileage; uint256 c02; } mapping(uint256 => Properties) metadata; function getMetadata(uint256 _id) external view returns (address owner, string memory hash, string memory make, string memory model, uint256 year, string memory vin, string memory engine, string memory colour, string memory plate, uint256 mileage) { Properties memory data = metadata[_id]; return (ownerOf(_id), data.hash, data.make, data.model, data.year, data.vin, data.engine, data.colour, data.plate, data.mileage); } function mintAndSet(address _to, string memory _hash, string memory _make, string memory _model, uint256 _year, string memory _vin, string memory _engine, string memory _colour, string memory _plate, uint256 _mileage, uint256 _c02) public onlyRole(MINTER_ROLE) { require(vins[_vin] == 0, "VIN already exists"); require(hashToTokenID[_vin] == 0, "Hash already exists"); uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); vins[_vin] = tokenId; hashToTokenID[_hash] = tokenId; metadata[tokenId].hash = _hash; metadata[tokenId].make = _make; metadata[tokenId].model = _model; metadata[tokenId].year = _year; metadata[tokenId].vin = _vin; metadata[tokenId].engine = _engine; metadata[tokenId].colour = _colour; metadata[tokenId].plate = _plate; metadata[tokenId].mileage = _mileage; metadata[tokenId].c02 = _c02; _safeMint(_to, tokenId); emit CarCreated(tokenId, _msgSender(), _hash, _make, _model, _year, _vin, _engine, _colour, _plate, _mileage, _c02); } /** * @dev Throws if called by any account other than the token or the contract owner. */ modifier onlyCarOwner(uint256 _id) { require(ownerOf(_id) == _msgSender() || hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Invalid owner"); _; } function updatePlate(uint256 _id, string memory _plate, string memory _hash) public onlyCarOwner(_id) { metadata[_id].plate = _plate; hashToTokenID[_hash] = _id; emit PlateUpdated(_id, _msgSender(), _plate, _hash); } function updateEngine(uint256 _id, string memory _engine, string memory _hash) public onlyCarOwner(_id) { metadata[_id].engine = _engine; hashToTokenID[_hash] = _id; emit EngineUpdated(_id, _msgSender(), _engine, _hash); } function updateMileage(uint256 _id, uint256 _mileage, string memory _hash) public onlyCarOwner(_id) { metadata[_id].mileage = _mileage; hashToTokenID[_hash] = _id; emit MileageUpdated(_id, _msgSender(), _mileage, _hash); } function updateMileageBatch(uint256[] memory _ids, uint256 _mileage, string memory _hash) public onlyRole(DEFAULT_ADMIN_ROLE) { for (uint i=0; i<_ids.length; i++) { metadata[_ids[i]].mileage = _mileage; } hashToTokenIDs[_hash] = _ids; emit MileageUpdatedBatch(_ids, _msgSender(), _mileage, _hash); } function updateColour(uint256 _id, string memory _colour, string memory _hash) public onlyCarOwner(_id) { metadata[_id].colour = _colour; hashToTokenID[_hash] = _id; emit ColourUpdated(_id, _msgSender(), _colour, _hash); } function updateC02(uint256 _id, uint256 _c02, string memory _hash) public onlyCarOwner(_id) { metadata[_id].c02 = _c02; hashToTokenID[_hash] = _id; emit C02Updated(_id, _msgSender(), _c02, _hash); } function updateC02Batch(uint256[] memory _ids, uint256 _c02, string memory _hash) public onlyRole(DEFAULT_ADMIN_ROLE) { for (uint i=0; i<_ids.length; i++) { metadata[_ids[i]].c02 = _c02; } hashToTokenIDs[_hash] = _ids; emit C02UpdatedBatch(_ids, _msgSender(), _c02, _hash); } function stateEvent(uint256 _id, string memory _details, string memory _hash) public onlyCarOwner(_id) { hashToTokenID[_hash] = _id; emit EventStated(_id, _msgSender(), _details, _hash); } function burn(uint256 _id) public onlyCarOwner(_id) { _burn(_id); vins[metadata[_id].vin] = 0; emit CarBurnt(_id, _msgSender()); } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"c02","type":"uint256"},{"indexed":false,"internalType":"string","name":"hash","type":"string"}],"name":"C02Updated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256[]","name":"_id","type":"uint256[]"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"c02","type":"uint256"},{"indexed":false,"internalType":"string","name":"hash","type":"string"}],"name":"C02UpdatedBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"CarBurnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"hash","type":"string"},{"indexed":false,"internalType":"string","name":"make","type":"string"},{"indexed":false,"internalType":"string","name":"model","type":"string"},{"indexed":false,"internalType":"uint256","name":"year","type":"uint256"},{"indexed":false,"internalType":"string","name":"vin","type":"string"},{"indexed":false,"internalType":"string","name":"engine","type":"string"},{"indexed":false,"internalType":"string","name":"colour","type":"string"},{"indexed":false,"internalType":"string","name":"plate","type":"string"},{"indexed":false,"internalType":"uint256","name":"mileage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"c02","type":"uint256"}],"name":"CarCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"colour","type":"string"},{"indexed":false,"internalType":"string","name":"hash","type":"string"}],"name":"ColourUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"engine","type":"string"},{"indexed":false,"internalType":"string","name":"hash","type":"string"}],"name":"EngineUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"details","type":"string"},{"indexed":false,"internalType":"string","name":"hash","type":"string"}],"name":"EventStated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"mileage","type":"uint256"},{"indexed":false,"internalType":"string","name":"hash","type":"string"}],"name":"MileageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256[]","name":"_id","type":"uint256[]"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"mileage","type":"uint256"},{"indexed":false,"internalType":"string","name":"hash","type":"string"}],"name":"MileageUpdatedBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"plate","type":"string"},{"indexed":false,"internalType":"string","name":"hash","type":"string"}],"name":"PlateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getMetadata","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"hash","type":"string"},{"internalType":"string","name":"make","type":"string"},{"internalType":"string","name":"model","type":"string"},{"internalType":"uint256","name":"year","type":"uint256"},{"internalType":"string","name":"vin","type":"string"},{"internalType":"string","name":"engine","type":"string"},{"internalType":"string","name":"colour","type":"string"},{"internalType":"string","name":"plate","type":"string"},{"internalType":"uint256","name":"mileage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"hashToTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"hashToTokenIDs","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":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"_hash","type":"string"},{"internalType":"string","name":"_make","type":"string"},{"internalType":"string","name":"_model","type":"string"},{"internalType":"uint256","name":"_year","type":"uint256"},{"internalType":"string","name":"_vin","type":"string"},{"internalType":"string","name":"_engine","type":"string"},{"internalType":"string","name":"_colour","type":"string"},{"internalType":"string","name":"_plate","type":"string"},{"internalType":"uint256","name":"_mileage","type":"uint256"},{"internalType":"uint256","name":"_c02","type":"uint256"}],"name":"mintAndSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_details","type":"string"},{"internalType":"string","name":"_hash","type":"string"}],"name":"stateEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_c02","type":"uint256"},{"internalType":"string","name":"_hash","type":"string"}],"name":"updateC02","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256","name":"_c02","type":"uint256"},{"internalType":"string","name":"_hash","type":"string"}],"name":"updateC02Batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_colour","type":"string"},{"internalType":"string","name":"_hash","type":"string"}],"name":"updateColour","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_engine","type":"string"},{"internalType":"string","name":"_hash","type":"string"}],"name":"updateEngine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_mileage","type":"uint256"},{"internalType":"string","name":"_hash","type":"string"}],"name":"updateMileage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256","name":"_mileage","type":"uint256"},{"internalType":"string","name":"_hash","type":"string"}],"name":"updateMileageBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_plate","type":"string"},{"internalType":"string","name":"_hash","type":"string"}],"name":"updatePlate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"vins","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600d805460ff191690553480156200001b57600080fd5b506040518060400160405280600881526020016721b0b931b430b4b760c11b8152506040518060400160405280600381526020016221a0a960e91b81525081600090816200006a91906200036f565b5060016200007982826200036f565b5050600a805460ff191690555060408051808201909152600c81526b10d85c98da185a5b8813919560a21b6020820152620000b4906200011f565b620000c160003362000183565b620000ed7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a3362000183565b620001197f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63362000183565b6200043b565b600d5460ff1615620001685760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640160405180910390fd5b620001738162000228565b50600d805460ff19166001179055565b6000828152600b602090815260408083206001600160a01b038516845290915290205460ff1662000224576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620001e33390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6040518060800160405280604f8152602001620044d7604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600e55565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002f557607f821691505b6020821081036200031657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200036a57600081815260208120601f850160051c81016020861015620003455750805b601f850160051c820191505b81811015620003665782815560010162000351565b5050505b505050565b81516001600160401b038111156200038b576200038b620002ca565b620003a3816200039c8454620002e0565b846200031c565b602080601f831160018114620003db5760008415620003c25750858301515b600019600386901b1c1916600185901b17855562000366565b600085815260208120601f198616915b828110156200040c57888601518255948401946001909101908401620003eb565b50858210156200042b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61408c806200044b6000396000f3fe6080604052600436106102885760003560e01c806354e854aa1161015a578063a217fddf116100c1578063d53913931161007a578063d5391393146107fd578063d547741f14610831578063dd45fdc314610851578063e63ab1e914610871578063e985e9c5146108a5578063f5069467146108ee57600080fd5b8063a217fddf14610732578063a22cb46514610747578063a574cea414610767578063b88d4fde1461079d578063b8c50802146107bd578063c87b56dd146107dd57600080fd5b806373e4bc3e1161011357806373e4bc3e146106705780638456cb59146106a857806389fdb474146106bd5780638b7ccc46146106dd57806391d14854146106fd57806395d89b411461071d57600080fd5b806354e854aa146105a05780635bf45b33146105c05780635c975abb146105f85780636352211e146106105780636541df1b1461063057806370a082311461065057600080fd5b8063287b02e8116101fe5780633f4ba83a116101b75780633f4ba83a146104eb57806340d097c31461050057806342842e0e1461052057806342966c68146105405780634f6ccce7146105605780635480ca531461058057600080fd5b8063287b02e8146104225780632d0335ab146104425780632f2ff15d146104785780632f745c59146104985780633408e470146104b857806336568abe146104cb57600080fd5b80630c53c51c116102505780630c53c51c1461035e5780630f7e59701461037157806318160ddd1461039e57806320379ee5146103bd57806323b872dd146103d2578063248a9ca3146103f257600080fd5b806301b8f7871461028d57806301ffc9a7146102af57806306fdde03146102e4578063081812fc14610306578063095ea7b31461033e575b600080fd5b34801561029957600080fd5b506102ad6102a836600461331b565b61090e565b005b3480156102bb57600080fd5b506102cf6102ca366004613380565b6109e0565b60405190151581526020015b60405180910390f35b3480156102f057600080fd5b506102f96109f1565b6040516102db91906133ed565b34801561031257600080fd5b50610326610321366004613400565b610a83565b6040516001600160a01b0390911681526020016102db565b34801561034a57600080fd5b506102ad610359366004613435565b610aaa565b6102f961036c36600461345f565b610bbf565b34801561037d57600080fd5b506102f9604051806040016040528060018152602001603160f81b81525081565b3480156103aa57600080fd5b506008545b6040519081526020016102db565b3480156103c957600080fd5b50600e546103af565b3480156103de57600080fd5b506102ad6103ed3660046134da565b610da9565b3480156103fe57600080fd5b506103af61040d366004613400565b6000908152600b602052604090206001015490565b34801561042e57600080fd5b506102ad61043d366004613516565b610dda565b34801561044e57600080fd5b506103af61045d366004613578565b6001600160a01b03166000908152600f602052604090205490565b34801561048457600080fd5b506102ad610493366004613593565b610e9b565b3480156104a457600080fd5b506103af6104b3366004613435565b610ec0565b3480156104c457600080fd5b50466103af565b3480156104d757600080fd5b506102ad6104e6366004613593565b610f56565b3480156104f757600080fd5b506102ad610fd4565b34801561050c57600080fd5b506102ad61051b366004613578565b611009565b34801561052c57600080fd5b506102ad61053b3660046134da565b611058565b34801561054c57600080fd5b506102ad61055b366004613400565b611073565b34801561056c57600080fd5b506103af61057b366004613400565b611132565b34801561058c57600080fd5b506102ad61059b366004613516565b6111c5565b3480156105ac57600080fd5b506103af6105bb3660046135bf565b611286565b3480156105cc57600080fd5b506103af6105db366004613603565b805160208183018101805160128252928201919093012091525481565b34801561060457600080fd5b50600a5460ff166102cf565b34801561061c57600080fd5b5061032661062b366004613400565b6112c6565b34801561063c57600080fd5b506102ad61064b366004613516565b611326565b34801561065c57600080fd5b506103af61066b366004613578565b6113e7565b34801561067c57600080fd5b506103af61068b366004613603565b805160208183018101805160118252928201919093012091525481565b3480156106b457600080fd5b506102ad61146d565b3480156106c957600080fd5b506102ad6106d8366004613637565b61149f565b3480156106e957600080fd5b506102ad6106f836600461331b565b61157a565b34801561070957600080fd5b506102cf610718366004613593565b611635565b34801561072957600080fd5b506102f9611660565b34801561073e57600080fd5b506103af600081565b34801561075357600080fd5b506102ad6107623660046136f0565b61166f565b34801561077357600080fd5b50610787610782366004613400565b61167a565b6040516102db9a9998979695949392919061372c565b3480156107a957600080fd5b506102ad6107b83660046137e9565b611b22565b3480156107c957600080fd5b506102ad6107d8366004613516565b611b5a565b3480156107e957600080fd5b506102f96107f8366004613400565b611bff565b34801561080957600080fd5b506103af7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b34801561083d57600080fd5b506102ad61084c366004613593565b611c66565b34801561085d57600080fd5b506102ad61086c366004613637565b611c8b565b34801561087d57600080fd5b506103af7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b3480156108b157600080fd5b506102cf6108c0366004613850565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108fa57600080fd5b506102ad61090936600461387a565b611d66565b8233610919826112c6565b6001600160a01b031614806109345750610934600033611635565b6109595760405162461bcd60e51b8152600401610950906139ce565b60405180910390fd5b600084815260146020526040908190206009018490555184906012906109809085906139f5565b908152604051908190036020019020556109973390565b6001600160a01b0316847f327cbc01179f0a234de64828f00c6b3d1050cba8ccd6ffb0eb33d89012f1991585856040516109d2929190613a11565b60405180910390a350505050565b60006109eb82612008565b92915050565b606060008054610a0090613a2a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2c90613a2a565b8015610a795780601f10610a4e57610100808354040283529160200191610a79565b820191906000526020600020905b815481529060010190602001808311610a5c57829003601f168201915b5050505050905090565b6000610a8e8261202d565b506000908152600460205260409020546001600160a01b031690565b6000610ab5826112c6565b9050806001600160a01b0316836001600160a01b031603610b225760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610950565b336001600160a01b0382161480610b3e5750610b3e81336108c0565b610bb05760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610950565b610bba838361208c565b505050565b60408051606081810183526001600160a01b0388166000818152600f602090815290859020548452830152918101869052610bfd87828787876120fa565b610c535760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610950565b6001600160a01b0387166000908152600f6020526040902054610c77906001613a7a565b6001600160a01b0388166000908152600f60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610cc790899033908a90613a8d565b60405180910390a1600080306001600160a01b0316888a604051602001610cef929190613ac2565b60408051601f1981840301815290829052610d09916139f5565b6000604051808303816000865af19150503d8060008114610d46576040519150601f19603f3d011682016040523d82523d6000602084013e610d4b565b606091505b509150915081610d9d5760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610950565b98975050505050505050565b610db333826121ea565b610dcf5760405162461bcd60e51b815260040161095090613af9565b610bba838383612269565b8233610de5826112c6565b6001600160a01b03161480610e005750610e00600033611635565b610e1c5760405162461bcd60e51b8152600401610950906139ce565b6000848152601460205260409020600501610e378482613b94565b5083601283604051610e4991906139f5565b90815260405190819003602001902055610e603390565b6001600160a01b0316847fa137321eac3b8fe21cab0367db544e20ed5f117c6cafa4e19d7fdccccc5d93be85856040516109d2929190613c53565b6000828152600b6020526040902060010154610eb6816123da565b610bba83836123e4565b6000610ecb836113e7565b8210610f2d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610950565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381163314610fc65760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610950565b610fd0828261246a565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ffe816123da565b6110066124d1565b50565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611033816123da565b600061103e60105490565b905061104e601080546001019055565b610bba8382612523565b610bba83838360405180602001604052806000815250611b22565b803361107e826112c6565b6001600160a01b031614806110995750611099600033611635565b6110b55760405162461bcd60e51b8152600401610950906139ce565b6110be8261253d565b60008281526014602052604080822090516011916110e191600490910190613c78565b908152604051908190036020019020556110f83390565b6001600160a01b0316827f63c42647afb7100db31d1f6076de32a63e10eb009709a01c6a5c019f6057d0f560405160405180910390a35050565b600061113d60085490565b82106111a05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610950565b600882815481106111b3576111b3613cee565b90600052602060002001549050919050565b82336111d0826112c6565b6001600160a01b031614806111eb57506111eb600033611635565b6112075760405162461bcd60e51b8152600401610950906139ce565b60008481526014602052604090206007016112228482613b94565b508360128360405161123491906139f5565b9081526040519081900360200190205561124b3390565b6001600160a01b0316847f9bcb81cf317648342693162203f2a5c010e1923bb02d8127e692b5116bcd8e4b85856040516109d2929190613c53565b815160208184018101805160138252928201918501919091209190528054829081106112b157600080fd5b90600052602060002001600091509150505481565b6000818152600260205260408120546001600160a01b0316806109eb5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610950565b8233611331826112c6565b6001600160a01b0316148061134c575061134c600033611635565b6113685760405162461bcd60e51b8152600401610950906139ce565b60008481526014602052604090206006016113838482613b94565b508360128360405161139591906139f5565b908152604051908190036020019020556113ac3390565b6001600160a01b0316847f3c7535d8ee8b0e40c09a2d8817eaf9954e734622b3ac4e3c021b24bdaf3c049a85856040516109d2929190613c53565b60006001600160a01b0382166114515760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610950565b506001600160a01b031660009081526003602052604090205490565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611497816123da565b6110066125e0565b60006114aa816123da565b60005b84518110156114fd5783601460008784815181106114cd576114cd613cee565b602002602001015181526020019081526020016000206009018190555080806114f590613d04565b9150506114ad565b508360138360405161150f91906139f5565b90815260200160405180910390209080519060200190611530929190613206565b506040513390611541908690613d1d565b60405180910390207f3c6315d277650dc373906eb3de90027eb14ffbd2a9862c1aa8fc5ed5d151c10085856040516109d2929190613a11565b8233611585826112c6565b6001600160a01b031614806115a057506115a0600033611635565b6115bc5760405162461bcd60e51b8152600401610950906139ce565b600084815260146020526040908190206008018490555184906012906115e39085906139f5565b908152604051908190036020019020556115fa3390565b6001600160a01b0316847f892eea8b4612fc6d6689f1ee1cdfc5977b3340f6949690addff5315b00576b4585856040516109d2929190613a11565b6000918252600b602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060018054610a0090613a2a565b610fd033838361261d565b600060608060606000606080606080600080601460008d8152602001908152602001600020604051806101400160405290816000820180546116bb90613a2a565b80601f01602080910402602001604051908101604052809291908181526020018280546116e790613a2a565b80156117345780601f1061170957610100808354040283529160200191611734565b820191906000526020600020905b81548152906001019060200180831161171757829003601f168201915b5050505050815260200160018201805461174d90613a2a565b80601f016020809104026020016040519081016040528092919081815260200182805461177990613a2a565b80156117c65780601f1061179b576101008083540402835291602001916117c6565b820191906000526020600020905b8154815290600101906020018083116117a957829003601f168201915b505050505081526020016002820180546117df90613a2a565b80601f016020809104026020016040519081016040528092919081815260200182805461180b90613a2a565b80156118585780601f1061182d57610100808354040283529160200191611858565b820191906000526020600020905b81548152906001019060200180831161183b57829003601f168201915b505050505081526020016003820154815260200160048201805461187b90613a2a565b80601f01602080910402602001604051908101604052809291908181526020018280546118a790613a2a565b80156118f45780601f106118c9576101008083540402835291602001916118f4565b820191906000526020600020905b8154815290600101906020018083116118d757829003601f168201915b5050505050815260200160058201805461190d90613a2a565b80601f016020809104026020016040519081016040528092919081815260200182805461193990613a2a565b80156119865780601f1061195b57610100808354040283529160200191611986565b820191906000526020600020905b81548152906001019060200180831161196957829003601f168201915b5050505050815260200160068201805461199f90613a2a565b80601f01602080910402602001604051908101604052809291908181526020018280546119cb90613a2a565b8015611a185780601f106119ed57610100808354040283529160200191611a18565b820191906000526020600020905b8154815290600101906020018083116119fb57829003601f168201915b50505050508152602001600782018054611a3190613a2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5d90613a2a565b8015611aaa5780601f10611a7f57610100808354040283529160200191611aaa565b820191906000526020600020905b815481529060010190602001808311611a8d57829003601f168201915b50505050508152602001600882015481526020016009820154815250509050611ad28c6112c6565b816000015182602001518360400151846060015185608001518660a001518760c001518860e001518961010001519a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b611b2c33836121ea565b611b485760405162461bcd60e51b815260040161095090613af9565b611b54848484846126eb565b50505050565b8233611b65826112c6565b6001600160a01b03161480611b805750611b80600033611635565b611b9c5760405162461bcd60e51b8152600401610950906139ce565b83601283604051611bad91906139f5565b90815260405190819003602001902055611bc43390565b6001600160a01b0316847fbdfdb28287ba5dd719df47f6ea90e4238e4c346b9808df78d477c14fb415f8c785856040516109d2929190613c53565b6060611c0a8261202d565b6000611c1461271e565b90506000815111611c345760405180602001604052806000815250611c5f565b80611c3e8461273e565b604051602001611c4f929190613d47565b6040516020818303038152906040525b9392505050565b6000828152600b6020526040902060010154611c81816123da565b610bba838361246a565b6000611c96816123da565b60005b8451811015611ce9578360146000878481518110611cb957611cb9613cee565b60200260200101518152602001908152602001600020600801819055508080611ce190613d04565b915050611c99565b5083601383604051611cfb91906139f5565b90815260200160405180910390209080519060200190611d1c929190613206565b506040513390611d2d908690613d1d565b60405180910390207fc5f8272c2a8ccd625fd414ed8df9f71744ec334fa5d58100bbefdcfab77082ab85856040516109d2929190613a11565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611d90816123da565b601187604051611da091906139f5565b908152602001604051809103902054600014611df35760405162461bcd60e51b815260206004820152601260248201527156494e20616c72656164792065786973747360701b6044820152606401610950565b601287604051611e0391906139f5565b908152602001604051809103902054600014611e575760405162461bcd60e51b81526020600482015260136024820152724861736820616c72656164792065786973747360681b6044820152606401610950565b6000611e6260105490565b9050611e72601080546001019055565b80601189604051611e8391906139f5565b9081526020016040518091039020819055508060128d604051611ea691906139f5565b9081526040805160209281900383019020929092556000838152601490915220611ed08d82613b94565b506000818152601460205260409020600101611eec8c82613b94565b506000818152601460205260409020600201611f088b82613b94565b506000818152601460205260409020600381018a9055600401611f2b8982613b94565b506000818152601460205260409020600501611f478882613b94565b506000818152601460205260409020600601611f638782613b94565b506000818152601460205260409020600701611f7f8682613b94565b50600081815260146020526040902060088101859055600901839055611fa58d82612523565b336001600160a01b0316817f8c5db7b91d1a7486c2ec04bd8d84adac92d65af0645db4365dbe5c6946e2d5168e8e8e8e8e8e8e8e8e8e604051611ff19a99989796959493929190613d76565b60405180910390a350505050505050505050505050565b60006001600160e01b03198216637965db0b60e01b14806109eb57506109eb826127d0565b6000818152600260205260409020546001600160a01b03166110065760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610950565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906120c1826112c6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166121605760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610950565b600161217361216e876127f5565b612872565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156121c1573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000806121f6836112c6565b9050806001600160a01b0316846001600160a01b0316148061223d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806122615750836001600160a01b031661225684610a83565b6001600160a01b0316145b949350505050565b826001600160a01b031661227c826112c6565b6001600160a01b0316146122a25760405162461bcd60e51b815260040161095090613e24565b6001600160a01b0382166123045760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610950565b61231183838360016128a2565b826001600160a01b0316612324826112c6565b6001600160a01b03161461234a5760405162461bcd60e51b815260040161095090613e24565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61100681336128b6565b6123ee8282611635565b610fd0576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff191660011790556124263390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6124748282611635565b15610fd0576000828152600b602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6124d961290f565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610fd082826040518060200160405280600081525061295a565b6000612548826112c6565b90506125588160008460016128a2565b612561826112c6565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6125e861298d565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125063390565b816001600160a01b0316836001600160a01b03160361267e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610950565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6126f6848484612269565b612702848484846129d3565b611b545760405162461bcd60e51b815260040161095090613e69565b606060405180606001604052806032815260200161402560329139905090565b6060600061274b83612ad4565b60010190506000816001600160401b0381111561276a5761276a613266565b6040519080825280601f01601f191660200182016040528015612794576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461279e57509392505050565b60006001600160e01b0319821663780e9d6360e01b14806109eb57506109eb82612bac565b6000604051806080016040528060438152602001613fe26043913980516020918201208351848301516040808701518051908601209051612855950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061287d600e5490565b60405161190160f01b6020820152602281019190915260428101839052606201612855565b6128aa61298d565b611b5484848484612bfc565b6128c08282611635565b610fd0576128cd81612d30565b6128d8836020612d42565b6040516020016128e9929190613ebb565b60408051601f198184030181529082905262461bcd60e51b8252610950916004016133ed565b600a5460ff166129585760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610950565b565b6129648383612edd565b61297160008484846129d3565b610bba5760405162461bcd60e51b815260040161095090613e69565b600a5460ff16156129585760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610950565b60006001600160a01b0384163b15612ac957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a17903390899088908890600401613f30565b6020604051808303816000875af1925050508015612a52575060408051601f3d908101601f19168201909252612a4f91810190613f6d565b60015b612aaf573d808015612a80576040519150601f19603f3d011682016040523d82523d6000602084013e612a85565b606091505b508051600003612aa75760405162461bcd60e51b815260040161095090613e69565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612261565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612b135772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612b3f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612b5d57662386f26fc10000830492506010015b6305f5e1008310612b75576305f5e100830492506008015b6127108310612b8957612710830492506004015b60648310612b9b576064830492506002015b600a83106109eb5760010192915050565b60006001600160e01b031982166380ac58cd60e01b1480612bdd57506001600160e01b03198216635b5e139f60e01b145b806109eb57506301ffc9a760e01b6001600160e01b03198316146109eb565b6001811115612c6b5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610950565b816001600160a01b038516612cc757612cc281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612cea565b836001600160a01b0316856001600160a01b031614612cea57612cea8582613076565b6001600160a01b038416612d0657612d0181613113565b612d29565b846001600160a01b0316846001600160a01b031614612d2957612d2984826131c2565b5050505050565b60606109eb6001600160a01b03831660145b60606000612d51836002613f8a565b612d5c906002613a7a565b6001600160401b03811115612d7357612d73613266565b6040519080825280601f01601f191660200182016040528015612d9d576020820181803683370190505b509050600360fc1b81600081518110612db857612db8613cee565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612de757612de7613cee565b60200101906001600160f81b031916908160001a9053506000612e0b846002613f8a565b612e16906001613a7a565b90505b6001811115612e8e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612e4a57612e4a613cee565b1a60f81b828281518110612e6057612e60613cee565b60200101906001600160f81b031916908160001a90535060049490941c93612e8781613fa1565b9050612e19565b508315611c5f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610950565b6001600160a01b038216612f335760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610950565b6000818152600260205260409020546001600160a01b031615612f985760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610950565b612fa66000838360016128a2565b6000818152600260205260409020546001600160a01b03161561300b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610950565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001613083846113e7565b61308d9190613fb8565b6000838152600760205260409020549091508082146130e0576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061312590600190613fb8565b6000838152600960205260408120546008805493945090928490811061314d5761314d613cee565b90600052602060002001549050806008838154811061316e5761316e613cee565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806131a6576131a6613fcb565b6001900381819060005260206000200160009055905550505050565b60006131cd836113e7565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054828255906000526020600020908101928215613241579160200282015b82811115613241578251825591602001919060010190613226565b5061324d929150613251565b5090565b5b8082111561324d5760008155600101613252565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156132a4576132a4613266565b604052919050565b600082601f8301126132bd57600080fd5b81356001600160401b038111156132d6576132d6613266565b6132e9601f8201601f191660200161327c565b8181528460208386010111156132fe57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561333057600080fd5b833592506020840135915060408401356001600160401b0381111561335457600080fd5b613360868287016132ac565b9150509250925092565b6001600160e01b03198116811461100657600080fd5b60006020828403121561339257600080fd5b8135611c5f8161336a565b60005b838110156133b85781810151838201526020016133a0565b50506000910152565b600081518084526133d981602086016020860161339d565b601f01601f19169290920160200192915050565b602081526000611c5f60208301846133c1565b60006020828403121561341257600080fd5b5035919050565b80356001600160a01b038116811461343057600080fd5b919050565b6000806040838503121561344857600080fd5b61345183613419565b946020939093013593505050565b600080600080600060a0868803121561347757600080fd5b61348086613419565b945060208601356001600160401b0381111561349b57600080fd5b6134a7888289016132ac565b9450506040860135925060608601359150608086013560ff811681146134cc57600080fd5b809150509295509295909350565b6000806000606084860312156134ef57600080fd5b6134f884613419565b925061350660208501613419565b9150604084013590509250925092565b60008060006060848603121561352b57600080fd5b8335925060208401356001600160401b038082111561354957600080fd5b613555878388016132ac565b9350604086013591508082111561356b57600080fd5b50613360868287016132ac565b60006020828403121561358a57600080fd5b611c5f82613419565b600080604083850312156135a657600080fd5b823591506135b660208401613419565b90509250929050565b600080604083850312156135d257600080fd5b82356001600160401b038111156135e857600080fd5b6135f4858286016132ac565b95602094909401359450505050565b60006020828403121561361557600080fd5b81356001600160401b0381111561362b57600080fd5b612261848285016132ac565b60008060006060848603121561364c57600080fd5b83356001600160401b038082111561366357600080fd5b818601915086601f83011261367757600080fd5b813560208282111561368b5761368b613266565b8160051b61369a82820161327c565b928352848101820192828101908b8511156136b457600080fd5b958301955b848710156136d2578635825295830195908301906136b9565b98505050870135945050604086013591508082111561356b57600080fd5b6000806040838503121561370357600080fd5b61370c83613419565b91506020830135801515811461372157600080fd5b809150509250929050565b6001600160a01b038b168152610140602082018190526000906137518382018d6133c1565b90508281036040840152613765818c6133c1565b90508281036060840152613779818b6133c1565b905088608084015282810360a084015261379381896133c1565b905082810360c08401526137a781886133c1565b905082810360e08401526137bb81876133c1565b90508281036101008401526137d081866133c1565b915050826101208301529b9a5050505050505050505050565b600080600080608085870312156137ff57600080fd5b61380885613419565b935061381660208601613419565b92506040850135915060608501356001600160401b0381111561383857600080fd5b613844878288016132ac565b91505092959194509250565b6000806040838503121561386357600080fd5b61386c83613419565b91506135b660208401613419565b60008060008060008060008060008060006101608c8e03121561389c57600080fd5b6138a58c613419565b9a506001600160401b038060208e013511156138c057600080fd5b6138d08e60208f01358f016132ac565b9a508060408e013511156138e357600080fd5b6138f38e60408f01358f016132ac565b99508060608e0135111561390657600080fd5b6139168e60608f01358f016132ac565b985060808d013597508060a08e0135111561393057600080fd5b6139408e60a08f01358f016132ac565b96508060c08e0135111561395357600080fd5b6139638e60c08f01358f016132ac565b95508060e08e0135111561397657600080fd5b6139868e60e08f01358f016132ac565b9450806101008e0135111561399a57600080fd5b506139ac8d6101008e01358e016132ac565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6020808252600d908201526c24b73b30b634b21037bbb732b960991b604082015260600190565b60008251613a0781846020870161339d565b9190910192915050565b82815260406020820152600061226160408301846133c1565b600181811c90821680613a3e57607f821691505b602082108103613a5e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156109eb576109eb613a64565b6001600160a01b03848116825283166020820152606060408201819052600090613ab9908301846133c1565b95945050505050565b60008351613ad481846020880161339d565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b601f821115610bba57600081815260208120601f850160051c81016020861015613b6d5750805b601f850160051c820191505b81811015613b8c57828155600101613b79565b505050505050565b81516001600160401b03811115613bad57613bad613266565b613bc181613bbb8454613a2a565b84613b46565b602080601f831160018114613bf65760008415613bde5750858301515b600019600386901b1c1916600185901b178555613b8c565b600085815260208120601f198616915b82811015613c2557888601518255948401946001909101908401613c06565b5085821015613c435787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b604081526000613c6660408301856133c1565b8281036020840152613ab981856133c1565b6000808354613c8681613a2a565b60018281168015613c9e5760018114613cb357613ce2565b60ff1984168752821515830287019450613ce2565b8760005260208060002060005b85811015613cd95781548a820152908401908201613cc0565b50505082870194505b50929695505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201613d1657613d16613a64565b5060010190565b815160009082906020808601845b83811015613ce257815185529382019390820190600101613d2b565b60008351613d5981846020880161339d565b835190830190613d6d81836020880161339d565b01949350505050565b6000610140808352613d8a8184018e6133c1565b90508281036020840152613d9e818d6133c1565b90508281036040840152613db2818c6133c1565b90508960608401528281036080840152613dcc818a6133c1565b905082810360a0840152613de081896133c1565b905082810360c0840152613df481886133c1565b905082810360e0840152613e0881876133c1565b6101008401959095525050610120015298975050505050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613ef381601785016020880161339d565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613f2481602884016020880161339d565b01602801949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613f63908301846133c1565b9695505050505050565b600060208284031215613f7f57600080fd5b8151611c5f8161336a565b80820281158282048414176109eb576109eb613a64565b600081613fb057613fb0613a64565b506000190190565b818103818111156109eb576109eb613a64565b634e487b7160e01b600052603160045260246000fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652968747470733a2f2f74657374696e672e6170692e636172636861696e2e6170702f6170692f6572633732312f746f6b656e2fa264697066735822122037fa0267e10743df7d005984dfdd7a794858c57dd5939a0aa8c42ffe547253b564736f6c63430008130033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429
Deployed ByteCode Sourcemap
81993:7626:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88644:232;;;;;;;;;;-1:-1:-1;88644:232:0;;;;;:::i;:::-;;:::i;:::-;;84747:227;;;;;;;;;;-1:-1:-1;84747:227:0;;;;;:::i;:::-;;:::i;:::-;;;1976:14:1;;1969:22;1951:41;;1939:2;1924:18;84747:227:0;;;;;;;;59680:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61192:171::-;;;;;;;;;;-1:-1:-1;61192:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3108:32:1;;;3090:51;;3078:2;3063:18;61192:171:0;2944:203:1;60710:416:0;;;;;;;;;;-1:-1:-1;60710:416:0;;;;;:::i;:::-;;:::i;47471:1148::-;;;;;;:::i;:::-;;:::i;44766:43::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44766:43:0;;;;;76613:113;;;;;;;;;;-1:-1:-1;76701:10:0;:17;76613:113;;;4653:25:1;;;4641:2;4626:18;76613:113:0;4507:177:1;45776:101:0;;;;;;;;;;-1:-1:-1;45854:15:0;;45776:101;;61892:335;;;;;;;;;;-1:-1:-1;61892:335:0;;;;;:::i;:::-;;:::i;40081:131::-;;;;;;;;;;-1:-1:-1;40081:131:0;;;;;:::i;:::-;40155:7;40182:12;;;:6;:12;;;;;:22;;;;40081:131;87479:256;;;;;;;;;;-1:-1:-1;87479:256:0;;;;;:::i;:::-;;:::i;49045:107::-;;;;;;;;;;-1:-1:-1;49045:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;49132:12:0;49098:13;49132:12;;;:6;:12;;;;;;;49045:107;40522:147;;;;;;;;;;-1:-1:-1;40522:147:0;;;;;:::i;:::-;;:::i;76281:256::-;;;;;;;;;;-1:-1:-1;76281:256:0;;;;;:::i;:::-;;:::i;45885:161::-;;;;;;;;;;-1:-1:-1;45999:9:0;45885:161;;41666:218;;;;;;;;;;-1:-1:-1;41666:218:0;;;;;:::i;:::-;;:::i;84055:77::-;;;;;;;;;;;;;:::i;84140:192::-;;;;;;;;;;-1:-1:-1;84140:192:0;;;;;:::i;:::-;;:::i;62298:185::-;;;;;;;;;;-1:-1:-1;62298:185:0;;;;;:::i;:::-;;:::i;89450:166::-;;;;;;;;;;-1:-1:-1;89450:166:0;;;;;:::i;:::-;;:::i;76803:233::-;;;;;;;;;;-1:-1:-1;76803:233:0;;;;;:::i;:::-;;:::i;87217:250::-;;;;;;;;;;-1:-1:-1;87217:250:0;;;;;:::i;:::-;;:::i;82442:48::-;;;;;;;;;;-1:-1:-1;82442:48:0;;;;;:::i;:::-;;:::i;82390:45::-;;;;;;;;;;-1:-1:-1;82390:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;22271:86;;;;;;;;;;-1:-1:-1;22342:7:0;;;;22271:86;;59390:223;;;;;;;;;;-1:-1:-1;59390:223:0;;;;;:::i;:::-;;:::i;88380:256::-;;;;;;;;;;-1:-1:-1;88380:256:0;;;;;:::i;:::-;;:::i;59121:207::-;;;;;;;;;;-1:-1:-1;59121:207:0;;;;;:::i;:::-;;:::i;82347:36::-;;;;;;;;;;-1:-1:-1;82347:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;83974:73;;;;;;;;;;;;;:::i;88884:333::-;;;;;;;;;;-1:-1:-1;88884:333:0;;;;;:::i;:::-;;:::i;87747:256::-;;;;;;;;;;-1:-1:-1;87747:256:0;;;;;:::i;:::-;;:::i;38554:147::-;;;;;;;;;;-1:-1:-1;38554:147:0;;;;;:::i;:::-;;:::i;59849:104::-;;;;;;;;;;;;;:::i;37659:49::-;;;;;;;;;;-1:-1:-1;37659:49:0;37704:4;37659:49;;61435:155;;;;;;;;;;-1:-1:-1;61435:155:0;;;;;:::i;:::-;;:::i;85298:444::-;;;;;;;;;;-1:-1:-1;85298:444:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;62554:322::-;;;;;;;;;;-1:-1:-1;62554:322:0;;;;;:::i;:::-;;:::i;89229:213::-;;;;;;;;;;-1:-1:-1;89229:213:0;;;;;:::i;:::-;;:::i;60024:281::-;;;;;;;;;;-1:-1:-1;60024:281:0;;;;;:::i;:::-;;:::i;82229:62::-;;;;;;;;;;;;82267:24;82229:62;;40962:149;;;;;;;;;;-1:-1:-1;40962:149:0;;;;;:::i;:::-;;:::i;88011:357::-;;;;;;;;;;-1:-1:-1;88011:357:0;;;;;:::i;:::-;;:::i;82160:62::-;;;;;;;;;;;;82198:24;82160:62;;61661:164;;;;;;;;;;-1:-1:-1;61661:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;61782:25:0;;;61758:4;61782:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;61661:164;85754:1167;;;;;;;;;;-1:-1:-1;85754:1167:0;;;;;:::i;:::-;;:::i;88644:232::-;88731:3;20464:10;87094:12;88731:3;87094:7;:12::i;:::-;-1:-1:-1;;;;;87094:28:0;;:73;;;-1:-1:-1;87126:41:0;37704:4;20464:10;38554:147;:::i;87126:41::-;87086:99;;;;-1:-1:-1;;;87086:99:0;;;;;;;:::i;:::-;;;;;;;;;88747:13:::1;::::0;;;:8:::1;:13;::::0;;;;;;:17:::1;;:24:::0;;;88782:20;88756:3;;88782:13:::1;::::0;:20:::1;::::0;88796:5;;88782:20:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:26;88842:12:::1;20464:10:::0;;20384:98;88842:12:::1;-1:-1:-1::0;;;;;88826:42:0::1;88837:3;88826:42;88856:4;88862:5;88826:42;;;;;;;:::i;:::-;;;;;;;;88644:232:::0;;;;:::o;84747:227::-;84901:4;84930:36;84954:11;84930:23;:36::i;:::-;84923:43;84747:227;-1:-1:-1;;84747:227:0:o;59680:100::-;59734:13;59767:5;59760:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59680:100;:::o;61192:171::-;61268:7;61288:23;61303:7;61288:14;:23::i;:::-;-1:-1:-1;61331:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;61331:24:0;;61192:171::o;60710:416::-;60791:13;60807:23;60822:7;60807:14;:23::i;:::-;60791:39;;60855:5;-1:-1:-1;;;;;60849:11:0;:2;-1:-1:-1;;;;;60849:11:0;;60841:57;;;;-1:-1:-1;;;60841:57:0;;14330:2:1;60841:57:0;;;14312:21:1;14369:2;14349:18;;;14342:30;14408:34;14388:18;;;14381:62;-1:-1:-1;;;14459:18:1;;;14452:31;14500:19;;60841:57:0;14128:397:1;60841:57:0;20464:10;-1:-1:-1;;;;;60933:21:0;;;;:62;;-1:-1:-1;60958:37:0;60975:5;20464:10;61661:164;:::i;60958:37::-;60911:173;;;;-1:-1:-1;;;60911:173:0;;14732:2:1;60911:173:0;;;14714:21:1;14771:2;14751:18;;;14744:30;14810:34;14790:18;;;14783:62;14881:31;14861:18;;;14854:59;14930:19;;60911:173:0;14530:425:1;60911:173:0;61097:21;61106:2;61110:7;61097:8;:21::i;:::-;60780:346;60710:416;;:::o;47471:1148::-;47729:152;;;47672:12;47729:152;;;;;-1:-1:-1;;;;;47767:19:0;;47697:29;47767:19;;;:6;:19;;;;;;;;;47729:152;;;;;;;;;;;47916:45;47774:11;47729:152;47944:4;47950;47956;47916:6;:45::i;:::-;47894:128;;;;-1:-1:-1;;;47894:128:0;;15162:2:1;47894:128:0;;;15144:21:1;15201:2;15181:18;;;15174:30;15240:34;15220:18;;;15213:62;-1:-1:-1;;;15291:18:1;;;15284:31;15332:19;;47894:128:0;14960:397:1;47894:128:0;-1:-1:-1;;;;;48111:19:0;;;;;;:6;:19;;;;;;:23;;48133:1;48111:23;:::i;:::-;-1:-1:-1;;;;;48089:19:0;;;;;;:6;:19;;;;;;;:45;;;;48152:126;;;;;48096:11;;48224:10;;48250:17;;48152:126;:::i;:::-;;;;;;;;48389:12;48403:23;48438:4;-1:-1:-1;;;;;48430:18:0;48480:17;48499:11;48463:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;48463:48:0;;;;;;;;;;48430:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48388:134;;;;48541:7;48533:48;;;;-1:-1:-1;;;48533:48:0;;16988:2:1;48533:48:0;;;16970:21:1;17027:2;17007:18;;;17000:30;17066;17046:18;;;17039:58;17114:18;;48533:48:0;16786:352:1;48533:48:0;48601:10;47471:1148;-1:-1:-1;;;;;;;;47471:1148:0:o;61892:335::-;62087:41;20464:10;62120:7;62087:18;:41::i;:::-;62079:99;;;;-1:-1:-1;;;62079:99:0;;;;;;;:::i;:::-;62191:28;62201:4;62207:2;62211:7;62191:9;:28::i;87479:256::-;87578:3;20464:10;87094:12;87578:3;87094:7;:12::i;:::-;-1:-1:-1;;;;;87094:28:0;;:73;;;-1:-1:-1;87126:41:0;37704:4;20464:10;38554:147;:::i;87126:41::-;87086:99;;;;-1:-1:-1;;;87086:99:0;;;;;;;:::i;:::-;87594:13:::1;::::0;;;:8:::1;:13;::::0;;;;:20:::1;;:30;87617:7:::0;87594:20;:30:::1;:::i;:::-;;87658:3;87635:13;87649:5;87635:20;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:26;87698:12:::1;20464:10:::0;;20384:98;87698:12:::1;-1:-1:-1::0;;;;;87679:48:0::1;87693:3;87679:48;87712:7;87721:5;87679:48;;;;;;;:::i;40522:147::-:0;40155:7;40182:12;;;:6;:12;;;;;:22;;;38150:16;38161:4;38150:10;:16::i;:::-;40636:25:::1;40647:4;40653:7;40636:10;:25::i;76281:256::-:0;76378:7;76414:23;76431:5;76414:16;:23::i;:::-;76406:5;:31;76398:87;;;;-1:-1:-1;;;76398:87:0;;20351:2:1;76398:87:0;;;20333:21:1;20390:2;20370:18;;;20363:30;20429:34;20409:18;;;20402:62;-1:-1:-1;;;20480:18:1;;;20473:41;20531:19;;76398:87:0;20149:407:1;76398:87:0;-1:-1:-1;;;;;;76503:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;76281:256::o;41666:218::-;-1:-1:-1;;;;;41762:23:0;;20464:10;41762:23;41754:83;;;;-1:-1:-1;;;41754:83:0;;20763:2:1;41754:83:0;;;20745:21:1;20802:2;20782:18;;;20775:30;20841:34;20821:18;;;20814:62;-1:-1:-1;;;20892:18:1;;;20885:45;20947:19;;41754:83:0;20561:411:1;41754:83:0;41850:26;41862:4;41868:7;41850:11;:26::i;:::-;41666:218;;:::o;84055:77::-;82198:24;38150:16;38161:4;38150:10;:16::i;:::-;84114:10:::1;:8;:10::i;:::-;84055:77:::0;:::o;84140:192::-;82267:24;38150:16;38161:4;38150:10;:16::i;:::-;84210:15:::1;84228:25;:15;964:14:::0;;872:114;84228:25:::1;84210:43;;84264:27;:15;1083:19:::0;;1101:1;1083:19;;;994:127;84264:27:::1;84302:22;84312:2;84316:7;84302:9;:22::i;62298:185::-:0;62436:39;62453:4;62459:2;62463:7;62436:39;;;;;;;;;;;;:16;:39::i;89450:166::-;89497:3;20464:10;87094:12;89497:3;87094:7;:12::i;:::-;-1:-1:-1;;;;;87094:28:0;;:73;;;-1:-1:-1;87126:41:0;37704:4;20464:10;38554:147;:::i;87126:41::-;87086:99;;;;-1:-1:-1;;;87086:99:0;;;;;;;:::i;:::-;89513:10:::1;89519:3;89513:5;:10::i;:::-;89562:1;89541:13:::0;;;:8:::1;:13;::::0;;;;;89536:23;;:4:::1;::::0;:23:::1;::::0;89541:17:::1;::::0;;::::1;::::0;89536:23:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:27;89595:12:::1;20464:10:::0;;20384:98;89595:12:::1;-1:-1:-1::0;;;;;89581:27:0::1;89590:3;89581:27;;;;;;;;;;89450:166:::0;;:::o;76803:233::-;76878:7;76914:30;76701:10;:17;;76613:113;76914:30;76906:5;:38;76898:95;;;;-1:-1:-1;;;76898:95:0;;22026:2:1;76898:95:0;;;22008:21:1;22065:2;22045:18;;;22038:30;22104:34;22084:18;;;22077:62;-1:-1:-1;;;22155:18:1;;;22148:42;22207:19;;76898:95:0;21824:408:1;76898:95:0;77011:10;77022:5;77011:17;;;;;;;;:::i;:::-;;;;;;;;;77004:24;;76803:233;;;:::o;87217:250::-;87314:3;20464:10;87094:12;87314:3;87094:7;:12::i;:::-;-1:-1:-1;;;;;87094:28:0;;:73;;;-1:-1:-1;87126:41:0;37704:4;20464:10;38554:147;:::i;87126:41::-;87086:99;;;;-1:-1:-1;;;87086:99:0;;;;;;;:::i;:::-;87330:13:::1;::::0;;;:8:::1;:13;::::0;;;;:19:::1;;:28;87352:6:::0;87330:19;:28:::1;:::i;:::-;;87392:3;87369:13;87383:5;87369:20;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:26;87431:12:::1;20464:10:::0;;20384:98;87431:12:::1;-1:-1:-1::0;;;;;87413:46:0::1;87426:3;87413:46;87445:6;87453:5;87413:46;;;;;;;:::i;82442:48::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59390:223::-;59462:7;64277:16;;;:7;:16;;;;;;-1:-1:-1;;;;;64277:16:0;;59526:56;;;;-1:-1:-1;;;59526:56:0;;22571:2:1;59526:56:0;;;22553:21:1;22610:2;22590:18;;;22583:30;-1:-1:-1;;;22629:18:1;;;22622:54;22693:18;;59526:56:0;22369:348:1;88380:256:0;88479:3;20464:10;87094:12;88479:3;87094:7;:12::i;:::-;-1:-1:-1;;;;;87094:28:0;;:73;;;-1:-1:-1;87126:41:0;37704:4;20464:10;38554:147;:::i;87126:41::-;87086:99;;;;-1:-1:-1;;;87086:99:0;;;;;;;:::i;:::-;88495:13:::1;::::0;;;:8:::1;:13;::::0;;;;:20:::1;;:30;88518:7:::0;88495:20;:30:::1;:::i;:::-;;88559:3;88536:13;88550:5;88536:20;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:26;88599:12:::1;20464:10:::0;;20384:98;88599:12:::1;-1:-1:-1::0;;;;;88580:48:0::1;88594:3;88580:48;88613:7;88622:5;88580:48;;;;;;;:::i;59121:207::-:0;59193:7;-1:-1:-1;;;;;59221:19:0;;59213:73;;;;-1:-1:-1;;;59213:73:0;;22924:2:1;59213:73:0;;;22906:21:1;22963:2;22943:18;;;22936:30;23002:34;22982:18;;;22975:62;-1:-1:-1;;;23053:18:1;;;23046:39;23102:19;;59213:73:0;22722:405:1;59213:73:0;-1:-1:-1;;;;;;59304:16:0;;;;;:9;:16;;;;;;;59121:207::o;83974:73::-;82198:24;38150:16;38161:4;38150:10;:16::i;:::-;84031:8:::1;:6;:8::i;88884:333::-:0;37704:4;38150:16;37704:4;38150:10;:16::i;:::-;89018:6:::1;89013:90;89030:4;:11;89028:1;:13;89013:90;;;89087:4;89063:8;:17;89072:4;89077:1;89072:7;;;;;;;;:::i;:::-;;;;;;;89063:17;;;;;;;;;;;:21;;:28;;;;89043:3;;;;;:::i;:::-;;;;89013:90;;;;89139:4;89115:14;89130:5;89115:21;;;;;;:::i;:::-;;;;;;;;;;;;;:28;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;89161:48:0::1;::::0;20464:10;;89161:48:::1;::::0;89177:4;;89161:48:::1;:::i;:::-;;;;;;;;;89197:4;89203:5;89161:48;;;;;;;:::i;87747:256::-:0;87842:3;20464:10;87094:12;87842:3;87094:7;:12::i;:::-;-1:-1:-1;;;;;87094:28:0;;:73;;;-1:-1:-1;87126:41:0;37704:4;20464:10;38554:147;:::i;87126:41::-;87086:99;;;;-1:-1:-1;;;87086:99:0;;;;;;;:::i;:::-;87858:13:::1;::::0;;;:8:::1;:13;::::0;;;;;;:21:::1;;:32:::0;;;87901:20;87867:3;;87901:13:::1;::::0;:20:::1;::::0;87915:5;;87901:20:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:26;87965:12:::1;20464:10:::0;;20384:98;87965:12:::1;-1:-1:-1::0;;;;;87945:50:0::1;87960:3;87945:50;87979:8;87989:5;87945:50;;;;;;;:::i;38554:147::-:0;38640:4;38664:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;38664:29:0;;;;;;;;;;;;;;;38554:147::o;59849:104::-;59905:13;59938:7;59931:14;;;;;:::i;61435:155::-;61530:52;20464:10;61563:8;61573;61530:18;:52::i;85298:444::-;85355:13;85370:18;85390;85410:19;85431:12;85445:17;85464:20;85486;85508:19;85529:15;85557:22;85582:8;:13;85591:3;85582:13;;;;;;;;;;;85557:38;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85614:12;85622:3;85614:7;:12::i;:::-;85628:4;:9;;;85639:4;:9;;;85650:4;:10;;;85662:4;:9;;;85673:4;:8;;;85683:4;:11;;;85696:4;:11;;;85709:4;:10;;;85721:4;:12;;;85606:128;;;;;;;;;;;;;;;;;;;;;85298:444;;;;;;;;;;;:::o;62554:322::-;62728:41;20464:10;62761:7;62728:18;:41::i;:::-;62720:99;;;;-1:-1:-1;;;62720:99:0;;;;;;;:::i;:::-;62830:38;62844:4;62850:2;62854:7;62863:4;62830:13;:38::i;:::-;62554:322;;;;:::o;89229:213::-;89327:3;20464:10;87094:12;89327:3;87094:7;:12::i;:::-;-1:-1:-1;;;;;87094:28:0;;:73;;;-1:-1:-1;87126:41:0;37704:4;20464:10;38554:147;:::i;87126:41::-;87086:99;;;;-1:-1:-1;;;87086:99:0;;;;;;;:::i;:::-;89366:3:::1;89343:13;89357:5;89343:20;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:26;89404:12:::1;20464:10:::0;;20384:98;89404:12:::1;-1:-1:-1::0;;;;;89387:47:0::1;89399:3;89387:47;89418:8;89428:5;89387:47;;;;;;;:::i;60024:281::-:0;60097:13;60123:23;60138:7;60123:14;:23::i;:::-;60159:21;60183:10;:8;:10::i;:::-;60159:34;;60235:1;60217:7;60211:21;:25;:86;;;;;;;;;;;;;;;;;60263:7;60272:18;:7;:16;:18::i;:::-;60246:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60211:86;60204:93;60024:281;-1:-1:-1;;;60024:281:0:o;40962:149::-;40155:7;40182:12;;;:6;:12;;;;;:22;;;38150:16;38161:4;38150:10;:16::i;:::-;41077:26:::1;41089:4;41095:7;41077:11;:26::i;88011:357::-:0;37704:4;38150:16;37704:4;38150:10;:16::i;:::-;88153:6:::1;88148:98;88165:4;:11;88163:1;:13;88148:98;;;88226:8;88198;:17;88207:4;88212:1;88207:7;;;;;;;;:::i;:::-;;;;;;;88198:17;;;;;;;;;;;:25;;:36;;;;88178:3;;;;;:::i;:::-;;;;88148:98;;;;88282:4;88258:14;88273:5;88258:21;;;;;;:::i;:::-;;;;;;;;;;;;;:28;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;88304:56:0::1;::::0;20464:10;;88304:56:::1;::::0;88324:4;;88304:56:::1;:::i;:::-;;;;;;;;;88344:8;88354:5;88304:56;;;;;;;:::i;85754:1167::-:0;82267:24;38150:16;38161:4;38150:10;:16::i;:::-;86034:4:::1;86039;86034:10;;;;;;:::i;:::-;;;;;;;;;;;;;;86048:1;86034:15;86026:46;;;::::0;-1:-1:-1;;;86026:46:0;;24523:2:1;86026:46:0::1;::::0;::::1;24505:21:1::0;24562:2;24542:18;;;24535:30;-1:-1:-1;;;24581:18:1;;;24574:48;24639:18;;86026:46:0::1;24321:342:1::0;86026:46:0::1;86091:13;86105:4;86091:19;;;;;;:::i;:::-;;;;;;;;;;;;;;86114:1;86091:24;86083:56;;;::::0;-1:-1:-1;;;86083:56:0;;24870:2:1;86083:56:0::1;::::0;::::1;24852:21:1::0;24909:2;24889:18;;;24882:30;-1:-1:-1;;;24928:18:1;;;24921:49;24987:18;;86083:56:0::1;24668:343:1::0;86083:56:0::1;86152:15;86170:25;:15;964:14:::0;;872:114;86170:25:::1;86152:43;;86206:27;:15;1083:19:::0;;1101:1;1083:19;;;994:127;86206:27:::1;86267:7;86254:4;86259;86254:10;;;;;;:::i;:::-;;;;;;;;;;;;;:20;;;;86308:7;86285:13;86299:5;86285:20;;;;;;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:30;;;;86328:17:::1;::::0;;;:8:::1;:17:::0;;;;:30:::1;86353:5:::0;86328:17;:30:::1;:::i;:::-;-1:-1:-1::0;86369:17:0::1;::::0;;;:8:::1;:17;::::0;;;;:22:::1;;:30;86394:5:::0;86369:22;:30:::1;:::i;:::-;-1:-1:-1::0;86410:17:0::1;::::0;;;:8:::1;:17;::::0;;;;:23:::1;;:32;86436:6:::0;86410:23;:32:::1;:::i;:::-;-1:-1:-1::0;86453:17:0::1;::::0;;;:8:::1;:17;::::0;;;;:22:::1;::::0;::::1;:30:::0;;;86494:21:::1;;:28;86518:4:::0;86494:21;:28:::1;:::i;:::-;-1:-1:-1::0;86533:17:0::1;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;:34;86560:7:::0;86533:24;:34:::1;:::i;:::-;-1:-1:-1::0;86578:17:0::1;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;:34;86605:7:::0;86578:24;:34:::1;:::i;:::-;-1:-1:-1::0;86623:17:0::1;::::0;;;:8:::1;:17;::::0;;;;:23:::1;;:32;86649:6:::0;86623:23;:32:::1;:::i;:::-;-1:-1:-1::0;86666:17:0::1;::::0;;;:8:::1;:17;::::0;;;;:25:::1;::::0;::::1;:36:::0;;;86713:21:::1;;:28:::0;;;86762:23:::1;86772:3:::0;86675:7;86762:9:::1;:23::i;:::-;20464:10:::0;-1:-1:-1;;;;;86803:110:0::1;86814:7;86803:110;86837:5;86844;86851:6;86859:5;86866:4;86872:7;86881;86890:6;86898:8;86908:4;86803:110;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;86015:906;85754:1167:::0;;;;;;;;;;;;:::o;38258:204::-;38343:4;-1:-1:-1;;;;;;38367:47:0;;-1:-1:-1;;;38367:47:0;;:87;;;38418:36;38442:11;38418:23;:36::i;71011:135::-;64679:4;64277:16;;;:7;:16;;;;;;-1:-1:-1;;;;;64277:16:0;71085:53;;;;-1:-1:-1;;;71085:53:0;;22571:2:1;71085:53:0;;;22553:21:1;22610:2;22590:18;;;22583:30;-1:-1:-1;;;22629:18:1;;;22622:54;22693:18;;71085:53:0;22369:348:1;70290:174:0;70365:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;70365:29:0;-1:-1:-1;;;;;70365:29:0;;;;;;;;:24;;70419:23;70365:24;70419:14;:23::i;:::-;-1:-1:-1;;;;;70410:46:0;;;;;;;;;;;70290:174;;:::o;49160:486::-;49338:4;-1:-1:-1;;;;;49363:20:0;;49355:70;;;;-1:-1:-1;;;49355:70:0;;26662:2:1;49355:70:0;;;26644:21:1;26701:2;26681:18;;;26674:30;26740:34;26720:18;;;26713:62;-1:-1:-1;;;26791:18:1;;;26784:35;26836:19;;49355:70:0;26460:401:1;49355:70:0;49479:159;49507:47;49526:27;49546:6;49526:19;:27::i;:::-;49507:18;:47::i;:::-;49479:159;;;;;;;;;;;;27093:25:1;;;;27166:4;27154:17;;27134:18;;;27127:45;27188:18;;;27181:34;;;27231:18;;;27224:34;;;27065:19;;49479:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49456:182:0;:6;-1:-1:-1;;;;;49456:182:0;;49436:202;;49160:486;;;;;;;:::o;64909:264::-;65002:4;65019:13;65035:23;65050:7;65035:14;:23::i;:::-;65019:39;;65088:5;-1:-1:-1;;;;;65077:16:0;:7;-1:-1:-1;;;;;65077:16:0;;:52;;;-1:-1:-1;;;;;;61782:25:0;;;61758:4;61782:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;65097:32;65077:87;;;;65157:7;-1:-1:-1;;;;;65133:31:0;:20;65145:7;65133:11;:20::i;:::-;-1:-1:-1;;;;;65133:31:0;;65077:87;65069:96;64909:264;-1:-1:-1;;;;64909:264:0:o;68908:1263::-;69067:4;-1:-1:-1;;;;;69040:31:0;:23;69055:7;69040:14;:23::i;:::-;-1:-1:-1;;;;;69040:31:0;;69032:81;;;;-1:-1:-1;;;69032:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;69132:16:0;;69124:65;;;;-1:-1:-1;;;69124:65:0;;27877:2:1;69124:65:0;;;27859:21:1;27916:2;27896:18;;;27889:30;27955:34;27935:18;;;27928:62;-1:-1:-1;;;28006:18:1;;;27999:34;28050:19;;69124:65:0;27675:400:1;69124:65:0;69202:42;69223:4;69229:2;69233:7;69242:1;69202:20;:42::i;:::-;69374:4;-1:-1:-1;;;;;69347:31:0;:23;69362:7;69347:14;:23::i;:::-;-1:-1:-1;;;;;69347:31:0;;69339:81;;;;-1:-1:-1;;;69339:81:0;;;;;;;:::i;:::-;69492:24;;;;:15;:24;;;;;;;;69485:31;;-1:-1:-1;;;;;;69485:31:0;;;;;;-1:-1:-1;;;;;69968:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;69968:20:0;;;70003:13;;;;;;;;;:18;;69485:31;70003:18;;;70043:16;;;:7;:16;;;;;;:21;;;;;;;;;;70082:27;;69508:7;;70082:27;;;60780:346;60710:416;;:::o;39005:105::-;39072:30;39083:4;20464:10;39072;:30::i;43263:238::-;43347:22;43355:4;43361:7;43347;:22::i;:::-;43342:152;;43386:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;43386:29:0;;;;;;;;;:36;;-1:-1:-1;;43386:36:0;43418:4;43386:36;;;43469:12;20464:10;;20384:98;43469:12;-1:-1:-1;;;;;43442:40:0;43460:7;-1:-1:-1;;;;;43442:40:0;43454:4;43442:40;;;;;;;;;;43263:238;;:::o;43681:239::-;43765:22;43773:4;43779:7;43765;:22::i;:::-;43761:152;;;43836:5;43804:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;43804:29:0;;;;;;;;;;:37;;-1:-1:-1;;43804:37:0;;;43861:40;20464:10;;43804:12;;43861:40;;43836:5;43861:40;43681:239;;:::o;23126:120::-;22135:16;:14;:16::i;:::-;23185:7:::1;:15:::0;;-1:-1:-1;;23185:15:0::1;::::0;;23216:22:::1;20464:10:::0;23225:12:::1;23216:22;::::0;-1:-1:-1;;;;;3108:32:1;;;3090:51;;3078:2;3063:18;23216:22:0::1;;;;;;;23126:120::o:0;65515:110::-;65591:26;65601:2;65605:7;65591:26;;;;;;;;;;;;:9;:26::i;67788:783::-;67848:13;67864:23;67879:7;67864:14;:23::i;:::-;67848:39;;67900:51;67921:5;67936:1;67940:7;67949:1;67900:20;:51::i;:::-;68064:23;68079:7;68064:14;:23::i;:::-;68135:24;;;;:15;:24;;;;;;;;68128:31;;-1:-1:-1;;;;;;68128:31:0;;;;;;-1:-1:-1;;;;;68380:16:0;;;;;:9;:16;;;;;:21;;-1:-1:-1;;68380:21:0;;;68430:16;;;:7;:16;;;;;;68423:23;;;;;;;68464:36;68056:31;;-1:-1:-1;68151:7:0;;68464:36;;68135:24;;68464:36;41666:218;;:::o;22867:118::-;21876:19;:17;:19::i;:::-;22927:7:::1;:14:::0;;-1:-1:-1;;22927:14:0::1;22937:4;22927:14;::::0;;22957:20:::1;22964:12;20464:10:::0;;20384:98;70607:315;70762:8;-1:-1:-1;;;;;70753:17:0;:5;-1:-1:-1;;;;;70753:17:0;;70745:55;;;;-1:-1:-1;;;70745:55:0;;28282:2:1;70745:55:0;;;28264:21:1;28321:2;28301:18;;;28294:30;28360:27;28340:18;;;28333:55;28405:18;;70745:55:0;28080:349:1;70745:55:0;-1:-1:-1;;;;;70811:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;70811:46:0;;;;;;;;;;70873:41;;1951::1;;;70873::0;;1924:18:1;70873:41:0;;;;;;;70607:315;;;:::o;63757:313::-;63913:28;63923:4;63929:2;63933:7;63913:9;:28::i;:::-;63960:47;63983:4;63989:2;63993:7;64002:4;63960:22;:47::i;:::-;63952:110;;;;-1:-1:-1;;;63952:110:0;;;;;;;:::i;83821:145::-;83873:13;83899:59;;;;;;;;;;;;;;;;;;;83821:145;:::o;17811:716::-;17867:13;17918:14;17935:17;17946:5;17935:10;:17::i;:::-;17955:1;17935:21;17918:38;;17971:20;18005:6;-1:-1:-1;;;;;17994:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17994:18:0;-1:-1:-1;17971:41:0;-1:-1:-1;18136:28:0;;;18152:2;18136:28;18193:288;-1:-1:-1;;18225:5:0;-1:-1:-1;;;18362:2:0;18351:14;;18346:30;18225:5;18333:44;18423:2;18414:11;;;-1:-1:-1;18444:21:0;18193:288;18444:21;-1:-1:-1;18502:6:0;17811:716;-1:-1:-1;;;17811:716:0:o;75973:224::-;76075:4;-1:-1:-1;;;;;;76099:50:0;;-1:-1:-1;;;76099:50:0;;:90;;;76153:36;76177:11;76153:23;:36::i;48627:410::-;48737:7;46807:100;;;;;;;;;;;;;;;;;46787:127;;;;;;;48891:12;;48926:11;;;;48970:24;;;;;48960:35;;;;;;48810:204;;;;;29216:25:1;;;29272:2;29257:18;;29250:34;;;;-1:-1:-1;;;;;29320:32:1;29315:2;29300:18;;29293:60;29384:2;29369:18;;29362:34;29203:3;29188:19;;28985:417;48810:204:0;;;;;;;;;;;;;48782:247;;;;;;48762:267;;48627:410;;;:::o;46415:258::-;46514:7;46616:20;45854:15;;;45776:101;46616:20;46587:63;;-1:-1:-1;;;46587:63:0;;;29665:27:1;29708:11;;;29701:27;;;;29744:12;;;29737:28;;;29781:12;;46587:63:0;29407:392:1;84412:257:0;21876:19;:17;:19::i;:::-;84605:56:::1;84632:4;84638:2;84642:7;84651:9;84605:26;:56::i;39400:492::-:0;39489:22;39497:4;39503:7;39489;:22::i;:::-;39484:401;;39677:28;39697:7;39677:19;:28::i;:::-;39778:38;39806:4;39813:2;39778:19;:38::i;:::-;39582:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;39582:257:0;;;;;;;;;;-1:-1:-1;;;39528:345:0;;;;;;;:::i;22615:108::-;22342:7;;;;22674:41;;;;-1:-1:-1;;;22674:41:0;;30823:2:1;22674:41:0;;;30805:21:1;30862:2;30842:18;;;30835:30;-1:-1:-1;;;30881:18:1;;;30874:50;30941:18;;22674:41:0;30621:344:1;22674:41:0;22615:108::o;65852:319::-;65981:18;65987:2;65991:7;65981:5;:18::i;:::-;66032:53;66063:1;66067:2;66071:7;66080:4;66032:22;:53::i;:::-;66010:153;;;;-1:-1:-1;;;66010:153:0;;;;;;;:::i;22430:108::-;22342:7;;;;22500:9;22492:38;;;;-1:-1:-1;;;22492:38:0;;31172:2:1;22492:38:0;;;31154:21:1;31211:2;31191:18;;;31184:30;-1:-1:-1;;;31230:18:1;;;31223:46;31286:18;;22492:38:0;30970:340:1;71710:853:0;71864:4;-1:-1:-1;;;;;71885:13:0;;24781:19;:23;71881:675;;71921:71;;-1:-1:-1;;;71921:71:0;;-1:-1:-1;;;;;71921:36:0;;;;;:71;;20464:10;;71972:4;;71978:7;;71987:4;;71921:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71921:71:0;;;;;;;;-1:-1:-1;;71921:71:0;;;;;;;;;;;;:::i;:::-;;;71917:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72162:6;:13;72179:1;72162:18;72158:328;;72205:60;;-1:-1:-1;;;72205:60:0;;;;;;;:::i;72158:328::-;72436:6;72430:13;72421:6;72417:2;72413:15;72406:38;71917:584;-1:-1:-1;;;;;;72043:51:0;-1:-1:-1;;;72043:51:0;;-1:-1:-1;72036:58:0;;71881:675;-1:-1:-1;72540:4:0;71710:853;;;;;;:::o;14677:922::-;14730:7;;-1:-1:-1;;;14808:15:0;;14804:102;;-1:-1:-1;;;14844:15:0;;;-1:-1:-1;14888:2:0;14878:12;14804:102;14933:6;14924:5;:15;14920:102;;14969:6;14960:15;;;-1:-1:-1;15004:2:0;14994:12;14920:102;15049:6;15040:5;:15;15036:102;;15085:6;15076:15;;;-1:-1:-1;15120:2:0;15110:12;15036:102;15165:5;15156;:14;15152:99;;15200:5;15191:14;;;-1:-1:-1;15234:1:0;15224:11;15152:99;15278:5;15269;:14;15265:99;;15313:5;15304:14;;;-1:-1:-1;15347:1:0;15337:11;15265:99;15391:5;15382;:14;15378:99;;15426:5;15417:14;;;-1:-1:-1;15460:1:0;15450:11;15378:99;15504:5;15495;:14;15491:66;;15540:1;15530:11;15585:6;14677:922;-1:-1:-1;;14677:922:0:o;58752:305::-;58854:4;-1:-1:-1;;;;;;58891:40:0;;-1:-1:-1;;;58891:40:0;;:105;;-1:-1:-1;;;;;;;58948:48:0;;-1:-1:-1;;;58948:48:0;58891:105;:158;;;-1:-1:-1;;;;;;;;;;35626:40:0;;;59013:36;35517:157;77110:915;77377:1;77365:9;:13;77361:222;;;77508:63;;-1:-1:-1;;;77508:63:0;;32265:2:1;77508:63:0;;;32247:21:1;32304:2;32284:18;;;32277:30;32343:34;32323:18;;;32316:62;-1:-1:-1;;;32394:18:1;;;32387:51;32455:19;;77508:63:0;32063:417:1;77361:222:0;77613:12;-1:-1:-1;;;;;77642:18:0;;77638:187;;77677:40;77709:7;78852:10;:17;;78825:24;;;;:15;:24;;;;;:44;;;78880:24;;;;;;;;;;;;78748:164;77677:40;77638:187;;;77747:2;-1:-1:-1;;;;;77739:10:0;:4;-1:-1:-1;;;;;77739:10:0;;77735:90;;77766:47;77799:4;77805:7;77766:32;:47::i;:::-;-1:-1:-1;;;;;77839:16:0;;77835:183;;77872:45;77909:7;77872:36;:45::i;:::-;77835:183;;;77945:4;-1:-1:-1;;;;;77939:10:0;:2;-1:-1:-1;;;;;77939:10:0;;77935:83;;77966:40;77994:2;77998:7;77966:27;:40::i;:::-;77276:749;77110:915;;;;:::o;19547:151::-;19605:13;19638:52;-1:-1:-1;;;;;19650:22:0;;17702:2;18943:447;19018:13;19044:19;19076:10;19080:6;19076:1;:10;:::i;:::-;:14;;19089:1;19076:14;:::i;:::-;-1:-1:-1;;;;;19066:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19066:25:0;;19044:47;;-1:-1:-1;;;19102:6:0;19109:1;19102:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;19102:15:0;;;;;;;;;-1:-1:-1;;;19128:6:0;19135:1;19128:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;19128:15:0;;;;;;;;-1:-1:-1;19159:9:0;19171:10;19175:6;19171:1;:10;:::i;:::-;:14;;19184:1;19171:14;:::i;:::-;19159:26;;19154:131;19191:1;19187;:5;19154:131;;;-1:-1:-1;;;19235:5:0;19243:3;19235:11;19226:21;;;;;;;:::i;:::-;;;;19214:6;19221:1;19214:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;19214:33:0;;;;;;;;-1:-1:-1;19272:1:0;19262:11;;;;;19194:3;;;:::i;:::-;;;19154:131;;;-1:-1:-1;19303:10:0;;19295:55;;;;-1:-1:-1;;;19295:55:0;;33001:2:1;19295:55:0;;;32983:21:1;;;33020:18;;;33013:30;33079:34;33059:18;;;33052:62;33131:18;;19295:55:0;32799:356:1;66507:942:0;-1:-1:-1;;;;;66587:16:0;;66579:61;;;;-1:-1:-1;;;66579:61:0;;33362:2:1;66579:61:0;;;33344:21:1;;;33381:18;;;33374:30;33440:34;33420:18;;;33413:62;33492:18;;66579:61:0;33160:356:1;66579:61:0;64679:4;64277:16;;;:7;:16;;;;;;-1:-1:-1;;;;;64277:16:0;64703:31;66651:58;;;;-1:-1:-1;;;66651:58:0;;33723:2:1;66651:58:0;;;33705:21:1;33762:2;33742:18;;;33735:30;33801;33781:18;;;33774:58;33849:18;;66651:58:0;33521:352:1;66651:58:0;66722:48;66751:1;66755:2;66759:7;66768:1;66722:20;:48::i;:::-;64679:4;64277:16;;;:7;:16;;;;;;-1:-1:-1;;;;;64277:16:0;64703:31;66860:58;;;;-1:-1:-1;;;66860:58:0;;33723:2:1;66860:58:0;;;33705:21:1;33762:2;33742:18;;;33735:30;33801;33781:18;;;33774:58;33849:18;;66860:58:0;33521:352:1;66860:58:0;-1:-1:-1;;;;;67267:13:0;;;;;;:9;:13;;;;;;;;:18;;67284:1;67267:18;;;67309:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;67309:21:0;;;;;67348:33;67317:7;;67267:13;;67348:33;;67267:13;;67348:33;41666:218;;:::o;79539:988::-;79805:22;79855:1;79830:22;79847:4;79830:16;:22::i;:::-;:26;;;;:::i;:::-;79867:18;79888:26;;;:17;:26;;;;;;79805:51;;-1:-1:-1;80021:28:0;;;80017:328;;-1:-1:-1;;;;;80088:18:0;;80066:19;80088:18;;;:12;:18;;;;;;;;:34;;;;;;;;;80139:30;;;;;;:44;;;80256:30;;:17;:30;;;;;:43;;;80017:328;-1:-1:-1;80441:26:0;;;;:17;:26;;;;;;;;80434:33;;;-1:-1:-1;;;;;80485:18:0;;;;;:12;:18;;;;;:34;;;;;;;80478:41;79539:988::o;80822:1079::-;81100:10;:17;81075:22;;81100:21;;81120:1;;81100:21;:::i;:::-;81132:18;81153:24;;;:15;:24;;;;;;81526:10;:26;;81075:46;;-1:-1:-1;81153:24:0;;81075:46;;81526:26;;;;;;:::i;:::-;;;;;;;;;81504:48;;81590:11;81565:10;81576;81565:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;81670:28;;;:15;:28;;;;;;;:41;;;81842:24;;;;;81835:31;81877:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;80893:1008;;;80822:1079;:::o;78326:221::-;78411:14;78428:20;78445:2;78428:16;:20::i;:::-;-1:-1:-1;;;;;78459:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;78504:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;78326:221:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:127:1;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:275;217:2;211:9;282:2;263:13;;-1:-1:-1;;259:27:1;247:40;;-1:-1:-1;;;;;302:34:1;;338:22;;;299:62;296:88;;;364:18;;:::i;:::-;400:2;393:22;146:275;;-1:-1:-1;146:275:1:o;426:531::-;469:5;522:3;515:4;507:6;503:17;499:27;489:55;;540:1;537;530:12;489:55;576:6;563:20;-1:-1:-1;;;;;598:2:1;595:26;592:52;;;624:18;;:::i;:::-;668:55;711:2;692:13;;-1:-1:-1;;688:27:1;717:4;684:38;668:55;:::i;:::-;748:2;739:7;732:19;794:3;787:4;782:2;774:6;770:15;766:26;763:35;760:55;;;811:1;808;801:12;760:55;876:2;869:4;861:6;857:17;850:4;841:7;837:18;824:55;924:1;899:16;;;917:4;895:27;888:38;;;;903:7;426:531;-1:-1:-1;;;426:531:1:o;962:458::-;1049:6;1057;1065;1118:2;1106:9;1097:7;1093:23;1089:32;1086:52;;;1134:1;1131;1124:12;1086:52;1170:9;1157:23;1147:33;;1227:2;1216:9;1212:18;1199:32;1189:42;;1282:2;1271:9;1267:18;1254:32;-1:-1:-1;;;;;1301:6:1;1298:30;1295:50;;;1341:1;1338;1331:12;1295:50;1364;1406:7;1397:6;1386:9;1382:22;1364:50;:::i;:::-;1354:60;;;962:458;;;;;:::o;1425:131::-;-1:-1:-1;;;;;;1499:32:1;;1489:43;;1479:71;;1546:1;1543;1536:12;1561:245;1619:6;1672:2;1660:9;1651:7;1647:23;1643:32;1640:52;;;1688:1;1685;1678:12;1640:52;1727:9;1714:23;1746:30;1770:5;1746:30;:::i;2003:250::-;2088:1;2098:113;2112:6;2109:1;2106:13;2098:113;;;2188:11;;;2182:18;2169:11;;;2162:39;2134:2;2127:10;2098:113;;;-1:-1:-1;;2245:1:1;2227:16;;2220:27;2003:250::o;2258:271::-;2300:3;2338:5;2332:12;2365:6;2360:3;2353:19;2381:76;2450:6;2443:4;2438:3;2434:14;2427:4;2420:5;2416:16;2381:76;:::i;:::-;2511:2;2490:15;-1:-1:-1;;2486:29:1;2477:39;;;;2518:4;2473:50;;2258:271;-1:-1:-1;;2258:271:1:o;2534:220::-;2683:2;2672:9;2665:21;2646:4;2703:45;2744:2;2733:9;2729:18;2721:6;2703:45;:::i;2759:180::-;2818:6;2871:2;2859:9;2850:7;2846:23;2842:32;2839:52;;;2887:1;2884;2877:12;2839:52;-1:-1:-1;2910:23:1;;2759:180;-1:-1:-1;2759:180:1:o;3152:173::-;3220:20;;-1:-1:-1;;;;;3269:31:1;;3259:42;;3249:70;;3315:1;3312;3305:12;3249:70;3152:173;;;:::o;3330:254::-;3398:6;3406;3459:2;3447:9;3438:7;3434:23;3430:32;3427:52;;;3475:1;3472;3465:12;3427:52;3498:29;3517:9;3498:29;:::i;:::-;3488:39;3574:2;3559:18;;;;3546:32;;-1:-1:-1;;;3330:254:1:o;3589:690::-;3691:6;3699;3707;3715;3723;3776:3;3764:9;3755:7;3751:23;3747:33;3744:53;;;3793:1;3790;3783:12;3744:53;3816:29;3835:9;3816:29;:::i;:::-;3806:39;;3896:2;3885:9;3881:18;3868:32;-1:-1:-1;;;;;3915:6:1;3912:30;3909:50;;;3955:1;3952;3945:12;3909:50;3978;4020:7;4011:6;4000:9;3996:22;3978:50;:::i;:::-;3968:60;;;4075:2;4064:9;4060:18;4047:32;4037:42;;4126:2;4115:9;4111:18;4098:32;4088:42;;4180:3;4169:9;4165:19;4152:33;4225:4;4218:5;4214:16;4207:5;4204:27;4194:55;;4245:1;4242;4235:12;4194:55;4268:5;4258:15;;;3589:690;;;;;;;;:::o;4871:328::-;4948:6;4956;4964;5017:2;5005:9;4996:7;4992:23;4988:32;4985:52;;;5033:1;5030;5023:12;4985:52;5056:29;5075:9;5056:29;:::i;:::-;5046:39;;5104:38;5138:2;5127:9;5123:18;5104:38;:::i;:::-;5094:48;;5189:2;5178:9;5174:18;5161:32;5151:42;;4871:328;;;;;:::o;5389:611::-;5486:6;5494;5502;5555:2;5543:9;5534:7;5530:23;5526:32;5523:52;;;5571:1;5568;5561:12;5523:52;5607:9;5594:23;5584:33;;5668:2;5657:9;5653:18;5640:32;-1:-1:-1;;;;;5732:2:1;5724:6;5721:14;5718:34;;;5748:1;5745;5738:12;5718:34;5771:50;5813:7;5804:6;5793:9;5789:22;5771:50;:::i;:::-;5761:60;;5874:2;5863:9;5859:18;5846:32;5830:48;;5903:2;5893:8;5890:16;5887:36;;;5919:1;5916;5909:12;5887:36;;5942:52;5986:7;5975:8;5964:9;5960:24;5942:52;:::i;6005:186::-;6064:6;6117:2;6105:9;6096:7;6092:23;6088:32;6085:52;;;6133:1;6130;6123:12;6085:52;6156:29;6175:9;6156:29;:::i;6196:254::-;6264:6;6272;6325:2;6313:9;6304:7;6300:23;6296:32;6293:52;;;6341:1;6338;6331:12;6293:52;6377:9;6364:23;6354:33;;6406:38;6440:2;6429:9;6425:18;6406:38;:::i;:::-;6396:48;;6196:254;;;;;:::o;6455:390::-;6533:6;6541;6594:2;6582:9;6573:7;6569:23;6565:32;6562:52;;;6610:1;6607;6600:12;6562:52;6650:9;6637:23;-1:-1:-1;;;;;6675:6:1;6672:30;6669:50;;;6715:1;6712;6705:12;6669:50;6738;6780:7;6771:6;6760:9;6756:22;6738:50;:::i;:::-;6728:60;6835:2;6820:18;;;;6807:32;;-1:-1:-1;;;;6455:390:1:o;6850:322::-;6919:6;6972:2;6960:9;6951:7;6947:23;6943:32;6940:52;;;6988:1;6985;6978:12;6940:52;7028:9;7015:23;-1:-1:-1;;;;;7053:6:1;7050:30;7047:50;;;7093:1;7090;7083:12;7047:50;7116;7158:7;7149:6;7138:9;7134:22;7116:50;:::i;7177:1216::-;7289:6;7297;7305;7358:2;7346:9;7337:7;7333:23;7329:32;7326:52;;;7374:1;7371;7364:12;7326:52;7414:9;7401:23;-1:-1:-1;;;;;7484:2:1;7476:6;7473:14;7470:34;;;7500:1;7497;7490:12;7470:34;7538:6;7527:9;7523:22;7513:32;;7583:7;7576:4;7572:2;7568:13;7564:27;7554:55;;7605:1;7602;7595:12;7554:55;7641:2;7628:16;7663:4;7686:2;7682;7679:10;7676:36;;;7692:18;;:::i;:::-;7738:2;7735:1;7731:10;7761:28;7785:2;7781;7777:11;7761:28;:::i;:::-;7823:15;;;7893:11;;;7889:20;;;7854:12;;;;7921:19;;;7918:39;;;7953:1;7950;7943:12;7918:39;7977:11;;;;7997:142;8013:6;8008:3;8005:15;7997:142;;;8079:17;;8067:30;;8030:12;;;;8117;;;;7997:142;;;8158:5;-1:-1:-1;;;8195:18:1;;8182:32;;-1:-1:-1;;8267:2:1;8252:18;;8239:32;;-1:-1:-1;8283:16:1;;;8280:36;;;8312:1;8309;8302:12;8398:347;8463:6;8471;8524:2;8512:9;8503:7;8499:23;8495:32;8492:52;;;8540:1;8537;8530:12;8492:52;8563:29;8582:9;8563:29;:::i;:::-;8553:39;;8642:2;8631:9;8627:18;8614:32;8689:5;8682:13;8675:21;8668:5;8665:32;8655:60;;8711:1;8708;8701:12;8655:60;8734:5;8724:15;;;8398:347;;;;;:::o;8750:1465::-;-1:-1:-1;;;;;9293:32:1;;9275:51;;9263:3;9357:2;9342:18;;9335:30;;;9234:4;;9388:45;9414:18;;;9406:6;9388:45;:::i;:::-;9374:59;;9481:9;9473:6;9469:22;9464:2;9453:9;9449:18;9442:50;9515:33;9541:6;9533;9515:33;:::i;:::-;9501:47;;9596:9;9588:6;9584:22;9579:2;9568:9;9564:18;9557:50;9630:33;9656:6;9648;9630:33;:::i;:::-;9616:47;;9700:6;9694:3;9683:9;9679:19;9672:35;9756:9;9748:6;9744:22;9738:3;9727:9;9723:19;9716:51;9790:33;9816:6;9808;9790:33;:::i;:::-;9776:47;;9872:9;9864:6;9860:22;9854:3;9843:9;9839:19;9832:51;9906:33;9932:6;9924;9906:33;:::i;:::-;9892:47;;9988:9;9980:6;9976:22;9970:3;9959:9;9955:19;9948:51;10022:33;10048:6;10040;10022:33;:::i;:::-;10008:47;;10104:9;10096:6;10092:22;10086:3;10075:9;10071:19;10064:51;10132:33;10158:6;10150;10132:33;:::i;:::-;10124:41;;;10202:6;10196:3;10185:9;10181:19;10174:35;8750:1465;;;;;;;;;;;;;:::o;10220:538::-;10315:6;10323;10331;10339;10392:3;10380:9;10371:7;10367:23;10363:33;10360:53;;;10409:1;10406;10399:12;10360:53;10432:29;10451:9;10432:29;:::i;:::-;10422:39;;10480:38;10514:2;10503:9;10499:18;10480:38;:::i;:::-;10470:48;;10565:2;10554:9;10550:18;10537:32;10527:42;;10620:2;10609:9;10605:18;10592:32;-1:-1:-1;;;;;10639:6:1;10636:30;10633:50;;;10679:1;10676;10669:12;10633:50;10702;10744:7;10735:6;10724:9;10720:22;10702:50;:::i;:::-;10692:60;;;10220:538;;;;;;;:::o;10763:260::-;10831:6;10839;10892:2;10880:9;10871:7;10867:23;10863:32;10860:52;;;10908:1;10905;10898:12;10860:52;10931:29;10950:9;10931:29;:::i;:::-;10921:39;;10979:38;11013:2;11002:9;10998:18;10979:38;:::i;11028:1778::-;11247:6;11255;11263;11271;11279;11287;11295;11303;11311;11319;11327:7;11381:3;11369:9;11360:7;11356:23;11352:33;11349:53;;;11398:1;11395;11388:12;11349:53;11421:29;11440:9;11421:29;:::i;:::-;11411:39;;-1:-1:-1;;;;;11536:2:1;11530;11519:9;11515:18;11502:32;11499:40;11496:60;;;11552:1;11549;11542:12;11496:60;11575:76;11643:7;11636:2;11625:9;11621:18;11608:32;11597:9;11593:48;11575:76;:::i;:::-;11565:86;;11700:2;11694;11683:9;11679:18;11666:32;11663:40;11660:60;;;11716:1;11713;11706:12;11660:60;11739:76;11807:7;11800:2;11789:9;11785:18;11772:32;11761:9;11757:48;11739:76;:::i;:::-;11729:86;;11864:2;11858;11847:9;11843:18;11830:32;11827:40;11824:60;;;11880:1;11877;11870:12;11824:60;11903:76;11971:7;11964:2;11953:9;11949:18;11936:32;11925:9;11921:48;11903:76;:::i;:::-;11893:86;;12026:3;12015:9;12011:19;11998:33;11988:43;;12081:2;12074:3;12063:9;12059:19;12046:33;12043:41;12040:61;;;12097:1;12094;12087:12;12040:61;12120:77;12189:7;12181:3;12170:9;12166:19;12153:33;12142:9;12138:49;12120:77;:::i;:::-;12110:87;;12247:2;12240:3;12229:9;12225:19;12212:33;12209:41;12206:61;;;12263:1;12260;12253:12;12206:61;12286:77;12355:7;12347:3;12336:9;12332:19;12319:33;12308:9;12304:49;12286:77;:::i;:::-;12276:87;;12413:2;12406:3;12395:9;12391:19;12378:33;12375:41;12372:61;;;12429:1;12426;12419:12;12372:61;12452:77;12521:7;12513:3;12502:9;12498:19;12485:33;12474:9;12470:49;12452:77;:::i;:::-;12442:87;;12579:2;12572:3;12561:9;12557:19;12544:33;12541:41;12538:61;;;12595:1;12592;12585:12;12538:61;;12618:77;12687:7;12679:3;12668:9;12664:19;12651:33;12640:9;12636:49;12618:77;:::i;:::-;12608:87;;12742:3;12731:9;12727:19;12714:33;12704:43;;12795:3;12784:9;12780:19;12767:33;12756:44;;11028:1778;;;;;;;;;;;;;;:::o;12811:337::-;13013:2;12995:21;;;13052:2;13032:18;;;13025:30;-1:-1:-1;;;13086:2:1;13071:18;;13064:43;13139:2;13124:18;;12811:337::o;13153:289::-;13284:3;13322:6;13316:13;13338:66;13397:6;13392:3;13385:4;13377:6;13373:17;13338:66;:::i;:::-;13420:16;;;;;13153:289;-1:-1:-1;;13153:289:1:o;13447:291::-;13624:6;13613:9;13606:25;13667:2;13662;13651:9;13647:18;13640:30;13587:4;13687:45;13728:2;13717:9;13713:18;13705:6;13687:45;:::i;13743:380::-;13822:1;13818:12;;;;13865;;;13886:61;;13940:4;13932:6;13928:17;13918:27;;13886:61;13993:2;13985:6;13982:14;13962:18;13959:38;13956:161;;14039:10;14034:3;14030:20;14027:1;14020:31;14074:4;14071:1;14064:15;14102:4;14099:1;14092:15;13956:161;;13743:380;;;:::o;15362:127::-;15423:10;15418:3;15414:20;15411:1;15404:31;15454:4;15451:1;15444:15;15478:4;15475:1;15468:15;15494:125;15559:9;;;15580:10;;;15577:36;;;15593:18;;:::i;15624:432::-;-1:-1:-1;;;;;15881:15:1;;;15863:34;;15933:15;;15928:2;15913:18;;15906:43;15985:2;15980;15965:18;;15958:30;;;15806:4;;16005:45;;16031:18;;16023:6;16005:45;:::i;:::-;15997:53;15624:432;-1:-1:-1;;;;;15624:432:1:o;16061:428::-;16218:3;16256:6;16250:13;16272:66;16331:6;16326:3;16319:4;16311:6;16307:17;16272:66;:::i;:::-;16407:2;16403:15;;;;-1:-1:-1;;16399:53:1;16360:16;;;;16385:68;;;16480:2;16469:14;;16061:428;-1:-1:-1;;16061:428:1:o;17143:409::-;17345:2;17327:21;;;17384:2;17364:18;;;17357:30;17423:34;17418:2;17403:18;;17396:62;-1:-1:-1;;;17489:2:1;17474:18;;17467:43;17542:3;17527:19;;17143:409::o;17683:545::-;17785:2;17780:3;17777:11;17774:448;;;17821:1;17846:5;17842:2;17835:17;17891:4;17887:2;17877:19;17961:2;17949:10;17945:19;17942:1;17938:27;17932:4;17928:38;17997:4;17985:10;17982:20;17979:47;;;-1:-1:-1;18020:4:1;17979:47;18075:2;18070:3;18066:12;18063:1;18059:20;18053:4;18049:31;18039:41;;18130:82;18148:2;18141:5;18138:13;18130:82;;;18193:17;;;18174:1;18163:13;18130:82;;;18134:3;;;17683:545;;;:::o;18404:1352::-;18530:3;18524:10;-1:-1:-1;;;;;18549:6:1;18546:30;18543:56;;;18579:18;;:::i;:::-;18608:97;18698:6;18658:38;18690:4;18684:11;18658:38;:::i;:::-;18652:4;18608:97;:::i;:::-;18760:4;;18824:2;18813:14;;18841:1;18836:663;;;;19543:1;19560:6;19557:89;;;-1:-1:-1;19612:19:1;;;19606:26;19557:89;-1:-1:-1;;18361:1:1;18357:11;;;18353:24;18349:29;18339:40;18385:1;18381:11;;;18336:57;19659:81;;18806:944;;18836:663;17630:1;17623:14;;;17667:4;17654:18;;-1:-1:-1;;18872:20:1;;;18990:236;19004:7;19001:1;18998:14;18990:236;;;19093:19;;;19087:26;19072:42;;19185:27;;;;19153:1;19141:14;;;;19020:19;;18990:236;;;18994:3;19254:6;19245:7;19242:19;19239:201;;;19315:19;;;19309:26;-1:-1:-1;;19398:1:1;19394:14;;;19410:3;19390:24;19386:37;19382:42;19367:58;19352:74;;19239:201;-1:-1:-1;;;;;19486:1:1;19470:14;;;19466:22;19453:36;;-1:-1:-1;18404:1352:1:o;19761:383::-;19958:2;19947:9;19940:21;19921:4;19984:45;20025:2;20014:9;20010:18;20002:6;19984:45;:::i;:::-;20077:9;20069:6;20065:22;20060:2;20049:9;20045:18;20038:50;20105:33;20131:6;20123;20105:33;:::i;20977:842::-;21105:3;21134:1;21167:6;21161:13;21197:36;21223:9;21197:36;:::i;:::-;21252:1;21269:18;;;21296:133;;;;21443:1;21438:356;;;;21262:532;;21296:133;-1:-1:-1;;21329:24:1;;21317:37;;21402:14;;21395:22;21383:35;;21374:45;;;-1:-1:-1;21296:133:1;;21438:356;21469:6;21466:1;21459:17;21499:4;21544:2;21541:1;21531:16;21569:1;21583:165;21597:6;21594:1;21591:13;21583:165;;;21675:14;;21662:11;;;21655:35;21718:16;;;;21612:10;;21583:165;;;21587:3;;;21777:6;21772:3;21768:16;21761:23;;21262:532;-1:-1:-1;21810:3:1;;20977:842;-1:-1:-1;;;;;;20977:842:1:o;22237:127::-;22298:10;22293:3;22289:20;22286:1;22279:31;22329:4;22326:1;22319:15;22353:4;22350:1;22343:15;23132:135;23171:3;23192:17;;;23189:43;;23212:18;;:::i;:::-;-1:-1:-1;23259:1:1;23248:13;;23132:135::o;23272:543::-;23490:13;;23433:3;;23464;;23543:4;23570:15;;;23433:3;23613:175;23627:6;23624:1;23621:13;23613:175;;;23690:13;;23676:28;;23726:14;;;;23763:15;;;;23649:1;23642:9;23613:175;;23820:496;23999:3;24037:6;24031:13;24053:66;24112:6;24107:3;24100:4;24092:6;24088:17;24053:66;:::i;:::-;24182:13;;24141:16;;;;24204:70;24182:13;24141:16;24251:4;24239:17;;24204:70;:::i;:::-;24290:20;;23820:496;-1:-1:-1;;;;23820:496:1:o;25016:1439::-;25500:4;25529:3;25559:2;25548:9;25541:21;25585:45;25626:2;25615:9;25611:18;25603:6;25585:45;:::i;:::-;25571:59;;25678:9;25670:6;25666:22;25661:2;25650:9;25646:18;25639:50;25712:33;25738:6;25730;25712:33;:::i;:::-;25698:47;;25793:9;25785:6;25781:22;25776:2;25765:9;25761:18;25754:50;25827:33;25853:6;25845;25827:33;:::i;:::-;25813:47;;25896:6;25891:2;25880:9;25876:18;25869:34;25952:9;25944:6;25940:22;25934:3;25923:9;25919:19;25912:51;25986:33;26012:6;26004;25986:33;:::i;:::-;25972:47;;26068:9;26060:6;26056:22;26050:3;26039:9;26035:19;26028:51;26102:33;26128:6;26120;26102:33;:::i;:::-;26088:47;;26184:9;26176:6;26172:22;26166:3;26155:9;26151:19;26144:51;26218:33;26244:6;26236;26218:33;:::i;:::-;26204:47;;26300:9;26292:6;26288:22;26282:3;26271:9;26267:19;26260:51;26328:33;26354:6;26346;26328:33;:::i;:::-;26392:3;26377:19;;26370:35;;;;-1:-1:-1;;26436:3:1;26421:19;26414:35;26320:41;25016:1439;-1:-1:-1;;;;;;;;25016:1439:1:o;27269:401::-;27471:2;27453:21;;;27510:2;27490:18;;;27483:30;27549:34;27544:2;27529:18;;27522:62;-1:-1:-1;;;27615:2:1;27600:18;;27593:35;27660:3;27645:19;;27269:401::o;28434:414::-;28636:2;28618:21;;;28675:2;28655:18;;;28648:30;28714:34;28709:2;28694:18;;28687:62;-1:-1:-1;;;28780:2:1;28765:18;;28758:48;28838:3;28823:19;;28434:414::o;29804:812::-;30215:25;30210:3;30203:38;30185:3;30270:6;30264:13;30286:75;30354:6;30349:2;30344:3;30340:12;30333:4;30325:6;30321:17;30286:75;:::i;:::-;-1:-1:-1;;;30420:2:1;30380:16;;;30412:11;;;30405:40;30470:13;;30492:76;30470:13;30554:2;30546:11;;30539:4;30527:17;;30492:76;:::i;:::-;30588:17;30607:2;30584:26;;29804:812;-1:-1:-1;;;;29804:812:1:o;31315:489::-;-1:-1:-1;;;;;31584:15:1;;;31566:34;;31636:15;;31631:2;31616:18;;31609:43;31683:2;31668:18;;31661:34;;;31731:3;31726:2;31711:18;;31704:31;;;31509:4;;31752:46;;31778:19;;31770:6;31752:46;:::i;:::-;31744:54;31315:489;-1:-1:-1;;;;;;31315:489:1:o;31809:249::-;31878:6;31931:2;31919:9;31910:7;31906:23;31902:32;31899:52;;;31947:1;31944;31937:12;31899:52;31979:9;31973:16;31998:30;32022:5;31998:30;:::i;32485:168::-;32558:9;;;32589;;32606:15;;;32600:22;;32586:37;32576:71;;32627:18;;:::i;32658:136::-;32697:3;32725:5;32715:39;;32734:18;;:::i;:::-;-1:-1:-1;;;32770:18:1;;32658:136::o;33878:128::-;33945:9;;;33966:11;;;33963:37;;;33980:18;;:::i;34011:127::-;34072:10;34067:3;34063:20;34060:1;34053:31;34103:4;34100:1;34093:15;34127:4;34124:1;34117:15
Swarm Source
ipfs://37fa0267e10743df7d005984dfdd7a794858c57dd5939a0aa8c42ffe547253b5
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|