Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MintableEditionsFreePhasesGlobalUserLimit
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-03-07 */ // SPDX-License-Identifier: MIT pragma solidity =0.8.9; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @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; } /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 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); } } } /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Internal function that returns the initialized version. Returns `_initialized` */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Internal function that returns the initialized version. Returns `_initializing` */ function _isInitializing() internal view returns (bool) { return _initializing; } } /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } /** * @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 IERC165Upgradeable { /** * @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); } /** * @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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { 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); } } } /** * @dev String operations. */ library StringsUpgradeable { 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 = MathUpgradeable.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, MathUpgradeable.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); } } /** * @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 AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal onlyInitializing { } function __AccessControl_init_unchained() internal onlyInitializing { } 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(IAccessControlUpgradeable).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 ", StringsUpgradeable.toHexString(account), " is missing role ", StringsUpgradeable.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()); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981Upgradeable is IERC165Upgradeable { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981Upgradeable is Initializable, IERC2981Upgradeable, ERC165Upgradeable { function __ERC2981_init() internal onlyInitializing { } function __ERC2981_init_unchained() internal onlyInitializing { } struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC165Upgradeable) returns (bool) { return interfaceId == type(IERC2981Upgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981Upgradeable */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[48] private __gap; } /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURIUpgradeable is IERC1155Upgradeable { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable { using AddressUpgradeable for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ function __ERC1155_init(string memory uri_) internal onlyInitializing { __ERC1155_init_unchained(uri_); } function __ERC1155_init_unchained(string memory uri_) internal onlyInitializing { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155Upgradeable).interfaceId || interfaceId == type(IERC1155MetadataURIUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @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, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155ReceiverUpgradeable.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155ReceiverUpgradeable.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[47] private __gap; } /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155SupplyUpgradeable is Initializable, ERC1155Upgradeable { function __ERC1155Supply_init() internal onlyInitializing { } function __ERC1155Supply_init_unchained() internal onlyInitializing { } mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155SupplyUpgradeable.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 supply = _totalSupply[id]; require(supply >= amount, "ERC1155: burn amount exceeds totalSupply"); unchecked { _totalSupply[id] = supply - amount; } } } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } abstract contract AccessControlUpgradeableEx is AccessControlUpgradeable { function modifyRoleBatch( bytes32 _role, address[] calldata _addList, address[] calldata _removeList ) external onlyRole(getRoleAdmin(_role)) { require(_addList.length != 0 || _removeList.length != 0, "Empty modify role lists"); _modifyRoleBatch(_role, _addList, _removeList); } function _modifyRoleBatch( bytes32 _role, address[] calldata _addList, address[] calldata _removeList ) internal virtual { _grantRoleBatch(_role, _addList); _revokeRoleBatch(_role, _removeList); } function _grantRoleBatch(bytes32 _role, address[] calldata _addressList) internal virtual { for (uint16 i = 0; i < _addressList.length; ++i) { _grantRole(_role, _addressList[i]); } } function _revokeRoleBatch(bytes32 _role, address[] calldata _addressList) internal virtual { for (uint16 i = 0; i < _addressList.length; ++i) { _revokeRole(_role, _addressList[i]); } } function _grantRole(bytes32 _role, address _account) internal virtual override { require(_account != address(0), "Unable to grant role to zero address"); super._grantRole(_role, _account); } function _revokeRole(bytes32 _role, address _account) internal virtual override { require(_account != address(0), "Unable to revoke role from zero address"); super._revokeRole(_role, _account); } } struct AssetRoyalty { uint256 assetId; address receiver; uint96 percentage; } struct AssetAmount { uint256 assetId; uint256 amount; } struct Phase { uint256 startTimestamp; // may be zero = always started uint256 endTimestamp; // may be zero = never ended address allowlistSigner; // may be address(0) = anybody can mint } struct PhaseSettings { uint256 phaseId; uint256 startTimestamp; // may be zero = always started uint256 endTimestamp; // may be zero = never ended address allowlistSigner; // may be address(0) = anybody can mint } contract MintableEditionsFreePhasesGlobalUserLimit is ERC1155SupplyUpgradeable, ERC2981Upgradeable, AccessControlUpgradeableEx { uint96 private constant PERCENTAGE_100 = 100_000; mapping(uint256/*asset id*/ => uint256/*max supply*/) public maxSupply_; mapping(uint256/*phase id*/ => Phase) public phases_; mapping(uint256/*asset id*/ => uint256/*amount*/) public maxAmountsForOneUser_; mapping(uint256/*asset id*/ => mapping(address/*user*/ => uint256/*amount*/)) public mintedAmounts_; event SetDefaultRoyalty(address indexed operator, address indexed receiver, uint96 percentage); event SetTokenRoyalties(address indexed operator, AssetRoyalty[] royalties); function version() external pure returns (string memory) { return "MintableEditionsFreePhasesGlobalUserLimit v1"; } constructor() { _disableInitializers(); } function initialize( string memory _uri, address _admin, address _defaultRoyaltyReceiver, uint96 _defaultRoyaltyPercentage, AssetAmount[] calldata _maxSupplies, AssetAmount[] calldata _maxAmountsForOneUser, PhaseSettings[] calldata _phases ) external initializer { __ERC1155_init(_uri); _grantRole(DEFAULT_ADMIN_ROLE, _admin); if (_defaultRoyaltyReceiver != address(0)) { _setDefaultRoyalty(_defaultRoyaltyReceiver, _defaultRoyaltyPercentage); } else { require(_defaultRoyaltyPercentage == 0, "ME-1: invalid default royalty"); } emit SetDefaultRoyalty(address(0), _defaultRoyaltyReceiver, _defaultRoyaltyPercentage); _setMaxSupplies(_maxSupplies); _setMaxAmountsForOneUser(_maxAmountsForOneUser); _setPhases(_phases); } function setUri(string memory _uri) external onlyRole(DEFAULT_ADMIN_ROLE) { _setURI(_uri); } function _feeDenominator() internal pure virtual override returns (uint96) { return PERCENTAGE_100; } function setDefaultRoyalty(address _receiver, uint96 _percentage) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultRoyalty(_receiver, _percentage); emit SetDefaultRoyalty(_msgSender(), _receiver, _percentage); } function deleteDefaultRoyalty() external onlyRole(DEFAULT_ADMIN_ROLE) { _deleteDefaultRoyalty(); emit SetDefaultRoyalty(_msgSender(), address(0), 0); } function setTokenRoyalties(AssetRoyalty[] calldata _royalties) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_royalties.length != 0, "ME-2: empty data"); for (uint256 i; i < _royalties.length; ) { if (_royalties[i].receiver == address(0)) { require(_royalties[i].percentage == 0, "ME-3: invalid token royalty"); _resetTokenRoyalty(_royalties[i].assetId); } else { require(_royalties[i].percentage != 0, "ME-4: invalid token royalty"); _setTokenRoyalty(_royalties[i].assetId, _royalties[i].receiver, _royalties[i].percentage); } unchecked { ++i; } } emit SetTokenRoyalties(_msgSender(), _royalties); } function setMaxSupplies(AssetAmount[] calldata _maxSupplies) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_maxSupplies.length != 0, "ME-5: empty data"); _setMaxSupplies(_maxSupplies); } function _setMaxSupplies(AssetAmount[] calldata _maxSupplies) private { for (uint256 i; i < _maxSupplies.length; ) { maxSupply_[_maxSupplies[i].assetId] = _maxSupplies[i].amount; unchecked { ++i; } } } function setPhases(PhaseSettings[] calldata _phases) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_phases.length != 0, "ME-6: empty data"); _setPhases(_phases); } function _setPhases(PhaseSettings[] calldata _phases) private { for (uint256 i; i < _phases.length; ) { _validateTimePeriod(_phases[i].startTimestamp, _phases[i].endTimestamp); _setPhaseSettings(_phases[i].phaseId, _phases[i]); unchecked { ++i; } } } function _validateTimePeriod(uint256 _startTimestamp, uint256 _endTimestamp) private pure { require( _startTimestamp == 0 || _endTimestamp == 0 || _startTimestamp < _endTimestamp, "ME-7: invalid phase time period" ); } function _setPhaseSettings(uint256 _phaseId, PhaseSettings calldata _settings) private { Phase storage phase = phases_[_phaseId]; phase.startTimestamp = _settings.startTimestamp; phase.endTimestamp = _settings.endTimestamp; phase.allowlistSigner = _settings.allowlistSigner; } function setTimePeriod( uint256 _phaseId, uint256 _startTimestamp, uint256 _endTimestamp ) external onlyRole(DEFAULT_ADMIN_ROLE) { _validateTimePeriod(_startTimestamp, _endTimestamp); phases_[_phaseId].startTimestamp = _startTimestamp; phases_[_phaseId].endTimestamp = _endTimestamp; } function setMaxAmountsForOneUser( AssetAmount[] calldata _maxAmountsForOneUser ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setMaxAmountsForOneUser(_maxAmountsForOneUser); } function _setMaxAmountsForOneUser(AssetAmount[] calldata _limits) private { for (uint256 i; i < _limits.length; ) { maxAmountsForOneUser_[_limits[i].assetId] = _limits[i].amount; unchecked { ++i; } } } function setAllowlistSigner(uint256 _phaseId, address _signer) external onlyRole(DEFAULT_ADMIN_ROLE) { _setAllowlistSigner(_phaseId, _signer); } function _setAllowlistSigner(uint256 _phaseId, address _signer) private { phases_[_phaseId].allowlistSigner = _signer; } function _beforeTokenTransfer( address _operator, address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data ) internal virtual override { super._beforeTokenTransfer(_operator, _from, _to, _ids, _amounts, _data); if (_from != address(0)) return; // only minting for (uint256 i; i < _ids.length; ) { require(totalSupply(_ids[i]) + _amounts[i] <= maxSupply_[_ids[i]], "ME-8: max supply exceeded"); unchecked { ++i; } } } function getAvailableForMintAmounts( address _recipient, uint256[] calldata _assetIds ) external view returns ( uint256[] memory ) { uint256[] memory availableAmounts = new uint256[](_assetIds.length); for (uint256 i; i < _assetIds.length; ) { availableAmounts[i] = _safeSub( maxAmountsForOneUser_[_assetIds[i]], mintedAmounts_[_assetIds[i]][_recipient] ); if (availableAmounts[i] != 0) { availableAmounts[i] = _min( _safeSub(maxSupply_[_assetIds[i]], totalSupply(_assetIds[i])), availableAmounts[i] ); } unchecked { ++i; } } return availableAmounts; } function mint( uint256 _phaseId, address _recipient, uint256[] calldata _assetIds, uint256[] calldata _amounts, bytes calldata _data, bytes calldata _signature ) external { require(_assetIds.length != 0, "ME-9: empty data"); require(_assetIds.length == _amounts.length, "ME-10: asset ids and amounts length mismatch"); Phase storage phase = phases_[_phaseId]; require(_isPhaseTimestamp(phase, block.timestamp), "ME-11: phase not active"); if (!hasRole(DEFAULT_ADMIN_ROLE, _msgSender())) { address requiredSigner = phase.allowlistSigner; if (requiredSigner != address(0)) { _verifyAllowlistSignature( abi.encode(_phaseId, _recipient, _assetIds, _amounts, _data), requiredSigner, _signature ); } } for (uint256 i; i < _assetIds.length; ) { require(_amounts[i] != 0, "ME-12: zero mint amount"); _addMintedAmount(_recipient, _assetIds[i], _amounts[i]); unchecked { ++i; } } _mintTo(_recipient, _assetIds, _amounts, _data); } function _isPhaseTimestamp(Phase storage _phase, uint256 _timestamp) private view returns (bool) { uint256 startTimestamp = _phase.startTimestamp; uint256 endTimestamp = _phase.endTimestamp; return (startTimestamp == 0 || _timestamp >= startTimestamp) && (endTimestamp == 0 || _timestamp <= endTimestamp); } function _addMintedAmount(address _recipient, uint256 _assetId, uint256 _amount) private { uint256 maxAmount = maxAmountsForOneUser_[_assetId]; uint256 mintedAmount = mintedAmounts_[_assetId][_recipient]; require(mintedAmount + _amount <= maxAmount, "ME-13: mint amount exceeds individual limit"); mintedAmounts_[_assetId][_recipient] = mintedAmount + _amount; } function _mintTo( address _recipient, uint256[] calldata _assetIds, uint256[] calldata _amounts, bytes calldata _data ) private { if (_assetIds.length == 1) { _mint(_recipient, _assetIds[0], _amounts[0], _data); } else { _mintBatch(_recipient, _assetIds, _amounts, _data); } } function _verifyAllowlistSignature( bytes memory _data, address _requiredSigner, bytes calldata _signature ) private view { require(_requiredSigner == _getMessageSigner(_data, _signature), "ME-14: invalid signature"); } function _getMessageSigner(bytes memory _data, bytes calldata _signature) private view returns (address) { string memory message = string(abi.encode(block.chainid, address(this), _data)); bytes32 messageHash = keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(message))) ); return _recover(messageHash, _signature); } function _recover(bytes32 _hash, bytes memory _sig) private pure returns (address) { bytes32 r; bytes32 s; uint8 v; if (_sig.length != 65) return address(0); assembly { r := mload(add(_sig, 32)) s := mload(add(_sig, 64)) v := byte(0, mload(add(_sig, 96))) } if (v < 27) v += 27; if (v != 27 && v != 28) return address(0); return ecrecover(_hash, v, r, s); } function _safeSub(uint256 _value, uint256 _sub) private pure returns (uint256) { unchecked { return _value > _sub ? _value - _sub : 0; } } function _min(uint256 _a, uint256 _b) private pure returns (uint256) { return _a <= _b ? _a : _b; } function supportsInterface( bytes4 _interfaceId ) public view virtual override( ERC1155Upgradeable, ERC2981Upgradeable, AccessControlUpgradeable ) returns (bool) { return ERC1155Upgradeable.supportsInterface(_interfaceId) || ERC2981Upgradeable.supportsInterface(_interfaceId) || AccessControlUpgradeable.supportsInterface(_interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint96","name":"percentage","type":"uint96"}],"name":"SetDefaultRoyalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"components":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"percentage","type":"uint96"}],"indexed":false,"internalType":"struct AssetRoyalty[]","name":"royalties","type":"tuple[]"}],"name":"SetTokenRoyalties","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256[]","name":"_assetIds","type":"uint256[]"}],"name":"getAvailableForMintAmounts","outputs":[{"internalType":"uint256[]","name":"","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":"_uri","type":"string"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_defaultRoyaltyReceiver","type":"address"},{"internalType":"uint96","name":"_defaultRoyaltyPercentage","type":"uint96"},{"components":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct AssetAmount[]","name":"_maxSupplies","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct AssetAmount[]","name":"_maxAmountsForOneUser","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"phaseId","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"address","name":"allowlistSigner","type":"address"}],"internalType":"struct PhaseSettings[]","name":"_phases","type":"tuple[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxAmountsForOneUser_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupply_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256[]","name":"_assetIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"mintedAmounts_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address[]","name":"_addList","type":"address[]"},{"internalType":"address[]","name":"_removeList","type":"address[]"}],"name":"modifyRoleBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"phases_","outputs":[{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"address","name":"allowlistSigner","type":"address"}],"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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"},{"internalType":"address","name":"_signer","type":"address"}],"name":"setAllowlistSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_percentage","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct AssetAmount[]","name":"_maxAmountsForOneUser","type":"tuple[]"}],"name":"setMaxAmountsForOneUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct AssetAmount[]","name":"_maxSupplies","type":"tuple[]"}],"name":"setMaxSupplies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"phaseId","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"address","name":"allowlistSigner","type":"address"}],"internalType":"struct PhaseSettings[]","name":"_phases","type":"tuple[]"}],"name":"setPhases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"}],"name":"setTimePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"percentage","type":"uint96"}],"internalType":"struct AssetRoyalty[]","name":"_royalties","type":"tuple[]"}],"name":"setTokenRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUri","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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200001c62000022565b620000e4565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e2576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6140cc80620000f46000396000f3fe608060405234801561001057600080fd5b50600436106102105760003560e01c80635aa0ca5d11610125578063a22cb465116100ad578063cead13221161007c578063cead132214610529578063d547741f1461054a578063de2c8fc21461055d578063e985e9c514610570578063f242432a146105ac57600080fd5b8063a22cb465146104db578063aa1b103f146104ee578063bd85b039146104f6578063c4758b171461051657600080fd5b80638f35d656116100f45780638f35d6561461048757806391d148541461049a578063978f47c6146104ad5780639b642de1146104c0578063a217fddf146104d357600080fd5b80635aa0ca5d146104225780636a084178146104355780637d62253214610448578063862b68f41461045b57600080fd5b80632eb2c2d6116101a85780633a430b99116101775780633a430b99146103a457806341326f44146103c55780634e1273f4146103d85780634f558e79146103f857806354fd4d501461041a57600080fd5b80632eb2c2d6146103585780632f2ff15d1461036b57806336568abe1461037e57806338a365a71461039157600080fd5b80630e89341c116101e45780630e89341c146102d05780631f456df5146102f0578063248a9ca3146103035780632a55205a1461032657600080fd5b8062fdd58e1461021557806301ffc9a71461023b57806304634d8d1461025e578063077b6fed14610273575b600080fd5b610228610223366004612f2c565b6105bf565b6040519081526020015b60405180910390f35b61024e610249366004612f6c565b61065a565b6040519015158152602001610232565b61027161026c366004612fa0565b610683565b005b6102ac610281366004612fd3565b61012e602052600090815260409020805460018201546002909201549091906001600160a01b031683565b6040805193845260208401929092526001600160a01b031690820152606001610232565b6102e36102de366004612fd3565b6106e7565b6040516102329190613044565b6102716102fe366004613057565b61077b565b610228610311366004612fd3565b600090815260fb602052604090206001015490565b610339610334366004613083565b6107aa565b604080516001600160a01b039093168352602083019190915201610232565b6102716103663660046131ee565b610859565b610271610379366004613297565b6108a5565b61027161038c366004613297565b6108cf565b61027161039f3660046132fe565b61094d565b6102286103b2366004612fd3565b61012d6020526000908152604090205481565b6102716103d33660046133c4565b6109a2565b6103eb6103e63660046134a4565b610bdd565b60405161023291906135a9565b61024e610406366004612fd3565b600090815260976020526040902054151590565b6102e3610d06565b610271610430366004613297565b610d26565b6102716104433660046135bc565b610d61565b610271610456366004613679565b610dea565b610228610469366004613297565b61013060209081526000928352604080842090915290825290205481565b6103eb610495366004613752565b610fed565b61024e6104a8366004613297565b6111b9565b6102716104bb3660046137a4565b6111e4565b6102716104ce3660046137d9565b611239565b610228600081565b6102716104e9366004613815565b61124d565b610271611258565b610228610504366004612fd3565b60009081526097602052604090205490565b6102716105243660046137a4565b6112a8565b610228610537366004612fd3565b61012f6020526000908152604090205481565b610271610558366004613297565b6112bd565b61027161056b366004613851565b6112e2565b61024e61057e3660046138c5565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205460ff1690565b6102716105ba3660046138ef565b611570565b60006001600160a01b03831661062f5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060008181526065602090815260408083206001600160a01b03861684529091529020545b92915050565b6000610665826115b5565b80610674575061067482611605565b8061065457506106548261162a565b600061068e8161164f565b610698838361165c565b6040516001600160601b03831681526001600160a01b0384169033907fa41aebb99f09dc1f2aff8e23bdcc6d073f556ac50f7cc1d1794170adc4ced4ed906020015b60405180910390a3505050565b6060606780546106f690613953565b80601f016020809104026020016040519081016040528092919081815260200182805461072290613953565b801561076f5780601f106107445761010080835404028352916020019161076f565b820191906000526020600020905b81548152906001019060200180831161075257829003601f168201915b50505050509050919050565b60006107868161164f565b6107908383611717565b50600092835261012e602052604090922090815560010155565b600082815260ca602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161081f57506040805180820190915260c9546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090620186a09061083f906001600160601b0316876139a4565b61084991906139c3565b91519350909150505b9250929050565b6001600160a01b0385163314806108755750610875853361057e565b6108915760405162461bcd60e51b8152600401610626906139e5565b61089e8585858585611778565b5050505050565b600082815260fb60205260409020600101546108c08161164f565b6108ca838361191d565b505050565b6001600160a01b038116331461093f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610626565b6109498282611989565b5050565b60006109588161164f565b816109985760405162461bcd60e51b815260206004820152601060248201526f4d452d363a20656d707479206461746160801b6044820152606401610626565b6108ca83836119f9565b866109e25760405162461bcd60e51b815260206004820152601060248201526f4d452d393a20656d707479206461746160801b6044820152606401610626565b868514610a465760405162461bcd60e51b815260206004820152602c60248201527f4d452d31303a2061737365742069647320616e6420616d6f756e7473206c656e60448201526b0cee8d040dad2e6dac2e8c6d60a31b6064820152608401610626565b60008a815261012e60205260409020610a5f8142611a88565b610aab5760405162461bcd60e51b815260206004820152601760248201527f4d452d31313a207068617365206e6f74206163746976650000000000000000006044820152606401610626565b610ab66000336111b9565b610b095760028101546001600160a01b03168015610b0757610b078c8c8c8c8c8c8c8c604051602001610af0989796959493929190613a69565b604051602081830303815290604052828686611abd565b505b60005b88811015610bc057878782818110610b2657610b26613ae1565b9050602002013560001415610b7d5760405162461bcd60e51b815260206004820152601760248201527f4d452d31323a207a65726f206d696e7420616d6f756e740000000000000000006044820152606401610626565b610bb88b8b8b84818110610b9357610b93613ae1565b905060200201358a8a85818110610bac57610bac613ae1565b90506020020135611b2e565b600101610b0c565b50610bd08a8a8a8a8a8a8a611c02565b5050505050505050505050565b60608151835114610c425760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610626565b600083516001600160401b03811115610c5d57610c5d6130a5565b604051908082528060200260200182016040528015610c86578160200160208202803683370190505b50905060005b8451811015610cfe57610cd1858281518110610caa57610caa613ae1565b6020026020010151858381518110610cc457610cc4613ae1565b60200260200101516105bf565b828281518110610ce357610ce3613ae1565b6020908102919091010152610cf781613af7565b9050610c8c565b509392505050565b60606040518060600160405280602c815260200161406b602c9139905090565b6000610d318161164f565b600083815261012e6020526040902060020180546001600160a01b0319166001600160a01b038416179055505050565b600085815260fb6020526040902060010154610d7c8161164f565b83151580610d8957508115155b610dd55760405162461bcd60e51b815260206004820152601760248201527f456d707479206d6f6469667920726f6c65206c697374730000000000000000006044820152606401610626565b610de28686868686611d2f565b505050505050565b600054610100900460ff1615808015610e0a5750600054600160ff909116105b80610e245750303b158015610e24575060005460ff166001145b610e875760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610626565b6000805460ff191660011790558015610eaa576000805461ff0019166101001790555b610eb38b611d45565b610ebe60008b61191d565b6001600160a01b03891615610edc57610ed7898961165c565b610f33565b6001600160601b03881615610f335760405162461bcd60e51b815260206004820152601d60248201527f4d452d313a20696e76616c69642064656661756c7420726f79616c74790000006044820152606401610626565b6040516001600160601b03891681526001600160a01b038a16906000907fa41aebb99f09dc1f2aff8e23bdcc6d073f556ac50f7cc1d1794170adc4ced4ed9060200160405180910390a3610f878787611d75565b610f918585611dd5565b610f9b83836119f9565b8015610bd0576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b60606000826001600160401b03811115611009576110096130a5565b604051908082528060200260200182016040528015611032578160200160208202803683370190505b50905060005b838110156111b0576110c561012f600087878581811061105a5761105a613ae1565b90506020020135815260200190815260200160002054610130600088888681811061108757611087613ae1565b9050602002013581526020019081526020016000206000896001600160a01b03166001600160a01b0316815260200190815260200160002054611e35565b8282815181106110d7576110d7613ae1565b6020026020010181815250508181815181106110f5576110f5613ae1565b60200260200101516000146111a85761118961116a61012d600088888681811061112157611121613ae1565b9050602002013581526020019081526020016000205461116588888681811061114c5761114c613ae1565b9050602002013560009081526097602052604090205490565b611e35565b83838151811061117c5761117c613ae1565b6020026020010151611e50565b82828151811061119b5761119b613ae1565b6020026020010181815250505b600101611038565b50949350505050565b600091825260fb602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60006111ef8161164f565b8161122f5760405162461bcd60e51b815260206004820152601060248201526f4d452d353a20656d707479206461746160801b6044820152606401610626565b6108ca8383611d75565b60006112448161164f565b61094982611e67565b610949338383611e7a565b60006112638161164f565b61126d600060c955565b604080516000808252915133917fa41aebb99f09dc1f2aff8e23bdcc6d073f556ac50f7cc1d1794170adc4ced4ed919081900360200190a350565b60006112b38161164f565b6108ca8383611dd5565b600082815260fb60205260409020600101546112d88161164f565b6108ca8383611989565b60006112ed8161164f565b8161132d5760405162461bcd60e51b815260206004820152601060248201526f4d452d323a20656d707479206461746160801b6044820152606401610626565b60005b8281101561152757600084848381811061134c5761134c613ae1565b90506060020160200160208101906113649190613b12565b6001600160a01b031614156114285783838281811061138557611385613ae1565b905060600201604001602081019061139d9190613b2d565b6001600160601b0316156113f35760405162461bcd60e51b815260206004820152601b60248201527f4d452d333a20696e76616c696420746f6b656e20726f79616c747900000000006044820152606401610626565b61142384848381811061140857611408613ae1565b90506060020160000135600090815260ca6020526040812055565b61151f565b83838281811061143a5761143a613ae1565b90506060020160400160208101906114529190613b2d565b6001600160601b03166114a75760405162461bcd60e51b815260206004820152601b60248201527f4d452d343a20696e76616c696420746f6b656e20726f79616c747900000000006044820152606401610626565b61151f8484838181106114bc576114bc613ae1565b905060600201600001358585848181106114d8576114d8613ae1565b90506060020160200160208101906114f09190613b12565b86868581811061150257611502613ae1565b905060600201604001602081019061151a9190613b2d565b611f53565b600101611330565b50336001600160a01b03167f56afe560bd896316a6a3421197574269ef42195f3f155048c908c45f8db21aeb8484604051611563929190613b48565b60405180910390a2505050565b6001600160a01b03851633148061158c575061158c853361057e565b6115a85760405162461bcd60e51b8152600401610626906139e5565b61089e858585858561201f565b60006001600160e01b03198216636cdb3d1360e11b14806115e657506001600160e01b031982166303a24d0760e21b145b8061065457506301ffc9a760e01b6001600160e01b0319831614610654565b60006001600160e01b0319821663152a902d60e11b14806106545750610654826115b5565b60006001600160e01b03198216637965db0b60e01b1480610654575061065482611605565b611659813361215b565b50565b620186a06001600160601b03821611156116885760405162461bcd60e51b815260040161062690613bba565b6001600160a01b0382166116de5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610626565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b9091021760c955565b811580611722575080155b8061172c57508082105b6109495760405162461bcd60e51b815260206004820152601f60248201527f4d452d373a20696e76616c69642070686173652074696d6520706572696f64006044820152606401610626565b81518351146117995760405162461bcd60e51b815260040161062690613c04565b6001600160a01b0384166117bf5760405162461bcd60e51b815260040161062690613c4c565b336117ce8187878787876121b4565b60005b84518110156118b75760008582815181106117ee576117ee613ae1565b60200260200101519050600085838151811061180c5761180c613ae1565b60209081029190910181015160008481526065835260408082206001600160a01b038e16835290935291909120549091508181101561185d5760405162461bcd60e51b815260040161062690613c91565b60008381526065602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061189c908490613cdb565b92505081905550505050806118b090613af7565b90506117d1565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611907929190613cf3565b60405180910390a4610de28187878787876122b9565b6001600160a01b03811661197f5760405162461bcd60e51b8152602060048201526024808201527f556e61626c6520746f206772616e7420726f6c6520746f207a65726f206164646044820152637265737360e01b6064820152608401610626565b6109498282612424565b6001600160a01b0381166119ef5760405162461bcd60e51b815260206004820152602760248201527f556e61626c6520746f207265766f6b6520726f6c652066726f6d207a65726f206044820152666164647265737360c81b6064820152608401610626565b61094982826124aa565b60005b818110156108ca57611a44838383818110611a1957611a19613ae1565b90506080020160200135848484818110611a3557611a35613ae1565b90506080020160400135611717565b611a80838383818110611a5957611a59613ae1565b90506080020160000135848484818110611a7557611a75613ae1565b905060800201612511565b6001016119fc565b8154600183015460009190811580611aa05750818410155b8015611ab45750801580611ab45750808411155b95945050505050565b611ac884838361256a565b6001600160a01b0316836001600160a01b031614611b285760405162461bcd60e51b815260206004820152601860248201527f4d452d31343a20696e76616c6964207369676e617475726500000000000000006044820152606401610626565b50505050565b600082815261012f602090815260408083205461013083528184206001600160a01b03881685529092529091205481611b678483613cdb565b1115611bc95760405162461bcd60e51b815260206004820152602b60248201527f4d452d31333a206d696e7420616d6f756e74206578636565647320696e64697660448201526a1a591d585b081b1a5b5a5d60aa1b6064820152608401610626565b611bd38382613cdb565b6000948552610130602090815260408087206001600160a01b0390981687529690529490932093909355505050565b6001851415611c8457611c7f8787876000818110611c2257611c22613ae1565b9050602002013586866000818110611c3c57611c3c613ae1565b9050602002013585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061265192505050565b611d26565b611d268787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020601f8a01819004810282018101909252888152925088915087908190840183828082843760009201919091525061273392505050565b50505050505050565b611d3a85858561288e565b61089e8583836128e1565b600054610100900460ff16611d6c5760405162461bcd60e51b815260040161062690613d18565b61165981612934565b60005b818110156108ca57828282818110611d9257611d92613ae1565b9050604002016020013561012d6000858585818110611db357611db3613ae1565b6040908102929092013583525060208201929092520160002055600101611d78565b60005b818110156108ca57828282818110611df257611df2613ae1565b9050604002016020013561012f6000858585818110611e1357611e13613ae1565b6040908102929092013583525060208201929092520160002055600101611dd8565b6000818311611e45576000611e49565b8183035b9392505050565b600081831115611e605781611e49565b5090919050565b8051610949906067906020840190612e77565b816001600160a01b0316836001600160a01b03161415611eee5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610626565b6001600160a01b03838116600081815260666020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191016106da565b620186a06001600160601b0382161115611f7f5760405162461bcd60e51b815260040161062690613bba565b6001600160a01b038216611fd55760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610626565b6040805180820182526001600160a01b0393841681526001600160601b039283166020808301918252600096875260ca90529190942093519051909116600160a01b029116179055565b6001600160a01b0384166120455760405162461bcd60e51b815260040161062690613c4c565b33600061205185612964565b9050600061205e85612964565b905061206e8389898585896121b4565b60008681526065602090815260408083206001600160a01b038c168452909152902054858110156120b15760405162461bcd60e51b815260040161062690613c91565b60008781526065602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906120f0908490613cdb565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612150848a8a8a8a8a6129af565b505050505050505050565b61216582826111b9565b6109495761217281612a79565b61217d836020612a8b565b60405160200161218e929190613d63565b60408051601f198184030181529082905262461bcd60e51b825261062691600401613044565b6121c2868686868686612c26565b6001600160a01b038516156121d657610de2565b60005b8351811015611d265761012d60008583815181106121f9576121f9613ae1565b602002602001015181526020019081526020016000205483828151811061222257612222613ae1565b602002602001015161225986848151811061223f5761223f613ae1565b602002602001015160009081526097602052604090205490565b6122639190613cdb565b11156122b15760405162461bcd60e51b815260206004820152601960248201527f4d452d383a206d617820737570706c79206578636565646564000000000000006044820152606401610626565b6001016121d9565b6001600160a01b0384163b15610de25760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906122fd9089908990889088908890600401613dd8565b602060405180830381600087803b15801561231757600080fd5b505af1925050508015612347575060408051601f3d908101601f1916820190925261234491810190613e36565b60015b6123f457612353613e53565b806308c379a0141561238d5750612368613e6f565b80612373575061238f565b8060405162461bcd60e51b81526004016106269190613044565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610626565b6001600160e01b0319811663bc197c8160e01b14611d265760405162461bcd60e51b815260040161062690613ef8565b61242e82826111b9565b61094957600082815260fb602090815260408083206001600160a01b03851684529091529020805460ff191660011790556124663390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6124b482826111b9565b1561094957600082815260fb602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600082815261012e60209081526040918290209083013581559082013560018201556125436080830160608401613b12565b60029190910180546001600160a01b0319166001600160a01b039092169190911790555050565b60008046308660405160200161258293929190613f40565b60405160208183030381529060405290506000816040516020016125a69190613f6a565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012090506126478186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612d9f92505050565b9695505050505050565b6001600160a01b0384166126775760405162461bcd60e51b815260040161062690613f86565b33600061268385612964565b9050600061269085612964565b90506126a1836000898585896121b4565b60008681526065602090815260408083206001600160a01b038b168452909152812080548792906126d3908490613cdb565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611d26836000898989896129af565b6001600160a01b0384166127595760405162461bcd60e51b815260040161062690613f86565b815183511461277a5760405162461bcd60e51b815260040161062690613c04565b3361278a816000878787876121b4565b60005b8451811015612826578381815181106127a8576127a8613ae1565b6020026020010151606560008784815181106127c6576127c6613ae1565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461280e9190613cdb565b9091555081905061281e81613af7565b91505061278d565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612877929190613cf3565b60405180910390a461089e816000878787876122b9565b60005b61ffff8116821115611b28576128d18484848461ffff168181106128b7576128b7613ae1565b90506020020160208101906128cc9190613b12565b61191d565b6128da81613fc7565b9050612891565b60005b61ffff8116821115611b28576129248484848461ffff1681811061290a5761290a613ae1565b905060200201602081019061291f9190613b12565b611989565b61292d81613fc7565b90506128e4565b600054610100900460ff1661295b5760405162461bcd60e51b815260040161062690613d18565b61165981611e67565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061299e5761299e613ae1565b602090810291909101015292915050565b6001600160a01b0384163b15610de25760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906129f39089908990889088908890600401613fe9565b602060405180830381600087803b158015612a0d57600080fd5b505af1925050508015612a3d575060408051601f3d908101601f19168201909252612a3a91810190613e36565b60015b612a4957612353613e53565b6001600160e01b0319811663f23a6e6160e01b14611d265760405162461bcd60e51b815260040161062690613ef8565b60606106546001600160a01b03831660145b60606000612a9a8360026139a4565b612aa5906002613cdb565b6001600160401b03811115612abc57612abc6130a5565b6040519080825280601f01601f191660200182016040528015612ae6576020820181803683370190505b509050600360fc1b81600081518110612b0157612b01613ae1565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612b3057612b30613ae1565b60200101906001600160f81b031916908160001a9053506000612b548460026139a4565b612b5f906001613cdb565b90505b6001811115612bd7576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612b9357612b93613ae1565b1a60f81b828281518110612ba957612ba9613ae1565b60200101906001600160f81b031916908160001a90535060049490941c93612bd08161402e565b9050612b62565b508315611e495760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610626565b6001600160a01b038516612cad5760005b8351811015612cab57828181518110612c5257612c52613ae1565b602002602001015160976000868481518110612c7057612c70613ae1565b602002602001015181526020019081526020016000206000828254612c959190613cdb565b90915550612ca4905081613af7565b9050612c37565b505b6001600160a01b038416610de25760005b8351811015611d26576000848281518110612cdb57612cdb613ae1565b602002602001015190506000848381518110612cf957612cf9613ae1565b6020026020010151905060006097600084815260200190815260200160002054905081811015612d7c5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610626565b60009283526097602052604090922091039055612d9881613af7565b9050612cbe565b6000806000808451604114612dba5760009350505050610654565b50505060208201516040830151606084015160001a601b811015612de657612de3601b82614045565b90505b8060ff16601b14158015612dfe57508060ff16601c14155b15612e0f5760009350505050610654565b60408051600081526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015612e62573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b828054612e8390613953565b90600052602060002090601f016020900481019282612ea55760008555612eeb565b82601f10612ebe57805160ff1916838001178555612eeb565b82800160010185558215612eeb579182015b82811115612eeb578251825591602001919060010190612ed0565b50612ef7929150612efb565b5090565b5b80821115612ef75760008155600101612efc565b80356001600160a01b0381168114612f2757600080fd5b919050565b60008060408385031215612f3f57600080fd5b612f4883612f10565b946020939093013593505050565b6001600160e01b03198116811461165957600080fd5b600060208284031215612f7e57600080fd5b8135611e4981612f56565b80356001600160601b0381168114612f2757600080fd5b60008060408385031215612fb357600080fd5b612fbc83612f10565b9150612fca60208401612f89565b90509250929050565b600060208284031215612fe557600080fd5b5035919050565b60005b83811015613007578181015183820152602001612fef565b83811115611b285750506000910152565b60008151808452613030816020860160208601612fec565b601f01601f19169290920160200192915050565b602081526000611e496020830184613018565b60008060006060848603121561306c57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561309657600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156130e0576130e06130a5565b6040525050565b60006001600160401b03821115613100576131006130a5565b5060051b60200190565b600082601f83011261311b57600080fd5b81356020613128826130e7565b60405161313582826130bb565b83815260059390931b850182019282810191508684111561315557600080fd5b8286015b848110156131705780358352918301918301613159565b509695505050505050565b600082601f83011261318c57600080fd5b81356001600160401b038111156131a5576131a56130a5565b6040516131bc601f8301601f1916602001826130bb565b8181528460208386010111156131d157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561320657600080fd5b61320f86612f10565b945061321d60208701612f10565b935060408601356001600160401b038082111561323957600080fd5b61324589838a0161310a565b9450606088013591508082111561325b57600080fd5b61326789838a0161310a565b9350608088013591508082111561327d57600080fd5b5061328a8882890161317b565b9150509295509295909350565b600080604083850312156132aa57600080fd5b82359150612fca60208401612f10565b60008083601f8401126132cc57600080fd5b5081356001600160401b038111156132e357600080fd5b6020830191508360208260071b850101111561085257600080fd5b6000806020838503121561331157600080fd5b82356001600160401b0381111561332757600080fd5b613333858286016132ba565b90969095509350505050565b60008083601f84011261335157600080fd5b5081356001600160401b0381111561336857600080fd5b6020830191508360208260051b850101111561085257600080fd5b60008083601f84011261339557600080fd5b5081356001600160401b038111156133ac57600080fd5b60208301915083602082850101111561085257600080fd5b60008060008060008060008060008060c08b8d0312156133e357600080fd5b8a3599506133f360208c01612f10565b985060408b01356001600160401b038082111561340f57600080fd5b61341b8e838f0161333f565b909a50985060608d013591508082111561343457600080fd5b6134408e838f0161333f565b909850965060808d013591508082111561345957600080fd5b6134658e838f01613383565b909650945060a08d013591508082111561347e57600080fd5b5061348b8d828e01613383565b915080935050809150509295989b9194979a5092959850565b600080604083850312156134b757600080fd5b82356001600160401b03808211156134ce57600080fd5b818501915085601f8301126134e257600080fd5b813560206134ef826130e7565b6040516134fc82826130bb565b83815260059390931b850182019282810191508984111561351c57600080fd5b948201945b838610156135415761353286612f10565b82529482019490820190613521565b9650508601359250508082111561355757600080fd5b506135648582860161310a565b9150509250929050565b600081518084526020808501945080840160005b8381101561359e57815187529582019590820190600101613582565b509495945050505050565b602081526000611e49602083018461356e565b6000806000806000606086880312156135d457600080fd5b8535945060208601356001600160401b03808211156135f257600080fd5b6135fe89838a0161333f565b9096509450604088013591508082111561361757600080fd5b506136248882890161333f565b969995985093965092949392505050565b60008083601f84011261364757600080fd5b5081356001600160401b0381111561365e57600080fd5b6020830191508360208260061b850101111561085257600080fd5b60008060008060008060008060008060e08b8d03121561369857600080fd5b8a356001600160401b03808211156136af57600080fd5b6136bb8e838f0161317b565b9b506136c960208e01612f10565b9a506136d760408e01612f10565b99506136e560608e01612f89565b985060808d01359150808211156136fb57600080fd5b6137078e838f01613635565b909850965060a08d013591508082111561372057600080fd5b61372c8e838f01613635565b909650945060c08d013591508082111561374557600080fd5b5061348b8d828e016132ba565b60008060006040848603121561376757600080fd5b61377084612f10565b925060208401356001600160401b0381111561378b57600080fd5b6137978682870161333f565b9497909650939450505050565b600080602083850312156137b757600080fd5b82356001600160401b038111156137cd57600080fd5b61333385828601613635565b6000602082840312156137eb57600080fd5b81356001600160401b0381111561380157600080fd5b61380d8482850161317b565b949350505050565b6000806040838503121561382857600080fd5b61383183612f10565b91506020830135801515811461384657600080fd5b809150509250929050565b6000806020838503121561386457600080fd5b82356001600160401b038082111561387b57600080fd5b818501915085601f83011261388f57600080fd5b81358181111561389e57600080fd5b8660206060830285010111156138b357600080fd5b60209290920196919550909350505050565b600080604083850312156138d857600080fd5b6138e183612f10565b9150612fca60208401612f10565b600080600080600060a0868803121561390757600080fd5b61391086612f10565b945061391e60208701612f10565b9350604086013592506060860135915060808601356001600160401b0381111561394757600080fd5b61328a8882890161317b565b600181811c9082168061396757607f821691505b6020821081141561398857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156139be576139be61398e565b500290565b6000826139e057634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b81835260006001600160fb1b03831115613a4c57600080fd5b8260051b8083602087013760009401602001938452509192915050565b8881526001600160a01b038816602082015260a060408201819052600090613a94908301888a613a33565b8281036060840152613aa7818789613a33565b90508281036080840152838152838560208301376000602085830101526020601f19601f8601168201019150509998505050505050505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613b0b57613b0b61398e565b5060010190565b600060208284031215613b2457600080fd5b611e4982612f10565b600060208284031215613b3f57600080fd5b611e4982612f89565b6020808252818101839052600090604080840186845b87811015613bad57813583526001600160a01b03613b7d868401612f10565b16858401526001600160601b03613b95858401612f89565b16838501526060928301929190910190600101613b5e565b5090979650505050505050565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60008219821115613cee57613cee61398e565b500190565b604081526000613d06604083018561356e565b8281036020840152611ab4818561356e565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613d9b816017850160208801612fec565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613dcc816028840160208801612fec565b01602801949350505050565b6001600160a01b0386811682528516602082015260a060408201819052600090613e049083018661356e565b8281036060840152613e16818661356e565b90508281036080840152613e2a8185613018565b98975050505050505050565b600060208284031215613e4857600080fd5b8151611e4981612f56565b600060033d1115613e6c5760046000803e5060005160e01c5b90565b600060443d1015613e7d5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613eac57505050505090565b8285019150815181811115613ec45750505050505090565b843d8701016020828501011115613ede5750505050505090565b613eed602082860101876130bb565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b8381526001600160a01b0383166020820152606060408201819052600090611ab490830184613018565b60008251613f7c818460208701612fec565b9190910192915050565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600061ffff80831681811415613fdf57613fdf61398e565b6001019392505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061402390830184613018565b979650505050505050565b60008161403d5761403d61398e565b506000190190565b600060ff821660ff84168060ff038211156140625761406261398e565b01939250505056fe4d696e7461626c6545646974696f6e7346726565506861736573476c6f62616c557365724c696d6974207631a2646970667358221220130bf7ce579dbc015887797275e54cae7eb777d44abfc54c9b92d6bc1e221efb64736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102105760003560e01c80635aa0ca5d11610125578063a22cb465116100ad578063cead13221161007c578063cead132214610529578063d547741f1461054a578063de2c8fc21461055d578063e985e9c514610570578063f242432a146105ac57600080fd5b8063a22cb465146104db578063aa1b103f146104ee578063bd85b039146104f6578063c4758b171461051657600080fd5b80638f35d656116100f45780638f35d6561461048757806391d148541461049a578063978f47c6146104ad5780639b642de1146104c0578063a217fddf146104d357600080fd5b80635aa0ca5d146104225780636a084178146104355780637d62253214610448578063862b68f41461045b57600080fd5b80632eb2c2d6116101a85780633a430b99116101775780633a430b99146103a457806341326f44146103c55780634e1273f4146103d85780634f558e79146103f857806354fd4d501461041a57600080fd5b80632eb2c2d6146103585780632f2ff15d1461036b57806336568abe1461037e57806338a365a71461039157600080fd5b80630e89341c116101e45780630e89341c146102d05780631f456df5146102f0578063248a9ca3146103035780632a55205a1461032657600080fd5b8062fdd58e1461021557806301ffc9a71461023b57806304634d8d1461025e578063077b6fed14610273575b600080fd5b610228610223366004612f2c565b6105bf565b6040519081526020015b60405180910390f35b61024e610249366004612f6c565b61065a565b6040519015158152602001610232565b61027161026c366004612fa0565b610683565b005b6102ac610281366004612fd3565b61012e602052600090815260409020805460018201546002909201549091906001600160a01b031683565b6040805193845260208401929092526001600160a01b031690820152606001610232565b6102e36102de366004612fd3565b6106e7565b6040516102329190613044565b6102716102fe366004613057565b61077b565b610228610311366004612fd3565b600090815260fb602052604090206001015490565b610339610334366004613083565b6107aa565b604080516001600160a01b039093168352602083019190915201610232565b6102716103663660046131ee565b610859565b610271610379366004613297565b6108a5565b61027161038c366004613297565b6108cf565b61027161039f3660046132fe565b61094d565b6102286103b2366004612fd3565b61012d6020526000908152604090205481565b6102716103d33660046133c4565b6109a2565b6103eb6103e63660046134a4565b610bdd565b60405161023291906135a9565b61024e610406366004612fd3565b600090815260976020526040902054151590565b6102e3610d06565b610271610430366004613297565b610d26565b6102716104433660046135bc565b610d61565b610271610456366004613679565b610dea565b610228610469366004613297565b61013060209081526000928352604080842090915290825290205481565b6103eb610495366004613752565b610fed565b61024e6104a8366004613297565b6111b9565b6102716104bb3660046137a4565b6111e4565b6102716104ce3660046137d9565b611239565b610228600081565b6102716104e9366004613815565b61124d565b610271611258565b610228610504366004612fd3565b60009081526097602052604090205490565b6102716105243660046137a4565b6112a8565b610228610537366004612fd3565b61012f6020526000908152604090205481565b610271610558366004613297565b6112bd565b61027161056b366004613851565b6112e2565b61024e61057e3660046138c5565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205460ff1690565b6102716105ba3660046138ef565b611570565b60006001600160a01b03831661062f5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060008181526065602090815260408083206001600160a01b03861684529091529020545b92915050565b6000610665826115b5565b80610674575061067482611605565b8061065457506106548261162a565b600061068e8161164f565b610698838361165c565b6040516001600160601b03831681526001600160a01b0384169033907fa41aebb99f09dc1f2aff8e23bdcc6d073f556ac50f7cc1d1794170adc4ced4ed906020015b60405180910390a3505050565b6060606780546106f690613953565b80601f016020809104026020016040519081016040528092919081815260200182805461072290613953565b801561076f5780601f106107445761010080835404028352916020019161076f565b820191906000526020600020905b81548152906001019060200180831161075257829003601f168201915b50505050509050919050565b60006107868161164f565b6107908383611717565b50600092835261012e602052604090922090815560010155565b600082815260ca602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161081f57506040805180820190915260c9546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090620186a09061083f906001600160601b0316876139a4565b61084991906139c3565b91519350909150505b9250929050565b6001600160a01b0385163314806108755750610875853361057e565b6108915760405162461bcd60e51b8152600401610626906139e5565b61089e8585858585611778565b5050505050565b600082815260fb60205260409020600101546108c08161164f565b6108ca838361191d565b505050565b6001600160a01b038116331461093f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610626565b6109498282611989565b5050565b60006109588161164f565b816109985760405162461bcd60e51b815260206004820152601060248201526f4d452d363a20656d707479206461746160801b6044820152606401610626565b6108ca83836119f9565b866109e25760405162461bcd60e51b815260206004820152601060248201526f4d452d393a20656d707479206461746160801b6044820152606401610626565b868514610a465760405162461bcd60e51b815260206004820152602c60248201527f4d452d31303a2061737365742069647320616e6420616d6f756e7473206c656e60448201526b0cee8d040dad2e6dac2e8c6d60a31b6064820152608401610626565b60008a815261012e60205260409020610a5f8142611a88565b610aab5760405162461bcd60e51b815260206004820152601760248201527f4d452d31313a207068617365206e6f74206163746976650000000000000000006044820152606401610626565b610ab66000336111b9565b610b095760028101546001600160a01b03168015610b0757610b078c8c8c8c8c8c8c8c604051602001610af0989796959493929190613a69565b604051602081830303815290604052828686611abd565b505b60005b88811015610bc057878782818110610b2657610b26613ae1565b9050602002013560001415610b7d5760405162461bcd60e51b815260206004820152601760248201527f4d452d31323a207a65726f206d696e7420616d6f756e740000000000000000006044820152606401610626565b610bb88b8b8b84818110610b9357610b93613ae1565b905060200201358a8a85818110610bac57610bac613ae1565b90506020020135611b2e565b600101610b0c565b50610bd08a8a8a8a8a8a8a611c02565b5050505050505050505050565b60608151835114610c425760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610626565b600083516001600160401b03811115610c5d57610c5d6130a5565b604051908082528060200260200182016040528015610c86578160200160208202803683370190505b50905060005b8451811015610cfe57610cd1858281518110610caa57610caa613ae1565b6020026020010151858381518110610cc457610cc4613ae1565b60200260200101516105bf565b828281518110610ce357610ce3613ae1565b6020908102919091010152610cf781613af7565b9050610c8c565b509392505050565b60606040518060600160405280602c815260200161406b602c9139905090565b6000610d318161164f565b600083815261012e6020526040902060020180546001600160a01b0319166001600160a01b038416179055505050565b600085815260fb6020526040902060010154610d7c8161164f565b83151580610d8957508115155b610dd55760405162461bcd60e51b815260206004820152601760248201527f456d707479206d6f6469667920726f6c65206c697374730000000000000000006044820152606401610626565b610de28686868686611d2f565b505050505050565b600054610100900460ff1615808015610e0a5750600054600160ff909116105b80610e245750303b158015610e24575060005460ff166001145b610e875760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610626565b6000805460ff191660011790558015610eaa576000805461ff0019166101001790555b610eb38b611d45565b610ebe60008b61191d565b6001600160a01b03891615610edc57610ed7898961165c565b610f33565b6001600160601b03881615610f335760405162461bcd60e51b815260206004820152601d60248201527f4d452d313a20696e76616c69642064656661756c7420726f79616c74790000006044820152606401610626565b6040516001600160601b03891681526001600160a01b038a16906000907fa41aebb99f09dc1f2aff8e23bdcc6d073f556ac50f7cc1d1794170adc4ced4ed9060200160405180910390a3610f878787611d75565b610f918585611dd5565b610f9b83836119f9565b8015610bd0576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b60606000826001600160401b03811115611009576110096130a5565b604051908082528060200260200182016040528015611032578160200160208202803683370190505b50905060005b838110156111b0576110c561012f600087878581811061105a5761105a613ae1565b90506020020135815260200190815260200160002054610130600088888681811061108757611087613ae1565b9050602002013581526020019081526020016000206000896001600160a01b03166001600160a01b0316815260200190815260200160002054611e35565b8282815181106110d7576110d7613ae1565b6020026020010181815250508181815181106110f5576110f5613ae1565b60200260200101516000146111a85761118961116a61012d600088888681811061112157611121613ae1565b9050602002013581526020019081526020016000205461116588888681811061114c5761114c613ae1565b9050602002013560009081526097602052604090205490565b611e35565b83838151811061117c5761117c613ae1565b6020026020010151611e50565b82828151811061119b5761119b613ae1565b6020026020010181815250505b600101611038565b50949350505050565b600091825260fb602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60006111ef8161164f565b8161122f5760405162461bcd60e51b815260206004820152601060248201526f4d452d353a20656d707479206461746160801b6044820152606401610626565b6108ca8383611d75565b60006112448161164f565b61094982611e67565b610949338383611e7a565b60006112638161164f565b61126d600060c955565b604080516000808252915133917fa41aebb99f09dc1f2aff8e23bdcc6d073f556ac50f7cc1d1794170adc4ced4ed919081900360200190a350565b60006112b38161164f565b6108ca8383611dd5565b600082815260fb60205260409020600101546112d88161164f565b6108ca8383611989565b60006112ed8161164f565b8161132d5760405162461bcd60e51b815260206004820152601060248201526f4d452d323a20656d707479206461746160801b6044820152606401610626565b60005b8281101561152757600084848381811061134c5761134c613ae1565b90506060020160200160208101906113649190613b12565b6001600160a01b031614156114285783838281811061138557611385613ae1565b905060600201604001602081019061139d9190613b2d565b6001600160601b0316156113f35760405162461bcd60e51b815260206004820152601b60248201527f4d452d333a20696e76616c696420746f6b656e20726f79616c747900000000006044820152606401610626565b61142384848381811061140857611408613ae1565b90506060020160000135600090815260ca6020526040812055565b61151f565b83838281811061143a5761143a613ae1565b90506060020160400160208101906114529190613b2d565b6001600160601b03166114a75760405162461bcd60e51b815260206004820152601b60248201527f4d452d343a20696e76616c696420746f6b656e20726f79616c747900000000006044820152606401610626565b61151f8484838181106114bc576114bc613ae1565b905060600201600001358585848181106114d8576114d8613ae1565b90506060020160200160208101906114f09190613b12565b86868581811061150257611502613ae1565b905060600201604001602081019061151a9190613b2d565b611f53565b600101611330565b50336001600160a01b03167f56afe560bd896316a6a3421197574269ef42195f3f155048c908c45f8db21aeb8484604051611563929190613b48565b60405180910390a2505050565b6001600160a01b03851633148061158c575061158c853361057e565b6115a85760405162461bcd60e51b8152600401610626906139e5565b61089e858585858561201f565b60006001600160e01b03198216636cdb3d1360e11b14806115e657506001600160e01b031982166303a24d0760e21b145b8061065457506301ffc9a760e01b6001600160e01b0319831614610654565b60006001600160e01b0319821663152a902d60e11b14806106545750610654826115b5565b60006001600160e01b03198216637965db0b60e01b1480610654575061065482611605565b611659813361215b565b50565b620186a06001600160601b03821611156116885760405162461bcd60e51b815260040161062690613bba565b6001600160a01b0382166116de5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610626565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b9091021760c955565b811580611722575080155b8061172c57508082105b6109495760405162461bcd60e51b815260206004820152601f60248201527f4d452d373a20696e76616c69642070686173652074696d6520706572696f64006044820152606401610626565b81518351146117995760405162461bcd60e51b815260040161062690613c04565b6001600160a01b0384166117bf5760405162461bcd60e51b815260040161062690613c4c565b336117ce8187878787876121b4565b60005b84518110156118b75760008582815181106117ee576117ee613ae1565b60200260200101519050600085838151811061180c5761180c613ae1565b60209081029190910181015160008481526065835260408082206001600160a01b038e16835290935291909120549091508181101561185d5760405162461bcd60e51b815260040161062690613c91565b60008381526065602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061189c908490613cdb565b92505081905550505050806118b090613af7565b90506117d1565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611907929190613cf3565b60405180910390a4610de28187878787876122b9565b6001600160a01b03811661197f5760405162461bcd60e51b8152602060048201526024808201527f556e61626c6520746f206772616e7420726f6c6520746f207a65726f206164646044820152637265737360e01b6064820152608401610626565b6109498282612424565b6001600160a01b0381166119ef5760405162461bcd60e51b815260206004820152602760248201527f556e61626c6520746f207265766f6b6520726f6c652066726f6d207a65726f206044820152666164647265737360c81b6064820152608401610626565b61094982826124aa565b60005b818110156108ca57611a44838383818110611a1957611a19613ae1565b90506080020160200135848484818110611a3557611a35613ae1565b90506080020160400135611717565b611a80838383818110611a5957611a59613ae1565b90506080020160000135848484818110611a7557611a75613ae1565b905060800201612511565b6001016119fc565b8154600183015460009190811580611aa05750818410155b8015611ab45750801580611ab45750808411155b95945050505050565b611ac884838361256a565b6001600160a01b0316836001600160a01b031614611b285760405162461bcd60e51b815260206004820152601860248201527f4d452d31343a20696e76616c6964207369676e617475726500000000000000006044820152606401610626565b50505050565b600082815261012f602090815260408083205461013083528184206001600160a01b03881685529092529091205481611b678483613cdb565b1115611bc95760405162461bcd60e51b815260206004820152602b60248201527f4d452d31333a206d696e7420616d6f756e74206578636565647320696e64697660448201526a1a591d585b081b1a5b5a5d60aa1b6064820152608401610626565b611bd38382613cdb565b6000948552610130602090815260408087206001600160a01b0390981687529690529490932093909355505050565b6001851415611c8457611c7f8787876000818110611c2257611c22613ae1565b9050602002013586866000818110611c3c57611c3c613ae1565b9050602002013585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061265192505050565b611d26565b611d268787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020601f8a01819004810282018101909252888152925088915087908190840183828082843760009201919091525061273392505050565b50505050505050565b611d3a85858561288e565b61089e8583836128e1565b600054610100900460ff16611d6c5760405162461bcd60e51b815260040161062690613d18565b61165981612934565b60005b818110156108ca57828282818110611d9257611d92613ae1565b9050604002016020013561012d6000858585818110611db357611db3613ae1565b6040908102929092013583525060208201929092520160002055600101611d78565b60005b818110156108ca57828282818110611df257611df2613ae1565b9050604002016020013561012f6000858585818110611e1357611e13613ae1565b6040908102929092013583525060208201929092520160002055600101611dd8565b6000818311611e45576000611e49565b8183035b9392505050565b600081831115611e605781611e49565b5090919050565b8051610949906067906020840190612e77565b816001600160a01b0316836001600160a01b03161415611eee5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610626565b6001600160a01b03838116600081815260666020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191016106da565b620186a06001600160601b0382161115611f7f5760405162461bcd60e51b815260040161062690613bba565b6001600160a01b038216611fd55760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610626565b6040805180820182526001600160a01b0393841681526001600160601b039283166020808301918252600096875260ca90529190942093519051909116600160a01b029116179055565b6001600160a01b0384166120455760405162461bcd60e51b815260040161062690613c4c565b33600061205185612964565b9050600061205e85612964565b905061206e8389898585896121b4565b60008681526065602090815260408083206001600160a01b038c168452909152902054858110156120b15760405162461bcd60e51b815260040161062690613c91565b60008781526065602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906120f0908490613cdb565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612150848a8a8a8a8a6129af565b505050505050505050565b61216582826111b9565b6109495761217281612a79565b61217d836020612a8b565b60405160200161218e929190613d63565b60408051601f198184030181529082905262461bcd60e51b825261062691600401613044565b6121c2868686868686612c26565b6001600160a01b038516156121d657610de2565b60005b8351811015611d265761012d60008583815181106121f9576121f9613ae1565b602002602001015181526020019081526020016000205483828151811061222257612222613ae1565b602002602001015161225986848151811061223f5761223f613ae1565b602002602001015160009081526097602052604090205490565b6122639190613cdb565b11156122b15760405162461bcd60e51b815260206004820152601960248201527f4d452d383a206d617820737570706c79206578636565646564000000000000006044820152606401610626565b6001016121d9565b6001600160a01b0384163b15610de25760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906122fd9089908990889088908890600401613dd8565b602060405180830381600087803b15801561231757600080fd5b505af1925050508015612347575060408051601f3d908101601f1916820190925261234491810190613e36565b60015b6123f457612353613e53565b806308c379a0141561238d5750612368613e6f565b80612373575061238f565b8060405162461bcd60e51b81526004016106269190613044565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610626565b6001600160e01b0319811663bc197c8160e01b14611d265760405162461bcd60e51b815260040161062690613ef8565b61242e82826111b9565b61094957600082815260fb602090815260408083206001600160a01b03851684529091529020805460ff191660011790556124663390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6124b482826111b9565b1561094957600082815260fb602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600082815261012e60209081526040918290209083013581559082013560018201556125436080830160608401613b12565b60029190910180546001600160a01b0319166001600160a01b039092169190911790555050565b60008046308660405160200161258293929190613f40565b60405160208183030381529060405290506000816040516020016125a69190613f6a565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012090506126478186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612d9f92505050565b9695505050505050565b6001600160a01b0384166126775760405162461bcd60e51b815260040161062690613f86565b33600061268385612964565b9050600061269085612964565b90506126a1836000898585896121b4565b60008681526065602090815260408083206001600160a01b038b168452909152812080548792906126d3908490613cdb565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611d26836000898989896129af565b6001600160a01b0384166127595760405162461bcd60e51b815260040161062690613f86565b815183511461277a5760405162461bcd60e51b815260040161062690613c04565b3361278a816000878787876121b4565b60005b8451811015612826578381815181106127a8576127a8613ae1565b6020026020010151606560008784815181106127c6576127c6613ae1565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461280e9190613cdb565b9091555081905061281e81613af7565b91505061278d565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612877929190613cf3565b60405180910390a461089e816000878787876122b9565b60005b61ffff8116821115611b28576128d18484848461ffff168181106128b7576128b7613ae1565b90506020020160208101906128cc9190613b12565b61191d565b6128da81613fc7565b9050612891565b60005b61ffff8116821115611b28576129248484848461ffff1681811061290a5761290a613ae1565b905060200201602081019061291f9190613b12565b611989565b61292d81613fc7565b90506128e4565b600054610100900460ff1661295b5760405162461bcd60e51b815260040161062690613d18565b61165981611e67565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061299e5761299e613ae1565b602090810291909101015292915050565b6001600160a01b0384163b15610de25760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906129f39089908990889088908890600401613fe9565b602060405180830381600087803b158015612a0d57600080fd5b505af1925050508015612a3d575060408051601f3d908101601f19168201909252612a3a91810190613e36565b60015b612a4957612353613e53565b6001600160e01b0319811663f23a6e6160e01b14611d265760405162461bcd60e51b815260040161062690613ef8565b60606106546001600160a01b03831660145b60606000612a9a8360026139a4565b612aa5906002613cdb565b6001600160401b03811115612abc57612abc6130a5565b6040519080825280601f01601f191660200182016040528015612ae6576020820181803683370190505b509050600360fc1b81600081518110612b0157612b01613ae1565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612b3057612b30613ae1565b60200101906001600160f81b031916908160001a9053506000612b548460026139a4565b612b5f906001613cdb565b90505b6001811115612bd7576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612b9357612b93613ae1565b1a60f81b828281518110612ba957612ba9613ae1565b60200101906001600160f81b031916908160001a90535060049490941c93612bd08161402e565b9050612b62565b508315611e495760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610626565b6001600160a01b038516612cad5760005b8351811015612cab57828181518110612c5257612c52613ae1565b602002602001015160976000868481518110612c7057612c70613ae1565b602002602001015181526020019081526020016000206000828254612c959190613cdb565b90915550612ca4905081613af7565b9050612c37565b505b6001600160a01b038416610de25760005b8351811015611d26576000848281518110612cdb57612cdb613ae1565b602002602001015190506000848381518110612cf957612cf9613ae1565b6020026020010151905060006097600084815260200190815260200160002054905081811015612d7c5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610626565b60009283526097602052604090922091039055612d9881613af7565b9050612cbe565b6000806000808451604114612dba5760009350505050610654565b50505060208201516040830151606084015160001a601b811015612de657612de3601b82614045565b90505b8060ff16601b14158015612dfe57508060ff16601c14155b15612e0f5760009350505050610654565b60408051600081526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015612e62573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b828054612e8390613953565b90600052602060002090601f016020900481019282612ea55760008555612eeb565b82601f10612ebe57805160ff1916838001178555612eeb565b82800160010185558215612eeb579182015b82811115612eeb578251825591602001919060010190612ed0565b50612ef7929150612efb565b5090565b5b80821115612ef75760008155600101612efc565b80356001600160a01b0381168114612f2757600080fd5b919050565b60008060408385031215612f3f57600080fd5b612f4883612f10565b946020939093013593505050565b6001600160e01b03198116811461165957600080fd5b600060208284031215612f7e57600080fd5b8135611e4981612f56565b80356001600160601b0381168114612f2757600080fd5b60008060408385031215612fb357600080fd5b612fbc83612f10565b9150612fca60208401612f89565b90509250929050565b600060208284031215612fe557600080fd5b5035919050565b60005b83811015613007578181015183820152602001612fef565b83811115611b285750506000910152565b60008151808452613030816020860160208601612fec565b601f01601f19169290920160200192915050565b602081526000611e496020830184613018565b60008060006060848603121561306c57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561309657600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156130e0576130e06130a5565b6040525050565b60006001600160401b03821115613100576131006130a5565b5060051b60200190565b600082601f83011261311b57600080fd5b81356020613128826130e7565b60405161313582826130bb565b83815260059390931b850182019282810191508684111561315557600080fd5b8286015b848110156131705780358352918301918301613159565b509695505050505050565b600082601f83011261318c57600080fd5b81356001600160401b038111156131a5576131a56130a5565b6040516131bc601f8301601f1916602001826130bb565b8181528460208386010111156131d157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561320657600080fd5b61320f86612f10565b945061321d60208701612f10565b935060408601356001600160401b038082111561323957600080fd5b61324589838a0161310a565b9450606088013591508082111561325b57600080fd5b61326789838a0161310a565b9350608088013591508082111561327d57600080fd5b5061328a8882890161317b565b9150509295509295909350565b600080604083850312156132aa57600080fd5b82359150612fca60208401612f10565b60008083601f8401126132cc57600080fd5b5081356001600160401b038111156132e357600080fd5b6020830191508360208260071b850101111561085257600080fd5b6000806020838503121561331157600080fd5b82356001600160401b0381111561332757600080fd5b613333858286016132ba565b90969095509350505050565b60008083601f84011261335157600080fd5b5081356001600160401b0381111561336857600080fd5b6020830191508360208260051b850101111561085257600080fd5b60008083601f84011261339557600080fd5b5081356001600160401b038111156133ac57600080fd5b60208301915083602082850101111561085257600080fd5b60008060008060008060008060008060c08b8d0312156133e357600080fd5b8a3599506133f360208c01612f10565b985060408b01356001600160401b038082111561340f57600080fd5b61341b8e838f0161333f565b909a50985060608d013591508082111561343457600080fd5b6134408e838f0161333f565b909850965060808d013591508082111561345957600080fd5b6134658e838f01613383565b909650945060a08d013591508082111561347e57600080fd5b5061348b8d828e01613383565b915080935050809150509295989b9194979a5092959850565b600080604083850312156134b757600080fd5b82356001600160401b03808211156134ce57600080fd5b818501915085601f8301126134e257600080fd5b813560206134ef826130e7565b6040516134fc82826130bb565b83815260059390931b850182019282810191508984111561351c57600080fd5b948201945b838610156135415761353286612f10565b82529482019490820190613521565b9650508601359250508082111561355757600080fd5b506135648582860161310a565b9150509250929050565b600081518084526020808501945080840160005b8381101561359e57815187529582019590820190600101613582565b509495945050505050565b602081526000611e49602083018461356e565b6000806000806000606086880312156135d457600080fd5b8535945060208601356001600160401b03808211156135f257600080fd5b6135fe89838a0161333f565b9096509450604088013591508082111561361757600080fd5b506136248882890161333f565b969995985093965092949392505050565b60008083601f84011261364757600080fd5b5081356001600160401b0381111561365e57600080fd5b6020830191508360208260061b850101111561085257600080fd5b60008060008060008060008060008060e08b8d03121561369857600080fd5b8a356001600160401b03808211156136af57600080fd5b6136bb8e838f0161317b565b9b506136c960208e01612f10565b9a506136d760408e01612f10565b99506136e560608e01612f89565b985060808d01359150808211156136fb57600080fd5b6137078e838f01613635565b909850965060a08d013591508082111561372057600080fd5b61372c8e838f01613635565b909650945060c08d013591508082111561374557600080fd5b5061348b8d828e016132ba565b60008060006040848603121561376757600080fd5b61377084612f10565b925060208401356001600160401b0381111561378b57600080fd5b6137978682870161333f565b9497909650939450505050565b600080602083850312156137b757600080fd5b82356001600160401b038111156137cd57600080fd5b61333385828601613635565b6000602082840312156137eb57600080fd5b81356001600160401b0381111561380157600080fd5b61380d8482850161317b565b949350505050565b6000806040838503121561382857600080fd5b61383183612f10565b91506020830135801515811461384657600080fd5b809150509250929050565b6000806020838503121561386457600080fd5b82356001600160401b038082111561387b57600080fd5b818501915085601f83011261388f57600080fd5b81358181111561389e57600080fd5b8660206060830285010111156138b357600080fd5b60209290920196919550909350505050565b600080604083850312156138d857600080fd5b6138e183612f10565b9150612fca60208401612f10565b600080600080600060a0868803121561390757600080fd5b61391086612f10565b945061391e60208701612f10565b9350604086013592506060860135915060808601356001600160401b0381111561394757600080fd5b61328a8882890161317b565b600181811c9082168061396757607f821691505b6020821081141561398857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156139be576139be61398e565b500290565b6000826139e057634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b81835260006001600160fb1b03831115613a4c57600080fd5b8260051b8083602087013760009401602001938452509192915050565b8881526001600160a01b038816602082015260a060408201819052600090613a94908301888a613a33565b8281036060840152613aa7818789613a33565b90508281036080840152838152838560208301376000602085830101526020601f19601f8601168201019150509998505050505050505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613b0b57613b0b61398e565b5060010190565b600060208284031215613b2457600080fd5b611e4982612f10565b600060208284031215613b3f57600080fd5b611e4982612f89565b6020808252818101839052600090604080840186845b87811015613bad57813583526001600160a01b03613b7d868401612f10565b16858401526001600160601b03613b95858401612f89565b16838501526060928301929190910190600101613b5e565b5090979650505050505050565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60008219821115613cee57613cee61398e565b500190565b604081526000613d06604083018561356e565b8281036020840152611ab4818561356e565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613d9b816017850160208801612fec565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613dcc816028840160208801612fec565b01602801949350505050565b6001600160a01b0386811682528516602082015260a060408201819052600090613e049083018661356e565b8281036060840152613e16818661356e565b90508281036080840152613e2a8185613018565b98975050505050505050565b600060208284031215613e4857600080fd5b8151611e4981612f56565b600060033d1115613e6c5760046000803e5060005160e01c5b90565b600060443d1015613e7d5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613eac57505050505090565b8285019150815181811115613ec45750505050505090565b843d8701016020828501011115613ede5750505050505090565b613eed602082860101876130bb565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b8381526001600160a01b0383166020820152606060408201819052600090611ab490830184613018565b60008251613f7c818460208701612fec565b9190910192915050565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600061ffff80831681811415613fdf57613fdf61398e565b6001019392505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061402390830184613018565b979650505050505050565b60008161403d5761403d61398e565b506000190190565b600060ff821660ff84168060ff038211156140625761406261398e565b01939250505056fe4d696e7461626c6545646974696f6e7346726565506861736573476c6f62616c557365724c696d6974207631a2646970667358221220130bf7ce579dbc015887797275e54cae7eb777d44abfc54c9b92d6bc1e221efb64736f6c63430008090033
Deployed Bytecode Sourcemap
79689:11961:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59239:230;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;59239:230:0;;;;;;;;91241:406;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;91241:406:0;1019:187:1;81755:236:0;;;;;;:::i;:::-;;:::i;:::-;;79976:52;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;79976:52:0;;;;;;;2045:25:1;;;2101:2;2086:18;;2079:34;;;;-1:-1:-1;;;;;2149:32:1;2129:18;;;2122:60;2033:2;2018:18;79976:52:0;1843:345:1;58983:105:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;84650:351::-;;;;;;:::i;:::-;;:::i;40679:131::-;;;;;;:::i;:::-;40753:7;40780:12;;;:6;:12;;;;;:22;;;;40679:131;47295:442;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4077:32:1;;;4059:51;;4141:2;4126:18;;4119:34;;;;4032:18;47295:442:0;3885:274:1;61182:438:0;;;;;;:::i;:::-;;:::i;41120:147::-;;;;;;:::i;:::-;;:::i;42264:218::-;;;;;;:::i;:::-;;:::i;83498:188::-;;;;;;:::i;:::-;;:::i;79896:71::-;;;;;;:::i;:::-;;;;;;;;;;;;;;87291:1284;;;;;;:::i;:::-;;:::i;59635:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;76044:133::-;;;;;;:::i;:::-;76101:4;75922:16;;;:12;:16;;;;;;-1:-1:-1;;;76044:133:0;80415:115;;;:::i;85506:158::-;;;;;;:::i;:::-;;:::i;77568:335::-;;;;;;:::i;:::-;;:::i;80601:909::-;;;;;;:::i;:::-;;:::i;80122:99::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;86440:843;;;;;;:::i;:::-;;:::i;39130:147::-;;;;;;:::i;:::-;;:::i;82989:211::-;;;;;;:::i;:::-;;:::i;81518:106::-;;;;;;:::i;:::-;;:::i;38224:49::-;;38269:4;38224:49;;60232:155;;;;;;:::i;:::-;;:::i;81999:174::-;;;:::i;75833:113::-;;;;;;:::i;:::-;75895:7;75922:16;;;:12;:16;;;;;;;75833:113;85009:199;;;;;;:::i;:::-;;:::i;80037:78::-;;;;;;:::i;:::-;;;;;;;;;;;;;;41560:149;;;;;;:::i;:::-;;:::i;82181:800::-;;;;;;:::i;:::-;;:::i;60459:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;60582:27:0;;;60558:4;60582:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;60459:168;60699:406;;;;;;:::i;:::-;;:::i;59239:230::-;59325:7;-1:-1:-1;;;;;59353:21:0;;59345:76;;;;-1:-1:-1;;;59345:76:0;;18855:2:1;59345:76:0;;;18837:21:1;18894:2;18874:18;;;18867:30;18933:34;18913:18;;;18906:62;-1:-1:-1;;;18984:18:1;;;18977:40;19034:19;;59345:76:0;;;;;;;;;-1:-1:-1;59439:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;59439:22:0;;;;;;;;;;59239:230;;;;;:::o;91241:406::-;91425:4;91449:50;91486:12;91449:36;:50::i;:::-;:117;;;;91516:50;91553:12;91516:36;:50::i;:::-;91449:190;;;;91583:56;91626:12;91583:42;:56::i;81755:236::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;81870:42:::1;81889:9;81900:11;81870:18;:42::i;:::-;81928:55;::::0;-1:-1:-1;;;;;19226:39:1;;19208:58;;-1:-1:-1;;;;;81928:55:0;::::1;::::0;18729:10;;81928:55:::1;::::0;19196:2:1;19181:18;81928:55:0::1;;;;;;;;81755:236:::0;;;:::o;58983:105::-;59043:13;59076:4;59069:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58983:105;;;:::o;84650:351::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;84822:51:::1;84842:15;84859:13;84822:19;:51::i;:::-;-1:-1:-1::0;84886:17:0::1;::::0;;;:7:::1;:17;::::0;;;;;:50;;;84947:30:::1;;:46:::0;84650:351::o;47295:442::-;47392:7;47450:27;;;:17;:27;;;;;;;;47421:56;;;;;;;;;-1:-1:-1;;;;;47421:56:0;;;;;-1:-1:-1;;;47421:56:0;;;-1:-1:-1;;;;;47421:56:0;;;;;;;;47392:7;;47490:92;;-1:-1:-1;47541:29:0;;;;;;;;;47551:19;47541:29;-1:-1:-1;;;;;47541:29:0;;;;-1:-1:-1;;;47541:29:0;;-1:-1:-1;;;;;47541:29:0;;;;;47490:92;47632:23;;;;47594:21;;79880:7;;47619:36;;-1:-1:-1;;;;;47619:36:0;:10;:36;:::i;:::-;47618:58;;;;:::i;:::-;47697:16;;;-1:-1:-1;47594:82:0;;-1:-1:-1;;47295:442:0;;;;;;:::o;61182:438::-;-1:-1:-1;;;;;61415:20:0;;18729:10;61415:20;;:60;;-1:-1:-1;61439:36:0;61456:4;18729:10;60459:168;:::i;61439:36::-;61393:156;;;;-1:-1:-1;;;61393:156:0;;;;;;;:::i;:::-;61560:52;61583:4;61589:2;61593:3;61598:7;61607:4;61560:22;:52::i;:::-;61182:438;;;;;:::o;41120:147::-;40753:7;40780:12;;;:6;:12;;;;;:22;;;38715:16;38726:4;38715:10;:16::i;:::-;41234:25:::1;41245:4;41251:7;41234:10;:25::i;:::-;41120:147:::0;;;:::o;42264:218::-;-1:-1:-1;;;;;42360:23:0;;18729:10;42360:23;42352:83;;;;-1:-1:-1;;;42352:83:0;;20806:2:1;42352:83:0;;;20788:21:1;20845:2;20825:18;;;20818:30;20884:34;20864:18;;;20857:62;-1:-1:-1;;;20935:18:1;;;20928:45;20990:19;;42352:83:0;20604:411:1;42352:83:0;42448:26;42460:4;42466:7;42448:11;:26::i;:::-;42264:218;;:::o;83498:188::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;83608:19;83600:48:::1;;;::::0;-1:-1:-1;;;83600:48:0;;21222:2:1;83600:48:0::1;::::0;::::1;21204:21:1::0;21261:2;21241:18;;;21234:30;-1:-1:-1;;;21280:18:1;;;21273:46;21336:18;;83600:48:0::1;21020:340:1::0;83600:48:0::1;83659:19;83670:7;;83659:10;:19::i;87291:1284::-:0;87540:21;87532:50;;;;-1:-1:-1;;;87532:50:0;;21567:2:1;87532:50:0;;;21549:21:1;21606:2;21586:18;;;21579:30;-1:-1:-1;;;21625:18:1;;;21618:46;21681:18;;87532:50:0;21365:340:1;87532:50:0;87601:35;;;87593:92;;;;-1:-1:-1;;;87593:92:0;;21912:2:1;87593:92:0;;;21894:21:1;21951:2;21931:18;;;21924:30;21990:34;21970:18;;;21963:62;-1:-1:-1;;;22041:18:1;;;22034:42;22093:19;;87593:92:0;21710:408:1;87593:92:0;87698:19;87720:17;;;:7;:17;;;;;87758:41;87720:17;87783:15;87758:17;:41::i;:::-;87750:77;;;;-1:-1:-1;;;87750:77:0;;22325:2:1;87750:77:0;;;22307:21:1;22364:2;22344:18;;;22337:30;22403:25;22383:18;;;22376:53;22446:18;;87750:77:0;22123:347:1;87750:77:0;87845:41;38269:4;18729:10;39130:147;:::i;87845:41::-;87840:401;;87928:21;;;;-1:-1:-1;;;;;87928:21:0;87968:28;;87964:266;;88017:197;88076:8;88086:10;88098:9;;88109:8;;88119:5;;88065:60;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;88148:14;88185:10;;88017:25;:197::i;:::-;87888:353;87840:401;88258:9;88253:255;88269:20;;;88253:255;;;88316:8;;88325:1;88316:11;;;;;;;:::i;:::-;;;;;;;88331:1;88316:16;;88308:52;;;;-1:-1:-1;;;88308:52:0;;24185:2:1;88308:52:0;;;24167:21:1;24224:2;24204:18;;;24197:30;24263:25;24243:18;;;24236:53;24306:18;;88308:52:0;23983:347:1;88308:52:0;88377:55;88394:10;88406:9;;88416:1;88406:12;;;;;;;:::i;:::-;;;;;;;88420:8;;88429:1;88420:11;;;;;;;:::i;:::-;;;;;;;88377:16;:55::i;:::-;88478:3;;88253:255;;;;88520:47;88528:10;88540:9;;88551:8;;88561:5;;88520:7;:47::i;:::-;87521:1054;87291:1284;;;;;;;;;;:::o;59635:524::-;59791:16;59852:3;:10;59833:8;:15;:29;59825:83;;;;-1:-1:-1;;;59825:83:0;;24537:2:1;59825:83:0;;;24519:21:1;24576:2;24556:18;;;24549:30;24615:34;24595:18;;;24588:62;-1:-1:-1;;;24666:18:1;;;24659:39;24715:19;;59825:83:0;24335:405:1;59825:83:0;59921:30;59968:8;:15;-1:-1:-1;;;;;59954:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59954:30:0;;59921:63;;60002:9;59997:122;60021:8;:15;60017:1;:19;59997:122;;;60077:30;60087:8;60096:1;60087:11;;;;;;;;:::i;:::-;;;;;;;60100:3;60104:1;60100:6;;;;;;;;:::i;:::-;;;;;;;60077:9;:30::i;:::-;60058:13;60072:1;60058:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;60038:3;;;:::i;:::-;;;59997:122;;;-1:-1:-1;60138:13:0;59635:524;-1:-1:-1;;;59635:524:0:o;80415:115::-;80457:13;80474:53;;;;;;;;;;;;;;;;;;;80415:115;:::o;85506:158::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;85755:17;;;;:7;:17;;;;;:33;;:43;;-1:-1:-1;;;;;;85755:43:0;-1:-1:-1;;;;;85755:43:0;;;;;41120:147;;;:::o;77568:335::-;40753:7;40780:12;;;:6;:12;;;;;:22;;;38715:16;38726:4;38715:10;:16::i;:::-;77761:20;;::::1;::::0;:47:::1;;-1:-1:-1::0;77785:23:0;;::::1;77761:47;77753:83;;;::::0;-1:-1:-1;;;77753:83:0;;25087:2:1;77753:83:0::1;::::0;::::1;25069:21:1::0;25126:2;25106:18;;;25099:30;25165:25;25145:18;;;25138:53;25208:18;;77753:83:0::1;24885:347:1::0;77753:83:0::1;77849:46;77866:5;77873:8;;77883:11;;77849:16;:46::i;:::-;77568:335:::0;;;;;;:::o;80601:909::-;14491:19;14514:13;;;;;;14513:14;;14561:34;;;;-1:-1:-1;14579:12:0;;14594:1;14579:12;;;;:16;14561:34;14560:108;;;-1:-1:-1;14640:4:0;4344:19;:23;;;14601:66;;-1:-1:-1;14650:12:0;;;;;:17;14601:66;14538:204;;;;-1:-1:-1;;;14538:204:0;;25439:2:1;14538:204:0;;;25421:21:1;25478:2;25458:18;;;25451:30;25517:34;25497:18;;;25490:62;-1:-1:-1;;;25568:18:1;;;25561:44;25622:19;;14538:204:0;25237:410:1;14538:204:0;14753:12;:16;;-1:-1:-1;;14753:16:0;14768:1;14753:16;;;14780:67;;;;14815:13;:20;;-1:-1:-1;;14815:20:0;;;;;14780:67;80943:20:::1;80958:4;80943:14;:20::i;:::-;80976:38;38269:4;81007:6:::0;80976:10:::1;:38::i;:::-;-1:-1:-1::0;;;;;81031:37:0;::::1;::::0;81027:245:::1;;81085:70;81104:23;81129:25;81085:18;:70::i;:::-;81027:245;;;-1:-1:-1::0;;;;;81196:30:0;::::1;::::0;81188:72:::1;;;::::0;-1:-1:-1;;;81188:72:0;;25854:2:1;81188:72:0::1;::::0;::::1;25836:21:1::0;25893:2;25873:18;;;25866:30;25932:31;25912:18;;;25905:59;25981:18;;81188:72:0::1;25652:353:1::0;81188:72:0::1;81287:81;::::0;-1:-1:-1;;;;;19226:39:1;;19208:58;;-1:-1:-1;;;;;81287:81:0;::::1;::::0;81313:1:::1;::::0;81287:81:::1;::::0;19196:2:1;19181:18;81287:81:0::1;;;;;;;81381:29;81397:12;;81381:15;:29::i;:::-;81423:47;81448:21;;81423:24;:47::i;:::-;81483:19;81494:7;;81483:10;:19::i;:::-;14873:14:::0;14869:102;;;14920:5;14904:21;;-1:-1:-1;;14904:21:0;;;14945:14;;-1:-1:-1;26162:36:1;;14945:14:0;;26150:2:1;26135:18;14945:14:0;;;;;;;14480:498;80601:909;;;;;;;;;;:::o;86440:843::-;86584:16;86619:33;86669:9;-1:-1:-1;;;;;86655:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;86655:31:0;;86619:67;;86704:9;86699:541;86715:20;;;86699:541;;;86776:136;86803:21;:35;86825:9;;86835:1;86825:12;;;;;;;:::i;:::-;;;;;;;86803:35;;;;;;;;;;;;86857:14;:28;86872:9;;86882:1;86872:12;;;;;;;:::i;:::-;;;;;;;86857:28;;;;;;;;;;;:40;86886:10;-1:-1:-1;;;;;86857:40:0;-1:-1:-1;;;;;86857:40:0;;;;;;;;;;;;;86776:8;:136::i;:::-;86754:16;86771:1;86754:19;;;;;;;;:::i;:::-;;;;;;:158;;;;;86933:16;86950:1;86933:19;;;;;;;;:::i;:::-;;;;;;;86956:1;86933:24;86929:236;;87000:149;87027:61;87036:10;:24;87047:9;;87057:1;87047:12;;;;;;;:::i;:::-;;;;;;;87036:24;;;;;;;;;;;;87062:25;87074:9;;87084:1;87074:12;;;;;;;:::i;:::-;;;;;;;75895:7;75922:16;;;:12;:16;;;;;;;75833:113;87062:25;87027:8;:61::i;:::-;87111:16;87128:1;87111:19;;;;;;;;:::i;:::-;;;;;;;87000:4;:149::i;:::-;86978:16;86995:1;86978:19;;;;;;;;:::i;:::-;;;;;;:171;;;;;86929:236;87210:3;;86699:541;;;-1:-1:-1;87259:16:0;86440:843;-1:-1:-1;;;;86440:843:0:o;39130:147::-;39216:4;39240:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;39240:29:0;;;;;;;;;;;;;;;39130:147::o;82989:211::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;83107:24;83099:53:::1;;;::::0;-1:-1:-1;;;83099:53:0;;26411:2:1;83099:53:0::1;::::0;::::1;26393:21:1::0;26450:2;26430:18;;;26423:30;-1:-1:-1;;;26469:18:1;;;26462:46;26525:18;;83099:53:0::1;26209:340:1::0;83099:53:0::1;83163:29;83179:12;;83163:15;:29::i;81518:106::-:0;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;81603:13:::1;81611:4;81603:7;:13::i;60232:155::-:0;60327:52;18729:10;60360:8;60370;60327:18;:52::i;81999:174::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;82080:23:::1;48863:19:::0;;48856:26;48795:95;82080:23:::1;82119:46;::::0;;82159:1:::1;19208:58:1::0;;;82119:46:0;;18729:10;;82119:46:::1;::::0;;;;;19196:2:1;82119:46:0;;::::1;81999:174:::0;:::o;85009:199::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;85153:47:::1;85178:21;;85153:24;:47::i;41560:149::-:0;40753:7;40780:12;;;:6;:12;;;;;:22;;;38715:16;38726:4;38715:10;:16::i;:::-;41675:26:::1;41687:4;41693:7;41675:11;:26::i;82181:800::-:0;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;82301:22;82293:51:::1;;;::::0;-1:-1:-1;;;82293:51:0;;26978:2:1;82293:51:0::1;::::0;::::1;26960:21:1::0;27017:2;26997:18;;;26990:30;-1:-1:-1;;;27036:18:1;;;27029:46;27092:18;;82293:51:0::1;26776:340:1::0;82293:51:0::1;82362:9;82357:556;82373:21:::0;;::::1;82357:556;;;82451:1;82417:10:::0;;82428:1;82417:13;;::::1;;;;;:::i;:::-;;;;;;:22;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;82417:36:0::1;;82413:424;;;82482:10;;82493:1;82482:13;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;82482:29:0::1;::::0;82474:69:::1;;;::::0;-1:-1:-1;;;82474:69:0;;27703:2:1;82474:69:0::1;::::0;::::1;27685:21:1::0;27742:2;27722:18;;;27715:30;27781:29;27761:18;;;27754:57;27828:18;;82474:69:0::1;27501:351:1::0;82474:69:0::1;82562:41;82581:10;;82592:1;82581:13;;;;;;;:::i;:::-;;;;;;:21;;;49751:26:::0;;;;:17;:26;;;;;49744:33;49671:114;82562:41:::1;82413:424;;;82652:10;;82663:1;82652:13;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;82652:29:0::1;82644:69;;;::::0;-1:-1:-1;;;82644:69:0;;28059:2:1;82644:69:0::1;::::0;::::1;28041:21:1::0;28098:2;28078:18;;;28071:30;28137:29;28117:18;;;28110:57;28184:18;;82644:69:0::1;27857:351:1::0;82644:69:0::1;82732:89;82749:10;;82760:1;82749:13;;;;;;;:::i;:::-;;;;;;:21;;;82772:10;;82783:1;82772:13;;;;;;;:::i;:::-;;;;;;:22;;;;;;;;;;:::i;:::-;82796:10;;82807:1;82796:13;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;82732:16;:89::i;:::-;82883:3;;82357:556;;;-1:-1:-1::0;18729:10:0;-1:-1:-1;;;;;82930:43:0::1;;82962:10;;82930:43;;;;;;;:::i;:::-;;;;;;;;82181:800:::0;;;:::o;60699:406::-;-1:-1:-1;;;;;60907:20:0;;18729:10;60907:20;;:60;;-1:-1:-1;60931:36:0;60948:4;18729:10;60459:168;:::i;60931:36::-;60885:156;;;;-1:-1:-1;;;60885:156:0;;;;;;;:::i;:::-;61052:45;61070:4;61076:2;61080;61084:6;61092:4;61052:17;:45::i;58218:354::-;58342:4;-1:-1:-1;;;;;;58379:52:0;;-1:-1:-1;;;58379:52:0;;:132;;-1:-1:-1;;;;;;;58448:63:0;;-1:-1:-1;;;58448:63:0;58379:132;:185;;;-1:-1:-1;;;;;;;;;;20908:51:0;;;58528:36;20799:168;46981:248;47105:4;-1:-1:-1;;;;;;47129:52:0;;-1:-1:-1;;;47129:52:0;;:92;;;47185:36;47209:11;47185:23;:36::i;38823:215::-;38908:4;-1:-1:-1;;;;;;38932:58:0;;-1:-1:-1;;;38932:58:0;;:98;;;38994:36;39018:11;38994:23;:36::i;39581:105::-;39648:30;39659:4;18729:10;39648;:30::i;:::-;39581:105;:::o;48387:332::-;79880:7;-1:-1:-1;;;;;48490:33:0;;;;48482:88;;;;-1:-1:-1;;;48482:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48589:22:0;;48581:60;;;;-1:-1:-1;;;48581:60:0;;29743:2:1;48581:60:0;;;29725:21:1;29782:2;29762:18;;;29755:30;29821:27;29801:18;;;29794:55;29866:18;;48581:60:0;29541:349:1;48581:60:0;48676:35;;;;;;;;;-1:-1:-1;;;;;48676:35:0;;;;;;-1:-1:-1;;;;;48676:35:0;;;;;;;;;;-1:-1:-1;;;48654:57:0;;;;:19;:57;48387:332::o;84046:267::-;84169:20;;;:42;;-1:-1:-1;84193:18:0;;84169:42;:77;;;;84233:13;84215:15;:31;84169:77;84147:158;;;;-1:-1:-1;;;84147:158:0;;30097:2:1;84147:158:0;;;30079:21:1;30136:2;30116:18;;;30109:30;30175:33;30155:18;;;30148:61;30226:18;;84147:158:0;29895:355:1;63416:1146:0;63643:7;:14;63629:3;:10;:28;63621:81;;;;-1:-1:-1;;;63621:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63721:16:0;;63713:66;;;;-1:-1:-1;;;63713:66:0;;;;;;;:::i;:::-;18729:10;63836:60;18729:10;63867:4;63873:2;63877:3;63882:7;63891:4;63836:20;:60::i;:::-;63914:9;63909:421;63933:3;:10;63929:1;:14;63909:421;;;63965:10;63978:3;63982:1;63978:6;;;;;;;;:::i;:::-;;;;;;;63965:19;;63999:14;64016:7;64024:1;64016:10;;;;;;;;:::i;:::-;;;;;;;;;;;;64043:19;64065:13;;;:9;:13;;;;;;-1:-1:-1;;;;;64065:19:0;;;;;;;;;;;;64016:10;;-1:-1:-1;64107:21:0;;;;64099:76;;;;-1:-1:-1;;;64099:76:0;;;;;;;:::i;:::-;64219:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;64219:19:0;;;;;;;;;;64241:20;;;64219:42;;64291:17;;;;;;;:27;;64241:20;;64219:13;64291:27;;64241:20;;64291:27;:::i;:::-;;;;;;;;63950:380;;;63945:3;;;;:::i;:::-;;;63909:421;;;;64377:2;-1:-1:-1;;;;;64347:47:0;64371:4;-1:-1:-1;;;;;64347:47:0;64361:8;-1:-1:-1;;;;;64347:47:0;;64381:3;64386:7;64347:47;;;;;;;:::i;:::-;;;;;;;;64479:75;64515:8;64525:4;64531:2;64535:3;64540:7;64549:4;64479:35;:75::i;78624:213::-;-1:-1:-1;;;;;78722:22:0;;78714:71;;;;-1:-1:-1;;;78714:71:0;;32286:2:1;78714:71:0;;;32268:21:1;32325:2;32305:18;;;32298:30;32364:34;32344:18;;;32337:62;-1:-1:-1;;;32415:18:1;;;32408:34;32459:19;;78714:71:0;32084:400:1;78714:71:0;78796:33;78813:5;78820:8;78796:16;:33::i;78845:218::-;-1:-1:-1;;;;;78944:22:0;;78936:74;;;;-1:-1:-1;;;78936:74:0;;32691:2:1;78936:74:0;;;32673:21:1;32730:2;32710:18;;;32703:30;32769:34;32749:18;;;32742:62;-1:-1:-1;;;32820:18:1;;;32813:37;32867:19;;78936:74:0;32489:403:1;78936:74:0;79021:34;79039:5;79046:8;79021:17;:34::i;83694:344::-;83772:9;83767:264;83783:18;;;83767:264;;;83820:71;83840:7;;83848:1;83840:10;;;;;;;:::i;:::-;;;;;;:25;;;83867:7;;83875:1;83867:10;;;;;;;:::i;:::-;;;;;;:23;;;83820:19;:71::i;:::-;83906:49;83924:7;;83932:1;83924:10;;;;;;;:::i;:::-;;;;;;:18;;;83944:7;;83952:1;83944:10;;;;;;;:::i;:::-;;;;;;83906:17;:49::i;:::-;84001:3;;83767:264;;88583:354;88716:21;;88771:19;;;;88674:4;;88716:21;88811:19;;;:51;;;88848:14;88834:10;:28;;88811:51;88810:119;;;;-1:-1:-1;88881:17:0;;;:47;;;88916:12;88902:10;:26;;88881:47;88803:126;88583:354;-1:-1:-1;;;;;88583:354:0:o;89741:265::-;89933:36;89951:5;89958:10;;89933:17;:36::i;:::-;-1:-1:-1;;;;;89914:55:0;:15;-1:-1:-1;;;;;89914:55:0;;89906:92;;;;-1:-1:-1;;;89906:92:0;;33099:2:1;89906:92:0;;;33081:21:1;33138:2;33118:18;;;33111:30;33177:26;33157:18;;;33150:54;33221:18;;89906:92:0;32897:348:1;89906:92:0;89741:265;;;;:::o;88945:405::-;89045:17;89065:31;;;:21;:31;;;;;;;;;89130:14;:24;;;;;-1:-1:-1;;;;;89130:36:0;;;;;;;;;;;89065:31;89187:22;89202:7;89130:36;89187:22;:::i;:::-;:35;;89179:91;;;;-1:-1:-1;;;89179:91:0;;33452:2:1;89179:91:0;;;33434:21:1;33491:2;33471:18;;;33464:30;33530:34;33510:18;;;33503:62;-1:-1:-1;;;33581:18:1;;;33574:41;33632:19;;89179:91:0;33250:407:1;89179:91:0;89320:22;89335:7;89320:12;:22;:::i;:::-;89281:24;;;;:14;:24;;;;;;;;-1:-1:-1;;;;;89281:36:0;;;;;;;;;;;;:61;;;;-1:-1:-1;;;88945:405:0:o;89358:375::-;89562:1;89542:21;;89538:188;;;89580:51;89586:10;89598:9;;89608:1;89598:12;;;;;;;:::i;:::-;;;;;;;89612:8;;89621:1;89612:11;;;;;;;:::i;:::-;;;;;;;89625:5;;89580:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89580:5:0;;-1:-1:-1;;;89580:51:0:i;:::-;89538:188;;;89664:50;89675:10;89687:9;;89664:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;89664:50:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89698:8:0;;-1:-1:-1;89698:8:0;;;;89664:50;;;89698:8;;89664:50;89698:8;89664:50;;;;;;;;;-1:-1:-1;;89664:50:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89708:5:0;;-1:-1:-1;89708:5:0;;;;89664:50;;89708:5;;;;89664:50;;;;;;;;;-1:-1:-1;89664:10:0;;-1:-1:-1;;;89664:50:0:i;:::-;89358:375;;;;;;;:::o;77911:251::-;78075:32;78091:5;78098:8;;78075:15;:32::i;:::-;78118:36;78135:5;78142:11;;78118:16;:36::i;57907:119::-;16634:13;;;;;;;16626:69;;;;-1:-1:-1;;;16626:69:0;;;;;;;:::i;:::-;57988:30:::1;58013:4;57988:24;:30::i;83208:282::-:0;83294:9;83289:194;83305:23;;;83289:194;;;83385:12;;83398:1;83385:15;;;;;;;:::i;:::-;;;;;;:22;;;83347:10;:35;83358:12;;83371:1;83358:15;;;;;;;:::i;:::-;;;;;;;;;:23;83347:35;;-1:-1:-1;83347:35:0;;;;;;;;83358:23;83347:35;:60;83453:3;;83289:194;;85216:282;85306:9;85301:190;85317:18;;;85301:190;;;85398:7;;85406:1;85398:10;;;;;;;:::i;:::-;;;;;;:17;;;85354:21;:41;85376:7;;85384:1;85376:10;;;;;;;:::i;:::-;;;;;;;;;:18;85354:41;;-1:-1:-1;85354:41:0;;;;;;;;85376:18;85354:41;:61;85461:3;;85301:190;;90938:174;91008:7;91069:4;91060:6;:13;:33;;91092:1;91060:33;;;91085:4;91076:6;:13;91060:33;91053:40;90938:174;-1:-1:-1;;;90938:174:0:o;91120:113::-;91180:7;91213:2;91207;:8;;:18;;91223:2;91207:18;;;-1:-1:-1;91218:2:0;;91120:113;-1:-1:-1;91120:113:0:o;65406:88::-;65473:13;;;;:4;;:13;;;;;:::i;70293:331::-;70448:8;-1:-1:-1;;;;;70439:17:0;:5;-1:-1:-1;;;;;70439:17:0;;;70431:71;;;;-1:-1:-1;;;70431:71:0;;34276:2:1;70431:71:0;;;34258:21:1;34315:2;34295:18;;;34288:30;34354:34;34334:18;;;34327:62;-1:-1:-1;;;34405:18:1;;;34398:39;34454:19;;70431:71:0;34074:405:1;70431:71:0;-1:-1:-1;;;;;70513:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;70513:46:0;;;;;;;;;;70575:41;;1159::1;;;70575::0;;1132:18:1;70575:41:0;1019:187:1;49170:390:0;79880:7;-1:-1:-1;;;;;49322:33:0;;;;49314:88;;;;-1:-1:-1;;;49314:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49421:22:0;;49413:62;;;;-1:-1:-1;;;49413:62:0;;34686:2:1;49413:62:0;;;34668:21:1;34725:2;34705:18;;;34698:30;34764:29;34744:18;;;34737:57;34811:18;;49413:62:0;34484:351:1;49413:62:0;49517:35;;;;;;;;-1:-1:-1;;;;;49517:35:0;;;;;-1:-1:-1;;;;;49517:35:0;;;;;;;;;;-1:-1:-1;49488:26:0;;;:17;:26;;;;;;:64;;;;;;;-1:-1:-1;;;49488:64:0;;;;;;49170:390::o;62084:974::-;-1:-1:-1;;;;;62272:16:0;;62264:66;;;;-1:-1:-1;;;62264:66:0;;;;;;;:::i;:::-;18729:10;62343:16;62408:21;62426:2;62408:17;:21::i;:::-;62385:44;;62440:24;62467:25;62485:6;62467:17;:25::i;:::-;62440:52;;62505:60;62526:8;62536:4;62542:2;62546:3;62551:7;62560:4;62505:20;:60::i;:::-;62578:19;62600:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;62600:19:0;;;;;;;;;;62638:21;;;;62630:76;;;;-1:-1:-1;;;62630:76:0;;;;;;;:::i;:::-;62742:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;62742:19:0;;;;;;;;;;62764:20;;;62742:42;;62806:17;;;;;;;:27;;62764:20;;62742:13;62806:27;;62764:20;;62806:27;:::i;:::-;;;;-1:-1:-1;;62851:46:0;;;35014:25:1;;;35070:2;35055:18;;35048:34;;;-1:-1:-1;;;;;62851:46:0;;;;;;;;;;;;;;34987:18:1;62851:46:0;;;;;;;62982:68;63013:8;63023:4;63029:2;63033;63037:6;63045:4;62982:30;:68::i;:::-;62253:805;;;;62084:974;;;;;:::o;39976:514::-;40065:22;40073:4;40079:7;40065;:22::i;:::-;40060:423;;40253:39;40284:7;40253:30;:39::i;:::-;40365:49;40404:4;40411:2;40365:30;:49::i;:::-;40158:279;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;40158:279:0;;;;;;;;;;-1:-1:-1;;;40104:367:0;;;;;;;:::i;85814:618::-;86059:72;86086:9;86097:5;86104:3;86109:4;86115:8;86125:5;86059:26;:72::i;:::-;-1:-1:-1;;;;;86148:19:0;;;86144:32;;86169:7;;86144:32;86209:9;86204:221;86224:4;:11;86220:1;:15;86204:221;;;86300:10;:19;86311:4;86316:1;86311:7;;;;;;;;:::i;:::-;;;;;;;86300:19;;;;;;;;;;;;86285:8;86294:1;86285:11;;;;;;;;:::i;:::-;;;;;;;86262:20;86274:4;86279:1;86274:7;;;;;;;;:::i;:::-;;;;;;;75895;75922:16;;;:12;:16;;;;;;;75833:113;86262:20;:34;;;;:::i;:::-;:57;;86254:95;;;;-1:-1:-1;;;86254:95:0;;36086:2:1;86254:95:0;;;36068:21:1;36125:2;36105:18;;;36098:30;36164:27;36144:18;;;36137:55;36209:18;;86254:95:0;35884:349:1;86254:95:0;86395:3;;86204:221;;73760:835;-1:-1:-1;;;;;74000:13:0;;4344:19;:23;73996:592;;74036:90;;-1:-1:-1;;;74036:90:0;;-1:-1:-1;;;;;74036:54:0;;;;;:90;;74091:8;;74101:4;;74107:3;;74112:7;;74121:4;;74036:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74036:90:0;;;;;;;;-1:-1:-1;;74036:90:0;;;;;;;;;;;;:::i;:::-;;;74032:545;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;74450:6;74443:14;;-1:-1:-1;;;74443:14:0;;;;;;;;:::i;74032:545::-;;;74499:62;;-1:-1:-1;;;74499:62:0;;38386:2:1;74499:62:0;;;38368:21:1;38425:2;38405:18;;;38398:30;38464:34;38444:18;;;38437:62;-1:-1:-1;;;38515:18:1;;;38508:50;38575:19;;74499:62:0;38184:416:1;74032:545:0;-1:-1:-1;;;;;;74208:71:0;;-1:-1:-1;;;74208:71:0;74204:170;;74304:50;;-1:-1:-1;;;74304:50:0;;;;;;;:::i;43861:238::-;43945:22;43953:4;43959:7;43945;:22::i;:::-;43940:152;;43984:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;43984:29:0;;;;;;;;;:36;;-1:-1:-1;;43984:36:0;44016:4;43984:36;;;44067:12;18729:10;;18649:98;44067:12;-1:-1:-1;;;;;44040:40:0;44058:7;-1:-1:-1;;;;;44040:40:0;44052:4;44040:40;;;;;;;;;;43861:238;;:::o;44279:239::-;44363:22;44371:4;44377:7;44363;:22::i;:::-;44359:152;;;44434:5;44402:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;44402:29:0;;;;;;;;;;:37;;-1:-1:-1;;44402:37:0;;;44459:40;18729:10;;44402:12;;44459:40;;44434:5;44459:40;44279:239;;:::o;84321:321::-;84419:19;84441:17;;;:7;:17;;;;;;;;;84494:24;;;;84471:47;;84550:22;;;;84529:18;;;:43;84609:25;;;;;;;;:::i;:::-;84585:21;;;;;:49;;-1:-1:-1;;;;;;84585:49:0;-1:-1:-1;;;;;84585:49:0;;;;;;;;;-1:-1:-1;;84321:321:0:o;90014:416::-;90110:7;90130:21;90172:13;90195:4;90202:5;90161:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;90130:79;;90222:19;90348:7;90331:25;;;;;;;;:::i;:::-;;;;-1:-1:-1;;90331:25:0;;;;;;;;;;90321:36;;90331:25;90321:36;;;;39928:66:1;90268:90:0;;;39916:79:1;;;;40011:12;;;40004:28;40048:12;;90268:90:0;;;;;;;;;;;;90244:125;;;;;;90222:147;;90389:33;90398:11;90411:10;;90389:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;90389:8:0;;-1:-1:-1;;;90389:33:0:i;:::-;90382:40;90014:416;-1:-1:-1;;;;;;90014:416:0:o;65880:729::-;-1:-1:-1;;;;;66033:16:0;;66025:62;;;;-1:-1:-1;;;66025:62:0;;;;;;;:::i;:::-;18729:10;66100:16;66165:21;66183:2;66165:17;:21::i;:::-;66142:44;;66197:24;66224:25;66242:6;66224:17;:25::i;:::-;66197:52;;66262:66;66283:8;66301:1;66305:2;66309:3;66314:7;66323:4;66262:20;:66::i;:::-;66341:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;66341:17:0;;;;;;;;;:27;;66362:6;;66341:13;:27;;66362:6;;66341:27;:::i;:::-;;;;-1:-1:-1;;66384:52:0;;;35014:25:1;;;35070:2;35055:18;;35048:34;;;-1:-1:-1;;;;;66384:52:0;;;;66417:1;;66384:52;;;;;;34987:18:1;66384:52:0;;;;;;;66527:74;66558:8;66576:1;66580:2;66584;66588:6;66596:4;66527:30;:74::i;67012:813::-;-1:-1:-1;;;;;67190:16:0;;67182:62;;;;-1:-1:-1;;;67182:62:0;;;;;;;:::i;:::-;67277:7;:14;67263:3;:10;:28;67255:81;;;;-1:-1:-1;;;67255:81:0;;;;;;;:::i;:::-;18729:10;67393:66;18729:10;67349:16;67436:2;67440:3;67445:7;67454:4;67393:20;:66::i;:::-;67477:9;67472:103;67496:3;:10;67492:1;:14;67472:103;;;67553:7;67561:1;67553:10;;;;;;;;:::i;:::-;;;;;;;67528:9;:17;67538:3;67542:1;67538:6;;;;;;;;:::i;:::-;;;;;;;67528:17;;;;;;;;;;;:21;67546:2;-1:-1:-1;;;;;67528:21:0;-1:-1:-1;;;;;67528:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;67508:3:0;;-1:-1:-1;67508:3:0;;;:::i;:::-;;;;67472:103;;;;67628:2;-1:-1:-1;;;;;67592:53:0;67624:1;-1:-1:-1;;;;;67592:53:0;67606:8;-1:-1:-1;;;;;67592:53:0;;67632:3;67637:7;67592:53;;;;;;;:::i;:::-;;;;;;;;67736:81;67772:8;67790:1;67794:2;67798:3;67803:7;67812:4;67736:35;:81::i;78170:218::-;78276:8;78271:110;78290:23;;;;-1:-1:-1;78271:110:0;;;78335:34;78346:5;78353:12;;78366:1;78353:15;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;78335:10;:34::i;:::-;78315:3;;;:::i;:::-;;;78271:110;;78396:220;78503:8;78498:111;78517:23;;;;-1:-1:-1;78498:111:0;;;78562:35;78574:5;78581:12;;78594:1;78581:15;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;78562:11;:35::i;:::-;78542:3;;;:::i;:::-;;;78498:111;;58034:112;16634:13;;;;;;;16626:69;;;;-1:-1:-1;;;16626:69:0;;;;;;;:::i;:::-;58125:13:::1;58133:4;58125:7;:13::i;74603:198::-:0;74723:16;;;74737:1;74723:16;;;;;;;;;74669;;74698:22;;74723:16;;;;;;;;;;;;-1:-1:-1;74723:16:0;74698:41;;74761:7;74750:5;74756:1;74750:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;74788:5;74603:198;-1:-1:-1;;74603:198:0:o;72986:766::-;-1:-1:-1;;;;;73201:13:0;;4344:19;:23;73197:548;;73237:83;;-1:-1:-1;;;73237:83:0;;-1:-1:-1;;;;;73237:49:0;;;;;:83;;73287:8;;73297:4;;73303:2;;73307:6;;73315:4;;73237:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73237:83:0;;;;;;;;-1:-1:-1;;73237:83:0;;;;;;;;;;;;:::i;:::-;;;73233:501;;;;:::i;:::-;-1:-1:-1;;;;;;73370:66:0;;-1:-1:-1;;;73370:66:0;73366:165;;73461:50;;-1:-1:-1;;;73461:50:0;;;;;;;:::i;36049:151::-;36107:13;36140:52;-1:-1:-1;;;;;36152:22:0;;34182:2;35445:447;35520:13;35546:19;35578:10;35582:6;35578:1;:10;:::i;:::-;:14;;35591:1;35578:14;:::i;:::-;-1:-1:-1;;;;;35568:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35568:25:0;;35546:47;;-1:-1:-1;;;35604:6:0;35611:1;35604:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;35604:15:0;;;;;;;;;-1:-1:-1;;;35630:6:0;35637:1;35630:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;35630:15:0;;;;;;;;-1:-1:-1;35661:9:0;35673:10;35677:6;35673:1;:10;:::i;:::-;:14;;35686:1;35673:14;:::i;:::-;35661:26;;35656:131;35693:1;35689;:5;35656:131;;;-1:-1:-1;;;35737:5:0;35745:3;35737:11;35728:21;;;;;;;:::i;:::-;;;;35716:6;35723:1;35716:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;35716:33:0;;;;;;;;-1:-1:-1;35774:1:0;35764:11;;;;;35696:3;;;:::i;:::-;;;35656:131;;;-1:-1:-1;35805:10:0;;35797:55;;;;-1:-1:-1;;;35797:55:0;;41584:2:1;35797:55:0;;;41566:21:1;;;41603:18;;;41596:30;41662:34;41642:18;;;41635:62;41714:18;;35797:55:0;41382:356:1;76252:931:0;-1:-1:-1;;;;;76574:18:0;;76570:160;;76614:9;76609:110;76633:3;:10;76629:1;:14;76609:110;;;76693:7;76701:1;76693:10;;;;;;;;:::i;:::-;;;;;;;76669:12;:20;76682:3;76686:1;76682:6;;;;;;;;:::i;:::-;;;;;;;76669:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;76645:3:0;;-1:-1:-1;76645:3:0;;:::i;:::-;;;76609:110;;;;76570:160;-1:-1:-1;;;;;76746:16:0;;76742:434;;76784:9;76779:386;76803:3;:10;76799:1;:14;76779:386;;;76839:10;76852:3;76856:1;76852:6;;;;;;;;:::i;:::-;;;;;;;76839:19;;76877:14;76894:7;76902:1;76894:10;;;;;;;;:::i;:::-;;;;;;;76877:27;;76923:14;76940:12;:16;76953:2;76940:16;;;;;;;;;;;;76923:33;;76993:6;76983;:16;;76975:69;;;;-1:-1:-1;;;76975:69:0;;41945:2:1;76975:69:0;;;41927:21:1;41984:2;41964:18;;;41957:30;42023:34;42003:18;;;41996:62;-1:-1:-1;;;42074:18:1;;;42067:38;42122:19;;76975:69:0;41743:404:1;76975:69:0;77096:16;;;;:12;:16;;;;;;77115:15;;77096:34;;76815:3;;;:::i;:::-;;;76779:386;;90438:492;90512:7;90532:9;90552;90572:7;90596:4;:11;90611:2;90596:17;90592:40;;90630:1;90615:17;;;;;;;90592:40;-1:-1:-1;;;90690:2:0;90680:13;;90674:20;90729:2;90719:13;;90713:20;90776:2;90766:13;;90760:20;90757:1;90752:29;90812:2;90808:6;;90804:19;;;90816:7;90821:2;90816:7;;:::i;:::-;;;90804:19;90840:1;:7;;90845:2;90840:7;;:18;;;;;90851:1;:7;;90856:2;90851:7;;90840:18;90836:41;;;90875:1;90860:17;;;;;;;90836:41;90897:25;;;;;;;;;;;;42588::1;;;42661:4;42649:17;;42629:18;;;42622:45;;;;42683:18;;;42676:34;;;42726:18;;;42719:34;;;90897:25:0;;42560:19:1;;90897:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;90897:25:0;;-1:-1:-1;;90897:25:0;;;90438:492;-1:-1:-1;;;;;;;90438:492:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:179::-;1278:20;;-1:-1:-1;;;;;1327:38:1;;1317:49;;1307:77;;1380:1;1377;1370:12;1395:258;1462:6;1470;1523:2;1511:9;1502:7;1498:23;1494:32;1491:52;;;1539:1;1536;1529:12;1491:52;1562:29;1581:9;1562:29;:::i;:::-;1552:39;;1610:37;1643:2;1632:9;1628:18;1610:37;:::i;:::-;1600:47;;1395:258;;;;;:::o;1658:180::-;1717:6;1770:2;1758:9;1749:7;1745:23;1741:32;1738:52;;;1786:1;1783;1776:12;1738:52;-1:-1:-1;1809:23:1;;1658:180;-1:-1:-1;1658:180:1:o;2193:258::-;2265:1;2275:113;2289:6;2286:1;2283:13;2275:113;;;2365:11;;;2359:18;2346:11;;;2339:39;2311:2;2304:10;2275:113;;;2406:6;2403:1;2400:13;2397:48;;;-1:-1:-1;;2441:1:1;2423:16;;2416:27;2193:258::o;2456:::-;2498:3;2536:5;2530:12;2563:6;2558:3;2551:19;2579:63;2635:6;2628:4;2623:3;2619:14;2612:4;2605:5;2601:16;2579:63;:::i;:::-;2696:2;2675:15;-1:-1:-1;;2671:29:1;2662:39;;;;2703:4;2658:50;;2456:258;-1:-1:-1;;2456:258:1:o;2719:220::-;2868:2;2857:9;2850:21;2831:4;2888:45;2929:2;2918:9;2914:18;2906:6;2888:45;:::i;2944:316::-;3021:6;3029;3037;3090:2;3078:9;3069:7;3065:23;3061:32;3058:52;;;3106:1;3103;3096:12;3058:52;-1:-1:-1;;3129:23:1;;;3199:2;3184:18;;3171:32;;-1:-1:-1;3250:2:1;3235:18;;;3222:32;;2944:316;-1:-1:-1;2944:316:1:o;3632:248::-;3700:6;3708;3761:2;3749:9;3740:7;3736:23;3732:32;3729:52;;;3777:1;3774;3767:12;3729:52;-1:-1:-1;;3800:23:1;;;3870:2;3855:18;;;3842:32;;-1:-1:-1;3632:248:1:o;4164:127::-;4225:10;4220:3;4216:20;4213:1;4206:31;4256:4;4253:1;4246:15;4280:4;4277:1;4270:15;4296:249;4406:2;4387:13;;-1:-1:-1;;4383:27:1;4371:40;;-1:-1:-1;;;;;4426:34:1;;4462:22;;;4423:62;4420:88;;;4488:18;;:::i;:::-;4524:2;4517:22;-1:-1:-1;;4296:249:1:o;4550:183::-;4610:4;-1:-1:-1;;;;;4635:6:1;4632:30;4629:56;;;4665:18;;:::i;:::-;-1:-1:-1;4710:1:1;4706:14;4722:4;4702:25;;4550:183::o;4738:724::-;4792:5;4845:3;4838:4;4830:6;4826:17;4822:27;4812:55;;4863:1;4860;4853:12;4812:55;4899:6;4886:20;4925:4;4948:43;4988:2;4948:43;:::i;:::-;5020:2;5014:9;5032:31;5060:2;5052:6;5032:31;:::i;:::-;5098:18;;;5190:1;5186:10;;;;5174:23;;5170:32;;;5132:15;;;;-1:-1:-1;5214:15:1;;;5211:35;;;5242:1;5239;5232:12;5211:35;5278:2;5270:6;5266:15;5290:142;5306:6;5301:3;5298:15;5290:142;;;5372:17;;5360:30;;5410:12;;;;5323;;5290:142;;;-1:-1:-1;5450:6:1;4738:724;-1:-1:-1;;;;;;4738:724:1:o;5467:555::-;5509:5;5562:3;5555:4;5547:6;5543:17;5539:27;5529:55;;5580:1;5577;5570:12;5529:55;5616:6;5603:20;-1:-1:-1;;;;;5638:2:1;5635:26;5632:52;;;5664:18;;:::i;:::-;5713:2;5707:9;5725:67;5780:2;5761:13;;-1:-1:-1;;5757:27:1;5786:4;5753:38;5707:9;5725:67;:::i;:::-;5816:2;5808:6;5801:18;5862:3;5855:4;5850:2;5842:6;5838:15;5834:26;5831:35;5828:55;;;5879:1;5876;5869:12;5828:55;5943:2;5936:4;5928:6;5924:17;5917:4;5909:6;5905:17;5892:54;5990:1;5966:15;;;5983:4;5962:26;5955:37;;;;5970:6;5467:555;-1:-1:-1;;;5467:555:1:o;6027:943::-;6181:6;6189;6197;6205;6213;6266:3;6254:9;6245:7;6241:23;6237:33;6234:53;;;6283:1;6280;6273:12;6234:53;6306:29;6325:9;6306:29;:::i;:::-;6296:39;;6354:38;6388:2;6377:9;6373:18;6354:38;:::i;:::-;6344:48;;6443:2;6432:9;6428:18;6415:32;-1:-1:-1;;;;;6507:2:1;6499:6;6496:14;6493:34;;;6523:1;6520;6513:12;6493:34;6546:61;6599:7;6590:6;6579:9;6575:22;6546:61;:::i;:::-;6536:71;;6660:2;6649:9;6645:18;6632:32;6616:48;;6689:2;6679:8;6676:16;6673:36;;;6705:1;6702;6695:12;6673:36;6728:63;6783:7;6772:8;6761:9;6757:24;6728:63;:::i;:::-;6718:73;;6844:3;6833:9;6829:19;6816:33;6800:49;;6874:2;6864:8;6861:16;6858:36;;;6890:1;6887;6880:12;6858:36;;6913:51;6956:7;6945:8;6934:9;6930:24;6913:51;:::i;:::-;6903:61;;;6027:943;;;;;;;;:::o;6975:254::-;7043:6;7051;7104:2;7092:9;7083:7;7079:23;7075:32;7072:52;;;7120:1;7117;7110:12;7072:52;7156:9;7143:23;7133:33;;7185:38;7219:2;7208:9;7204:18;7185:38;:::i;7234:389::-;7319:8;7329:6;7383:3;7376:4;7368:6;7364:17;7360:27;7350:55;;7401:1;7398;7391:12;7350:55;-1:-1:-1;7424:20:1;;-1:-1:-1;;;;;7456:30:1;;7453:50;;;7499:1;7496;7489:12;7453:50;7536:4;7528:6;7524:17;7512:29;;7596:3;7589:4;7579:6;7576:1;7572:14;7564:6;7560:27;7556:38;7553:47;7550:67;;;7613:1;7610;7603:12;7628:492;7747:6;7755;7808:2;7796:9;7787:7;7783:23;7779:32;7776:52;;;7824:1;7821;7814:12;7776:52;7864:9;7851:23;-1:-1:-1;;;;;7889:6:1;7886:30;7883:50;;;7929:1;7926;7919:12;7883:50;7968:92;8052:7;8043:6;8032:9;8028:22;7968:92;:::i;:::-;8079:8;;7942:118;;-1:-1:-1;7628:492:1;-1:-1:-1;;;;7628:492:1:o;8125:367::-;8188:8;8198:6;8252:3;8245:4;8237:6;8233:17;8229:27;8219:55;;8270:1;8267;8260:12;8219:55;-1:-1:-1;8293:20:1;;-1:-1:-1;;;;;8325:30:1;;8322:50;;;8368:1;8365;8358:12;8322:50;8405:4;8397:6;8393:17;8381:29;;8465:3;8458:4;8448:6;8445:1;8441:14;8433:6;8429:27;8425:38;8422:47;8419:67;;;8482:1;8479;8472:12;8497:347;8548:8;8558:6;8612:3;8605:4;8597:6;8593:17;8589:27;8579:55;;8630:1;8627;8620:12;8579:55;-1:-1:-1;8653:20:1;;-1:-1:-1;;;;;8685:30:1;;8682:50;;;8728:1;8725;8718:12;8682:50;8765:4;8757:6;8753:17;8741:29;;8817:3;8810:4;8801:6;8793;8789:19;8785:30;8782:39;8779:59;;;8834:1;8831;8824:12;8849:1492;9029:6;9037;9045;9053;9061;9069;9077;9085;9093;9101;9154:3;9142:9;9133:7;9129:23;9125:33;9122:53;;;9171:1;9168;9161:12;9122:53;9207:9;9194:23;9184:33;;9236:38;9270:2;9259:9;9255:18;9236:38;:::i;:::-;9226:48;;9325:2;9314:9;9310:18;9297:32;-1:-1:-1;;;;;9389:2:1;9381:6;9378:14;9375:34;;;9405:1;9402;9395:12;9375:34;9444:70;9506:7;9497:6;9486:9;9482:22;9444:70;:::i;:::-;9533:8;;-1:-1:-1;9418:96:1;-1:-1:-1;9621:2:1;9606:18;;9593:32;;-1:-1:-1;9637:16:1;;;9634:36;;;9666:1;9663;9656:12;9634:36;9705:72;9769:7;9758:8;9747:9;9743:24;9705:72;:::i;:::-;9796:8;;-1:-1:-1;9679:98:1;-1:-1:-1;9884:3:1;9869:19;;9856:33;;-1:-1:-1;9901:16:1;;;9898:36;;;9930:1;9927;9920:12;9898:36;9969:60;10021:7;10010:8;9999:9;9995:24;9969:60;:::i;:::-;10048:8;;-1:-1:-1;9943:86:1;-1:-1:-1;10136:3:1;10121:19;;10108:33;;-1:-1:-1;10153:16:1;;;10150:36;;;10182:1;10179;10172:12;10150:36;;10221:60;10273:7;10262:8;10251:9;10247:24;10221:60;:::i;:::-;10195:86;;10300:8;10290:18;;;10327:8;10317:18;;;8849:1492;;;;;;;;;;;;;:::o;10346:1208::-;10464:6;10472;10525:2;10513:9;10504:7;10500:23;10496:32;10493:52;;;10541:1;10538;10531:12;10493:52;10581:9;10568:23;-1:-1:-1;;;;;10651:2:1;10643:6;10640:14;10637:34;;;10667:1;10664;10657:12;10637:34;10705:6;10694:9;10690:22;10680:32;;10750:7;10743:4;10739:2;10735:13;10731:27;10721:55;;10772:1;10769;10762:12;10721:55;10808:2;10795:16;10830:4;10853:43;10893:2;10853:43;:::i;:::-;10925:2;10919:9;10937:31;10965:2;10957:6;10937:31;:::i;:::-;11003:18;;;11091:1;11087:10;;;;11079:19;;11075:28;;;11037:15;;;;-1:-1:-1;11115:19:1;;;11112:39;;;11147:1;11144;11137:12;11112:39;11171:11;;;;11191:148;11207:6;11202:3;11199:15;11191:148;;;11273:23;11292:3;11273:23;:::i;:::-;11261:36;;11224:12;;;;11317;;;;11191:148;;;11358:6;-1:-1:-1;;11402:18:1;;11389:32;;-1:-1:-1;;11433:16:1;;;11430:36;;;11462:1;11459;11452:12;11430:36;;11485:63;11540:7;11529:8;11518:9;11514:24;11485:63;:::i;:::-;11475:73;;;10346:1208;;;;;:::o;11559:435::-;11612:3;11650:5;11644:12;11677:6;11672:3;11665:19;11703:4;11732:2;11727:3;11723:12;11716:19;;11769:2;11762:5;11758:14;11790:1;11800:169;11814:6;11811:1;11808:13;11800:169;;;11875:13;;11863:26;;11909:12;;;;11944:15;;;;11836:1;11829:9;11800:169;;;-1:-1:-1;11985:3:1;;11559:435;-1:-1:-1;;;;;11559:435:1:o;11999:261::-;12178:2;12167:9;12160:21;12141:4;12198:56;12250:2;12239:9;12235:18;12227:6;12198:56;:::i;12524:841::-;12655:6;12663;12671;12679;12687;12740:2;12728:9;12719:7;12715:23;12711:32;12708:52;;;12756:1;12753;12746:12;12708:52;12792:9;12779:23;12769:33;;12853:2;12842:9;12838:18;12825:32;-1:-1:-1;;;;;12917:2:1;12909:6;12906:14;12903:34;;;12933:1;12930;12923:12;12903:34;12972:70;13034:7;13025:6;13014:9;13010:22;12972:70;:::i;:::-;13061:8;;-1:-1:-1;12946:96:1;-1:-1:-1;13149:2:1;13134:18;;13121:32;;-1:-1:-1;13165:16:1;;;13162:36;;;13194:1;13191;13184:12;13162:36;;13233:72;13297:7;13286:8;13275:9;13271:24;13233:72;:::i;:::-;12524:841;;;;-1:-1:-1;12524:841:1;;-1:-1:-1;13324:8:1;;13207:98;12524:841;-1:-1:-1;;;12524:841:1:o;13370:387::-;13453:8;13463:6;13517:3;13510:4;13502:6;13498:17;13494:27;13484:55;;13535:1;13532;13525:12;13484:55;-1:-1:-1;13558:20:1;;-1:-1:-1;;;;;13590:30:1;;13587:50;;;13633:1;13630;13623:12;13587:50;13670:4;13662:6;13658:17;13646:29;;13730:3;13723:4;13713:6;13710:1;13706:14;13698:6;13694:27;13690:38;13687:47;13684:67;;;13747:1;13744;13737:12;13762:1668;14060:6;14068;14076;14084;14092;14100;14108;14116;14124;14132;14185:3;14173:9;14164:7;14160:23;14156:33;14153:53;;;14202:1;14199;14192:12;14153:53;14242:9;14229:23;-1:-1:-1;;;;;14312:2:1;14304:6;14301:14;14298:34;;;14328:1;14325;14318:12;14298:34;14351:49;14392:7;14383:6;14372:9;14368:22;14351:49;:::i;:::-;14341:59;;14419:38;14453:2;14442:9;14438:18;14419:38;:::i;:::-;14409:48;;14476:38;14510:2;14499:9;14495:18;14476:38;:::i;:::-;14466:48;;14533:37;14566:2;14555:9;14551:18;14533:37;:::i;:::-;14523:47;;14623:3;14612:9;14608:19;14595:33;14579:49;;14653:2;14643:8;14640:16;14637:36;;;14669:1;14666;14659:12;14637:36;14708:92;14792:7;14781:8;14770:9;14766:24;14708:92;:::i;:::-;14819:8;;-1:-1:-1;14682:118:1;-1:-1:-1;14907:3:1;14892:19;;14879:33;;-1:-1:-1;14924:16:1;;;14921:36;;;14953:1;14950;14943:12;14921:36;14992:92;15076:7;15065:8;15054:9;15050:24;14992:92;:::i;:::-;15103:8;;-1:-1:-1;14966:118:1;-1:-1:-1;15191:3:1;15176:19;;15163:33;;-1:-1:-1;15208:16:1;;;15205:36;;;15237:1;15234;15227:12;15205:36;;15276:94;15362:7;15351:8;15340:9;15336:24;15276:94;:::i;15435:511::-;15530:6;15538;15546;15599:2;15587:9;15578:7;15574:23;15570:32;15567:52;;;15615:1;15612;15605:12;15567:52;15638:29;15657:9;15638:29;:::i;:::-;15628:39;;15718:2;15707:9;15703:18;15690:32;-1:-1:-1;;;;;15737:6:1;15734:30;15731:50;;;15777:1;15774;15767:12;15731:50;15816:70;15878:7;15869:6;15858:9;15854:22;15816:70;:::i;:::-;15435:511;;15905:8;;-1:-1:-1;15790:96:1;;-1:-1:-1;;;;15435:511:1:o;15951:488::-;16068:6;16076;16129:2;16117:9;16108:7;16104:23;16100:32;16097:52;;;16145:1;16142;16135:12;16097:52;16185:9;16172:23;-1:-1:-1;;;;;16210:6:1;16207:30;16204:50;;;16250:1;16247;16240:12;16204:50;16289:90;16371:7;16362:6;16351:9;16347:22;16289:90;:::i;16444:321::-;16513:6;16566:2;16554:9;16545:7;16541:23;16537:32;16534:52;;;16582:1;16579;16572:12;16534:52;16622:9;16609:23;-1:-1:-1;;;;;16647:6:1;16644:30;16641:50;;;16687:1;16684;16677:12;16641:50;16710:49;16751:7;16742:6;16731:9;16727:22;16710:49;:::i;:::-;16700:59;16444:321;-1:-1:-1;;;;16444:321:1:o;16770:347::-;16835:6;16843;16896:2;16884:9;16875:7;16871:23;16867:32;16864:52;;;16912:1;16909;16902:12;16864:52;16935:29;16954:9;16935:29;:::i;:::-;16925:39;;17014:2;17003:9;16999:18;16986:32;17061:5;17054:13;17047:21;17040:5;17037:32;17027:60;;17083:1;17080;17073:12;17027:60;17106:5;17096:15;;;16770:347;;;;;:::o;17122:650::-;17240:6;17248;17301:2;17289:9;17280:7;17276:23;17272:32;17269:52;;;17317:1;17314;17307:12;17269:52;17357:9;17344:23;-1:-1:-1;;;;;17427:2:1;17419:6;17416:14;17413:34;;;17443:1;17440;17433:12;17413:34;17481:6;17470:9;17466:22;17456:32;;17526:7;17519:4;17515:2;17511:13;17507:27;17497:55;;17548:1;17545;17538:12;17497:55;17588:2;17575:16;17614:2;17606:6;17603:14;17600:34;;;17630:1;17627;17620:12;17600:34;17686:7;17681:2;17673:4;17665:6;17661:17;17657:2;17653:26;17649:35;17646:48;17643:68;;;17707:1;17704;17697:12;17643:68;17738:2;17730:11;;;;;17760:6;;-1:-1:-1;17122:650:1;;-1:-1:-1;;;;17122:650:1:o;17777:260::-;17845:6;17853;17906:2;17894:9;17885:7;17881:23;17877:32;17874:52;;;17922:1;17919;17912:12;17874:52;17945:29;17964:9;17945:29;:::i;:::-;17935:39;;17993:38;18027:2;18016:9;18012:18;17993:38;:::i;18042:606::-;18146:6;18154;18162;18170;18178;18231:3;18219:9;18210:7;18206:23;18202:33;18199:53;;;18248:1;18245;18238:12;18199:53;18271:29;18290:9;18271:29;:::i;:::-;18261:39;;18319:38;18353:2;18342:9;18338:18;18319:38;:::i;:::-;18309:48;;18404:2;18393:9;18389:18;18376:32;18366:42;;18455:2;18444:9;18440:18;18427:32;18417:42;;18510:3;18499:9;18495:19;18482:33;-1:-1:-1;;;;;18530:6:1;18527:30;18524:50;;;18570:1;18567;18560:12;18524:50;18593:49;18634:7;18625:6;18614:9;18610:22;18593:49;:::i;19277:380::-;19356:1;19352:12;;;;19399;;;19420:61;;19474:4;19466:6;19462:17;19452:27;;19420:61;19527:2;19519:6;19516:14;19496:18;19493:38;19490:161;;;19573:10;19568:3;19564:20;19561:1;19554:31;19608:4;19605:1;19598:15;19636:4;19633:1;19626:15;19490:161;;19277:380;;;:::o;19662:127::-;19723:10;19718:3;19714:20;19711:1;19704:31;19754:4;19751:1;19744:15;19778:4;19775:1;19768:15;19794:168;19834:7;19900:1;19896;19892:6;19888:14;19885:1;19882:21;19877:1;19870:9;19863:17;19859:45;19856:71;;;19907:18;;:::i;:::-;-1:-1:-1;19947:9:1;;19794:168::o;19967:217::-;20007:1;20033;20023:132;;20077:10;20072:3;20068:20;20065:1;20058:31;20112:4;20109:1;20102:15;20140:4;20137:1;20130:15;20023:132;-1:-1:-1;20169:9:1;;19967:217::o;20189:410::-;20391:2;20373:21;;;20430:2;20410:18;;;20403:30;20469:34;20464:2;20449:18;;20442:62;-1:-1:-1;;;20535:2:1;20520:18;;20513:44;20589:3;20574:19;;20189:410::o;22475:354::-;22563:19;;;22545:3;-1:-1:-1;;;;;22594:31:1;;22591:51;;;22638:1;22635;22628:12;22591:51;22674:6;22671:1;22667:14;22726:8;22719:5;22712:4;22707:3;22703:14;22690:45;22803:1;22758:18;;22778:4;22754:29;22792:13;;;-1:-1:-1;22754:29:1;;22475:354;-1:-1:-1;;22475:354:1:o;22834:1012::-;23205:25;;;-1:-1:-1;;;;;23266:32:1;;23261:2;23246:18;;23239:60;23286:3;23330:2;23315:18;;23308:31;;;-1:-1:-1;;23362:74:1;;23416:19;;23408:6;23400;23362:74;:::i;:::-;23484:9;23476:6;23472:22;23467:2;23456:9;23452:18;23445:50;23518:61;23572:6;23564;23556;23518:61;:::i;:::-;23504:75;;23628:9;23620:6;23616:22;23610:3;23599:9;23595:19;23588:51;23663:6;23655;23648:22;23717:6;23709;23704:2;23696:6;23692:15;23679:45;23770:1;23765:2;23756:6;23748;23744:19;23740:28;23733:39;23837:2;23830;23826:7;23821:2;23813:6;23809:15;23805:29;23797:6;23793:42;23789:51;23781:59;;;22834:1012;;;;;;;;;;;:::o;23851:127::-;23912:10;23907:3;23903:20;23900:1;23893:31;23943:4;23940:1;23933:15;23967:4;23964:1;23957:15;24745:135;24784:3;-1:-1:-1;;24805:17:1;;24802:43;;;24825:18;;:::i;:::-;-1:-1:-1;24872:1:1;24861:13;;24745:135::o;27121:186::-;27180:6;27233:2;27221:9;27212:7;27208:23;27204:32;27201:52;;;27249:1;27246;27239:12;27201:52;27272:29;27291:9;27272:29;:::i;27312:184::-;27370:6;27423:2;27411:9;27402:7;27398:23;27394:32;27391:52;;;27439:1;27436;27429:12;27391:52;27462:28;27480:9;27462:28;:::i;28213:912::-;28456:2;28508:21;;;28481:18;;;28564:22;;;28427:4;;28605:2;28623:18;;;28664:6;28427:4;28698:401;28712:6;28709:1;28706:13;28698:401;;;28773:20;;28761:33;;-1:-1:-1;;;;;28832:35:1;28851:15;;;28832:35;:::i;:::-;28828:61;28823:2;28818:3;28814:12;28807:83;-1:-1:-1;;;;;28928:34:1;28958:2;28950:6;28946:15;28928:34;:::i;:::-;28924:67;28910:12;;;28903:89;29015:4;29039:12;;;;29074:15;;;;;28734:1;28727:9;28698:401;;;-1:-1:-1;29116:3:1;;28213:912;-1:-1:-1;;;;;;;28213:912:1:o;29130:406::-;29332:2;29314:21;;;29371:2;29351:18;;;29344:30;29410:34;29405:2;29390:18;;29383:62;-1:-1:-1;;;29476:2:1;29461:18;;29454:40;29526:3;29511:19;;29130:406::o;30255:404::-;30457:2;30439:21;;;30496:2;30476:18;;;30469:30;30535:34;30530:2;30515:18;;30508:62;-1:-1:-1;;;30601:2:1;30586:18;;30579:38;30649:3;30634:19;;30255:404::o;30664:401::-;30866:2;30848:21;;;30905:2;30885:18;;;30878:30;30944:34;30939:2;30924:18;;30917:62;-1:-1:-1;;;31010:2:1;30995:18;;30988:35;31055:3;31040:19;;30664:401::o;31070:406::-;31272:2;31254:21;;;31311:2;31291:18;;;31284:30;31350:34;31345:2;31330:18;;31323:62;-1:-1:-1;;;31416:2:1;31401:18;;31394:40;31466:3;31451:19;;31070:406::o;31481:128::-;31521:3;31552:1;31548:6;31545:1;31542:13;31539:39;;;31558:18;;:::i;:::-;-1:-1:-1;31594:9:1;;31481:128::o;31614:465::-;31871:2;31860:9;31853:21;31834:4;31897:56;31949:2;31938:9;31934:18;31926:6;31897:56;:::i;:::-;32001:9;31993:6;31989:22;31984:2;31973:9;31969:18;31962:50;32029:44;32066:6;32058;32029:44;:::i;33662:407::-;33864:2;33846:21;;;33903:2;33883:18;;;33876:30;33942:34;33937:2;33922:18;;33915:62;-1:-1:-1;;;34008:2:1;33993:18;;33986:41;34059:3;34044:19;;33662:407::o;35093:786::-;35504:25;35499:3;35492:38;35474:3;35559:6;35553:13;35575:62;35630:6;35625:2;35620:3;35616:12;35609:4;35601:6;35597:17;35575:62;:::i;:::-;-1:-1:-1;;;35696:2:1;35656:16;;;35688:11;;;35681:40;35746:13;;35768:63;35746:13;35817:2;35809:11;;35802:4;35790:17;;35768:63;:::i;:::-;35851:17;35870:2;35847:26;;35093:786;-1:-1:-1;;;;35093:786:1:o;36238:827::-;-1:-1:-1;;;;;36635:15:1;;;36617:34;;36687:15;;36682:2;36667:18;;36660:43;36597:3;36734:2;36719:18;;36712:31;;;36560:4;;36766:57;;36803:19;;36795:6;36766:57;:::i;:::-;36871:9;36863:6;36859:22;36854:2;36843:9;36839:18;36832:50;36905:44;36942:6;36934;36905:44;:::i;:::-;36891:58;;36998:9;36990:6;36986:22;36980:3;36969:9;36965:19;36958:51;37026:33;37052:6;37044;37026:33;:::i;:::-;37018:41;36238:827;-1:-1:-1;;;;;;;;36238:827:1:o;37070:249::-;37139:6;37192:2;37180:9;37171:7;37167:23;37163:32;37160:52;;;37208:1;37205;37198:12;37160:52;37240:9;37234:16;37259:30;37283:5;37259:30;:::i;37324:179::-;37359:3;37401:1;37383:16;37380:23;37377:120;;;37447:1;37444;37441;37426:23;-1:-1:-1;37484:1:1;37478:8;37473:3;37469:18;37377:120;37324:179;:::o;37508:671::-;37547:3;37589:4;37571:16;37568:26;37565:39;;;37508:671;:::o;37565:39::-;37631:2;37625:9;-1:-1:-1;;37696:16:1;37692:25;;37689:1;37625:9;37668:50;37747:4;37741:11;37771:16;-1:-1:-1;;;;;37877:2:1;37870:4;37862:6;37858:17;37855:25;37850:2;37842:6;37839:14;37836:45;37833:58;;;37884:5;;;;;37508:671;:::o;37833:58::-;37921:6;37915:4;37911:17;37900:28;;37957:3;37951:10;37984:2;37976:6;37973:14;37970:27;;;37990:5;;;;;;37508:671;:::o;37970:27::-;38074:2;38055:16;38049:4;38045:27;38041:36;38034:4;38025:6;38020:3;38016:16;38012:27;38009:69;38006:82;;;38081:5;;;;;;37508:671;:::o;38006:82::-;38097:57;38148:4;38139:6;38131;38127:19;38123:30;38117:4;38097:57;:::i;:::-;-1:-1:-1;38170:3:1;;37508:671;-1:-1:-1;;;;;37508:671:1:o;38605:404::-;38807:2;38789:21;;;38846:2;38826:18;;;38819:30;38885:34;38880:2;38865:18;;38858:62;-1:-1:-1;;;38951:2:1;38936:18;;38929:38;38999:3;38984:19;;38605:404::o;39014:386::-;39199:25;;;-1:-1:-1;;;;;39260:32:1;;39255:2;39240:18;;39233:60;39329:2;39324;39309:18;;39302:30;;;-1:-1:-1;;39349:45:1;;39375:18;;39367:6;39349:45;:::i;39405:276::-;39536:3;39574:6;39568:13;39590:53;39636:6;39631:3;39624:4;39616:6;39612:17;39590:53;:::i;:::-;39659:16;;;;;39405:276;-1:-1:-1;;39405:276:1:o;40071:397::-;40273:2;40255:21;;;40312:2;40292:18;;;40285:30;40351:34;40346:2;40331:18;;40324:62;-1:-1:-1;;;40417:2:1;40402:18;;40395:31;40458:3;40443:19;;40071:397::o;40473:197::-;40511:3;40539:6;40580:2;40573:5;40569:14;40607:2;40598:7;40595:15;40592:41;;;40613:18;;:::i;:::-;40662:1;40649:15;;40473:197;-1:-1:-1;;;40473:197:1:o;40675:561::-;-1:-1:-1;;;;;40972:15:1;;;40954:34;;41024:15;;41019:2;41004:18;;40997:43;41071:2;41056:18;;41049:34;;;41114:2;41099:18;;41092:34;;;40934:3;41157;41142:19;;41135:32;;;40897:4;;41184:46;;41210:19;;41202:6;41184:46;:::i;:::-;41176:54;40675:561;-1:-1:-1;;;;;;;40675:561:1:o;41241:136::-;41280:3;41308:5;41298:39;;41317:18;;:::i;:::-;-1:-1:-1;;;41353:18:1;;41241:136::o;42152:204::-;42190:3;42226:4;42223:1;42219:12;42258:4;42255:1;42251:12;42293:3;42287:4;42283:14;42278:3;42275:23;42272:49;;;42301:18;;:::i;:::-;42337:13;;42152:204;-1:-1:-1;;;42152:204:1:o
Swarm Source
ipfs://130bf7ce579dbc015887797275e54cae7eb777d44abfc54c9b92d6bc1e221efb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.